@mono-agent/agent-app 0.20.11 → 0.21.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 +260 -98
- package/dist/adapter-send-tools.d.ts +3 -2
- package/dist/adapter-send-tools.d.ts.map +1 -1
- package/dist/adapter-send-tools.js +15 -5
- package/dist/adapter-send-tools.js.map +1 -1
- package/dist/app-controller-channels.d.ts +6 -0
- package/dist/app-controller-channels.d.ts.map +1 -1
- package/dist/app-controller-channels.js +29 -2
- package/dist/app-controller-channels.js.map +1 -1
- package/dist/app-controller-continuation.d.ts.map +1 -1
- package/dist/app-controller-continuation.js +2 -3
- package/dist/app-controller-continuation.js.map +1 -1
- package/dist/app-controller-lifecycle.d.ts +4 -0
- package/dist/app-controller-lifecycle.d.ts.map +1 -1
- package/dist/app-controller-lifecycle.js +7 -0
- package/dist/app-controller-lifecycle.js.map +1 -1
- package/dist/app-controller-maintenance.d.ts +3 -1
- package/dist/app-controller-maintenance.d.ts.map +1 -1
- package/dist/app-controller-maintenance.js +3 -0
- package/dist/app-controller-maintenance.js.map +1 -1
- package/dist/app-controller-monitors.d.ts +26 -0
- package/dist/app-controller-monitors.d.ts.map +1 -0
- package/dist/app-controller-monitors.js +127 -0
- package/dist/app-controller-monitors.js.map +1 -0
- package/dist/app-controller-responder.d.ts +9 -17
- package/dist/app-controller-responder.d.ts.map +1 -1
- package/dist/app-controller-responder.js +54 -86
- package/dist/app-controller-responder.js.map +1 -1
- package/dist/app-controller-traceability.d.ts.map +1 -1
- package/dist/app-controller-traceability.js +3 -0
- package/dist/app-controller-traceability.js.map +1 -1
- package/dist/app-controller-types.d.ts +1 -0
- package/dist/app-controller-types.d.ts.map +1 -1
- package/dist/app-controller-utils.d.ts +1 -5
- package/dist/app-controller-utils.d.ts.map +1 -1
- package/dist/app-controller-utils.js +4 -21
- package/dist/app-controller-utils.js.map +1 -1
- package/dist/app-controller.d.ts +26 -10
- package/dist/app-controller.d.ts.map +1 -1
- package/dist/app-controller.js +39 -1
- package/dist/app-controller.js.map +1 -1
- package/dist/artifact-retention.js +11 -0
- package/dist/artifact-retention.js.map +1 -1
- package/dist/background.d.ts +0 -6
- package/dist/background.d.ts.map +1 -1
- package/dist/background.js +5 -58
- package/dist/background.js.map +1 -1
- package/dist/channel-drivers/slack.d.ts.map +1 -1
- package/dist/channel-drivers/slack.js +18 -0
- package/dist/channel-drivers/slack.js.map +1 -1
- package/dist/channel-drivers/telegram.d.ts.map +1 -1
- package/dist/channel-drivers/telegram.js +26 -0
- package/dist/channel-drivers/telegram.js.map +1 -1
- package/dist/channel-drivers/tui.d.ts +68 -8
- package/dist/channel-drivers/tui.d.ts.map +1 -1
- package/dist/channel-drivers/tui.js +407 -89
- package/dist/channel-drivers/tui.js.map +1 -1
- package/dist/channel-runtime-controls.d.ts +2 -1
- package/dist/channel-runtime-controls.d.ts.map +1 -1
- package/dist/channel-runtime-controls.js +79 -22
- package/dist/channel-runtime-controls.js.map +1 -1
- package/dist/cli-args.d.ts +5 -8
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +33 -52
- package/dist/cli-args.js.map +1 -1
- package/dist/cli-background-command.d.ts.map +1 -1
- package/dist/cli-background-command.js +4 -0
- package/dist/cli-background-command.js.map +1 -1
- package/dist/cli-commands.d.ts.map +1 -1
- package/dist/cli-commands.js +24 -2
- package/dist/cli-commands.js.map +1 -1
- package/dist/cli-help.d.ts +26 -0
- package/dist/cli-help.d.ts.map +1 -1
- package/dist/cli-help.js +58 -53
- package/dist/cli-help.js.map +1 -1
- package/dist/cli-init-command.d.ts +1 -2
- package/dist/cli-init-command.d.ts.map +1 -1
- package/dist/cli-init-command.js +31 -71
- package/dist/cli-init-command.js.map +1 -1
- package/dist/cli-install-skill-command.d.ts.map +1 -1
- package/dist/cli-install-skill-command.js +12 -3
- package/dist/cli-install-skill-command.js.map +1 -1
- package/dist/config-reference.d.ts +1 -0
- package/dist/config-reference.d.ts.map +1 -1
- package/dist/config-reference.js +217 -60
- package/dist/config-reference.js.map +1 -1
- package/dist/configured-agent.d.ts +27 -4
- package/dist/configured-agent.d.ts.map +1 -1
- package/dist/configured-agent.js +159 -112
- package/dist/configured-agent.js.map +1 -1
- package/dist/conversation-title.d.ts.map +1 -1
- package/dist/conversation-title.js +9 -2
- package/dist/conversation-title.js.map +1 -1
- package/dist/cron-control-store.d.ts.map +1 -1
- package/dist/cron-control-store.js +4 -2
- package/dist/cron-control-store.js.map +1 -1
- package/dist/doctor.d.ts +7 -13
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +406 -770
- package/dist/doctor.js.map +1 -1
- package/dist/first-run-readiness.d.ts.map +1 -1
- package/dist/first-run-readiness.js +0 -6
- package/dist/first-run-readiness.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/interaction-bridge.d.ts +3 -3
- package/dist/interaction-bridge.d.ts.map +1 -1
- package/dist/interaction-bridge.js +27 -10
- package/dist/interaction-bridge.js.map +1 -1
- package/dist/launchd.d.ts +2 -0
- package/dist/launchd.d.ts.map +1 -1
- package/dist/launchd.js +3 -0
- package/dist/launchd.js.map +1 -1
- package/dist/local-tui-session.d.ts +14 -0
- package/dist/local-tui-session.d.ts.map +1 -0
- package/dist/local-tui-session.js +100 -0
- package/dist/local-tui-session.js.map +1 -0
- package/dist/mcp-apps.d.ts.map +1 -1
- package/dist/mcp-apps.js +3 -0
- package/dist/mcp-apps.js.map +1 -1
- package/dist/memory-journal.d.ts +53 -0
- package/dist/memory-journal.d.ts.map +1 -0
- package/dist/memory-journal.js +586 -0
- package/dist/memory-journal.js.map +1 -0
- package/dist/memory-recall.d.ts.map +1 -1
- package/dist/memory-recall.js +16 -2
- package/dist/memory-recall.js.map +1 -1
- package/dist/memory-remember.d.ts +49 -0
- package/dist/memory-remember.d.ts.map +1 -0
- package/dist/memory-remember.js +190 -0
- package/dist/memory-remember.js.map +1 -0
- package/dist/memory-retrieval.d.ts +33 -0
- package/dist/memory-retrieval.d.ts.map +1 -1
- package/dist/memory-retrieval.js +43 -0
- package/dist/memory-retrieval.js.map +1 -1
- package/dist/model-effort-capabilities.d.ts +8 -9
- package/dist/model-effort-capabilities.d.ts.map +1 -1
- package/dist/model-effort-capabilities.js +17 -35
- package/dist/model-effort-capabilities.js.map +1 -1
- package/dist/modules/base.d.ts +3 -4
- package/dist/modules/base.d.ts.map +1 -1
- package/dist/modules/base.js +4 -6
- package/dist/modules/base.js.map +1 -1
- package/dist/modules/catalog.d.ts.map +1 -1
- package/dist/modules/catalog.js +11 -9
- package/dist/modules/catalog.js.map +1 -1
- package/dist/modules/known-tools.d.ts +2 -2
- package/dist/modules/known-tools.d.ts.map +1 -1
- package/dist/modules/known-tools.js +7 -0
- package/dist/modules/known-tools.js.map +1 -1
- package/dist/monitor-channel-routing.d.ts +20 -0
- package/dist/monitor-channel-routing.d.ts.map +1 -0
- package/dist/monitor-channel-routing.js +73 -0
- package/dist/monitor-channel-routing.js.map +1 -0
- package/dist/monitors-command.d.ts +23 -0
- package/dist/monitors-command.d.ts.map +1 -0
- package/dist/monitors-command.js +217 -0
- package/dist/monitors-command.js.map +1 -0
- package/dist/monitors-config.d.ts +77 -0
- package/dist/monitors-config.d.ts.map +1 -0
- package/dist/monitors-config.js +150 -0
- package/dist/monitors-config.js.map +1 -0
- package/dist/monitors-context.d.ts +58 -0
- package/dist/monitors-context.d.ts.map +1 -0
- package/dist/monitors-context.js +194 -0
- package/dist/monitors-context.js.map +1 -0
- package/dist/monitors-runtime.d.ts +36 -0
- package/dist/monitors-runtime.d.ts.map +1 -0
- package/dist/monitors-runtime.js +103 -0
- package/dist/monitors-runtime.js.map +1 -0
- package/dist/monitors-service.d.ts +71 -0
- package/dist/monitors-service.d.ts.map +1 -0
- package/dist/monitors-service.js +1796 -0
- package/dist/monitors-service.js.map +1 -0
- package/dist/monitors-store.d.ts +93 -0
- package/dist/monitors-store.d.ts.map +1 -0
- package/dist/monitors-store.js +313 -0
- package/dist/monitors-store.js.map +1 -0
- package/dist/notify-destinations.d.ts +3 -2
- package/dist/notify-destinations.d.ts.map +1 -1
- package/dist/notify-destinations.js +6 -7
- package/dist/notify-destinations.js.map +1 -1
- package/dist/posted-reply-history.d.ts.map +1 -1
- package/dist/posted-reply-history.js +40 -3
- package/dist/posted-reply-history.js.map +1 -1
- package/dist/proactive-notify.d.ts +20 -1
- package/dist/proactive-notify.d.ts.map +1 -1
- package/dist/proactive-notify.js +56 -3
- package/dist/proactive-notify.js.map +1 -1
- package/dist/process-job-channel-routing.js +2 -1
- package/dist/process-job-channel-routing.js.map +1 -1
- package/dist/process-job-output-tail.d.ts +53 -0
- package/dist/process-job-output-tail.d.ts.map +1 -0
- package/dist/process-job-output-tail.js +257 -0
- package/dist/process-job-output-tail.js.map +1 -0
- package/dist/process-jobs-config.d.ts +1 -1
- package/dist/process-jobs-config.js +1 -1
- package/dist/process-jobs-config.js.map +1 -1
- package/dist/process-jobs-context.d.ts +11 -1
- package/dist/process-jobs-context.d.ts.map +1 -1
- package/dist/process-jobs-context.js +55 -11
- package/dist/process-jobs-context.js.map +1 -1
- package/dist/process-jobs-protection.js +1 -1
- package/dist/process-jobs-protection.js.map +1 -1
- package/dist/process-jobs-runtime.d.ts.map +1 -1
- package/dist/process-jobs-runtime.js +15 -12
- package/dist/process-jobs-runtime.js.map +1 -1
- package/dist/process-jobs-service.d.ts.map +1 -1
- package/dist/process-jobs-service.js +118 -172
- package/dist/process-jobs-service.js.map +1 -1
- package/dist/process-jobs-store.d.ts +3 -1
- package/dist/process-jobs-store.d.ts.map +1 -1
- package/dist/process-jobs-store.js +4 -1
- package/dist/process-jobs-store.js.map +1 -1
- package/dist/process-output-redaction.d.ts +58 -0
- package/dist/process-output-redaction.d.ts.map +1 -0
- package/dist/process-output-redaction.js +311 -0
- package/dist/process-output-redaction.js.map +1 -0
- package/dist/project-skills.d.ts +11 -5
- package/dist/project-skills.d.ts.map +1 -1
- package/dist/project-skills.js +88 -39
- package/dist/project-skills.js.map +1 -1
- package/dist/provider-auth-checks.d.ts +27 -0
- package/dist/provider-auth-checks.d.ts.map +1 -0
- package/dist/provider-auth-checks.js +349 -0
- package/dist/provider-auth-checks.js.map +1 -0
- package/dist/provider-auth-observations.d.ts +22 -0
- package/dist/provider-auth-observations.d.ts.map +1 -0
- package/dist/provider-auth-observations.js +139 -0
- package/dist/provider-auth-observations.js.map +1 -0
- package/dist/provider-auth-operator.d.ts +19 -0
- package/dist/provider-auth-operator.d.ts.map +1 -0
- package/dist/provider-auth-operator.js +560 -0
- package/dist/provider-auth-operator.js.map +1 -0
- package/dist/provider-auth-status.d.ts +20 -0
- package/dist/provider-auth-status.d.ts.map +1 -0
- package/dist/provider-auth-status.js +235 -0
- package/dist/provider-auth-status.js.map +1 -0
- package/dist/provider-model-catalog.d.ts +95 -0
- package/dist/provider-model-catalog.d.ts.map +1 -0
- package/dist/provider-model-catalog.js +550 -0
- package/dist/provider-model-catalog.js.map +1 -0
- package/dist/provider-setup.d.ts +26 -13
- package/dist/provider-setup.d.ts.map +1 -1
- package/dist/provider-setup.js +106 -130
- package/dist/provider-setup.js.map +1 -1
- package/dist/readiness-probe-worker.d.ts +1 -2
- package/dist/readiness-probe-worker.d.ts.map +1 -1
- package/dist/readiness-probe-worker.js +3 -8
- package/dist/readiness-probe-worker.js.map +1 -1
- package/dist/readiness-probe.d.ts +1 -1
- package/dist/readiness-probe.d.ts.map +1 -1
- package/dist/readiness-probe.js +3 -33
- package/dist/readiness-probe.js.map +1 -1
- package/dist/reply-artifacts.d.ts +3 -1
- package/dist/reply-artifacts.d.ts.map +1 -1
- package/dist/reply-artifacts.js +45 -10
- package/dist/reply-artifacts.js.map +1 -1
- package/dist/request-model-override.d.ts +14 -37
- package/dist/request-model-override.d.ts.map +1 -1
- package/dist/request-model-override.js +105 -143
- package/dist/request-model-override.js.map +1 -1
- package/dist/request-scoped-mcp.d.ts +3 -0
- package/dist/request-scoped-mcp.d.ts.map +1 -1
- package/dist/request-scoped-mcp.js +1 -1
- package/dist/request-scoped-mcp.js.map +1 -1
- package/dist/run-history.d.ts.map +1 -1
- package/dist/run-history.js +56 -13
- package/dist/run-history.js.map +1 -1
- package/dist/runtime-option-extensions.d.ts +2 -4
- package/dist/runtime-option-extensions.d.ts.map +1 -1
- package/dist/runtime-option-extensions.js +4 -8
- package/dist/runtime-option-extensions.js.map +1 -1
- package/dist/runtime-routes.d.ts +5 -5
- package/dist/runtime-routes.d.ts.map +1 -1
- package/dist/runtime-routes.js +29 -18
- package/dist/runtime-routes.js.map +1 -1
- package/dist/sandbox-settings-cleanup.d.ts +15 -0
- package/dist/sandbox-settings-cleanup.d.ts.map +1 -0
- package/dist/sandbox-settings-cleanup.js +88 -0
- package/dist/sandbox-settings-cleanup.js.map +1 -0
- package/dist/seen-conversations.d.ts +4 -3
- package/dist/seen-conversations.d.ts.map +1 -1
- package/dist/seen-conversations.js +6 -5
- package/dist/seen-conversations.js.map +1 -1
- package/dist/session-history.d.ts +14 -0
- package/dist/session-history.d.ts.map +1 -1
- package/dist/session-history.js +120 -5
- package/dist/session-history.js.map +1 -1
- package/dist/systemd-command.d.ts +8 -0
- package/dist/systemd-command.d.ts.map +1 -0
- package/dist/systemd-command.js +206 -0
- package/dist/systemd-command.js.map +1 -0
- package/dist/systemd.d.ts +51 -0
- package/dist/systemd.d.ts.map +1 -0
- package/dist/systemd.js +299 -0
- package/dist/systemd.js.map +1 -0
- package/dist/tool-output-artifacts.d.ts +4 -0
- package/dist/tool-output-artifacts.d.ts.map +1 -0
- package/dist/tool-output-artifacts.js +17 -0
- package/dist/tool-output-artifacts.js.map +1 -0
- package/dist/trigger-overrides.d.ts +6 -0
- package/dist/trigger-overrides.d.ts.map +1 -1
- package/dist/trigger-overrides.js +36 -4
- package/dist/trigger-overrides.js.map +1 -1
- package/dist/tui-command.d.ts +0 -45
- package/dist/tui-command.d.ts.map +1 -1
- package/dist/tui-command.js +27 -264
- package/dist/tui-command.js.map +1 -1
- package/dist/untrusted-text.d.ts +36 -0
- package/dist/untrusted-text.d.ts.map +1 -0
- package/dist/untrusted-text.js +150 -0
- package/dist/untrusted-text.js.map +1 -0
- package/dist/web-command.d.ts +3 -0
- package/dist/web-command.d.ts.map +1 -1
- package/dist/web-command.js +112 -7
- package/dist/web-command.js.map +1 -1
- package/dist/web-request-coordinator.d.ts +19 -0
- package/dist/web-request-coordinator.d.ts.map +1 -0
- package/dist/web-request-coordinator.js +242 -0
- package/dist/web-request-coordinator.js.map +1 -0
- package/dist/wizard/answers.d.ts +3 -9
- package/dist/wizard/answers.d.ts.map +1 -1
- package/dist/wizard/answers.js +11 -36
- package/dist/wizard/answers.js.map +1 -1
- package/dist/wizard/from-flags.d.ts +1 -2
- package/dist/wizard/from-flags.d.ts.map +1 -1
- package/dist/wizard/from-flags.js +8 -3
- package/dist/wizard/from-flags.js.map +1 -1
- package/dist/wizard/model-discovery.d.ts +7 -8
- package/dist/wizard/model-discovery.d.ts.map +1 -1
- package/dist/wizard/model-discovery.js +58 -431
- package/dist/wizard/model-discovery.js.map +1 -1
- package/dist/wizard/presets.js +2 -2
- package/dist/wizard/presets.js.map +1 -1
- package/dist/wizard/prompts.d.ts +13 -12
- package/dist/wizard/prompts.d.ts.map +1 -1
- package/dist/wizard/prompts.js +25 -45
- package/dist/wizard/prompts.js.map +1 -1
- package/dist/wizard/run.d.ts.map +1 -1
- package/dist/wizard/run.js +30 -153
- package/dist/wizard/run.js.map +1 -1
- package/package.json +18 -18
- package/schema/mono-agent.config.schema.json +301 -53
- package/skills/mono-agent-composer/SKILL.md +5 -5
- package/skills/mono-agent-composer/references/config-blueprint.md +61 -47
- package/skills/mono-agent-composer/references/discovery-questions.md +18 -18
- package/skills/mono-agent-composer/references/feature-coverage.md +39 -21
- package/skills/mono-agent-composer/references/package-map.md +26 -17
- package/skills/mono-agent-composer/references/playbooks.md +39 -28
- package/skills/mono-agent-composer/references/validation.md +4 -3
- package/dist/codex-model-catalog.d.ts +0 -15
- package/dist/codex-model-catalog.d.ts.map +0 -1
- package/dist/codex-model-catalog.js +0 -220
- package/dist/codex-model-catalog.js.map +0 -1
- package/dist/configuration-proposal-main.d.ts +0 -3
- package/dist/configuration-proposal-main.d.ts.map +0 -1
- package/dist/configuration-proposal-main.js +0 -13
- package/dist/configuration-proposal-main.js.map +0 -1
- package/dist/configuration-proposal-tool.d.ts +0 -33
- package/dist/configuration-proposal-tool.d.ts.map +0 -1
- package/dist/configuration-proposal-tool.js +0 -188
- package/dist/configuration-proposal-tool.js.map +0 -1
- package/dist/local-configuration.d.ts +0 -99
- package/dist/local-configuration.d.ts.map +0 -1
- package/dist/local-configuration.js +0 -1330
- package/dist/local-configuration.js.map +0 -1
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { isAbsolute, resolve } from "node:path";
|
|
2
|
+
import { isLoopbackHost, parseMonitorProjection, parseMonitorProjections, } from "@mono-agent/agent-contracts";
|
|
3
|
+
import { listTraceSources } from "@mono-agent/observability";
|
|
4
|
+
import { readBoundedOwnerOnlyFile } from "./continuation-store-fs.js";
|
|
5
|
+
import { discoverJobsSource } from "./jobs-command.js";
|
|
6
|
+
import { monitorOperatorToken } from "./monitors-store.js";
|
|
7
|
+
import { PROCESS_JOB_SECRET_FILE } from "./process-jobs-store.js";
|
|
8
|
+
import { tuiEndpointOf } from "./tui-command.js";
|
|
9
|
+
/** Monitor projections carry no output, so a live agent's whole list stays small. */
|
|
10
|
+
const MAX_MONITORS_RESPONSE_BYTES = 1024 * 1024;
|
|
11
|
+
/**
|
|
12
|
+
* Authenticated, loopback-only monitor operator client for one live agent.
|
|
13
|
+
*
|
|
14
|
+
* Deliberately a separate command rather than a `--kind` flag on `jobs`: a
|
|
15
|
+
* monitor and a background job share a state root but nothing else — different
|
|
16
|
+
* states, different counters, different bearer — and one command that renders
|
|
17
|
+
* two unrelated projections reads worse than two that each render one.
|
|
18
|
+
*/
|
|
19
|
+
export async function runMonitorsCommand(options) {
|
|
20
|
+
const stdout = options.stdout ?? ((text) => process.stdout.write(text));
|
|
21
|
+
const stderr = options.stderr ?? ((text) => process.stderr.write(text));
|
|
22
|
+
const [action = "list", monitorId, ...extra] = options.positionals;
|
|
23
|
+
if (extra.length > 0 || !validUsage(action, monitorId)) {
|
|
24
|
+
stderr("Usage: mono-agent monitors [list|get <monitor-id>|cancel <monitor-id>] [--agent <label|sourceId>] [--json]\n");
|
|
25
|
+
return 2;
|
|
26
|
+
}
|
|
27
|
+
let source;
|
|
28
|
+
try {
|
|
29
|
+
source = await discoverJobsSource(options);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
return writeFailure(stderr, options.json === true, codeOf(error) ?? "agent_unreachable", reasonOf(error));
|
|
33
|
+
}
|
|
34
|
+
const baseUrlValue = tuiEndpointOf(source);
|
|
35
|
+
if (baseUrlValue === undefined) {
|
|
36
|
+
return writeFailure(stderr, options.json === true, "agent_unreachable", "The selected agent has no running operator endpoint.");
|
|
37
|
+
}
|
|
38
|
+
let baseUrl;
|
|
39
|
+
try {
|
|
40
|
+
baseUrl = new URL(baseUrlValue);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return writeFailure(stderr, options.json === true, "agent_unreachable", "The selected agent advertised an invalid operator endpoint.");
|
|
44
|
+
}
|
|
45
|
+
if ((baseUrl.protocol !== "http:" && baseUrl.protocol !== "https:")
|
|
46
|
+
|| !isLoopbackHost(baseUrl.hostname)
|
|
47
|
+
|| baseUrl.username.length > 0
|
|
48
|
+
|| baseUrl.password.length > 0) {
|
|
49
|
+
return writeFailure(stderr, options.json === true, "remote_refused", "Monitor operator commands refuse non-loopback endpoints.");
|
|
50
|
+
}
|
|
51
|
+
let token;
|
|
52
|
+
try {
|
|
53
|
+
const stateDir = monitorStateDir(source);
|
|
54
|
+
if (stateDir === undefined) {
|
|
55
|
+
throw coded("monitor_disabled", "The selected live agent has no monitor controller.");
|
|
56
|
+
}
|
|
57
|
+
token = monitorOperatorToken(await readOwnerSecret(resolve(stateDir, PROCESS_JOB_SECRET_FILE)));
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
return writeFailure(stderr, options.json === true, codeOf(error) ?? "agent_unreachable", `Monitor operator credentials are unavailable: ${reasonOf(error)}`);
|
|
61
|
+
}
|
|
62
|
+
let response;
|
|
63
|
+
try {
|
|
64
|
+
response = await request(options.fetchImpl ?? fetch, baseUrl.toString().replace(/\/$/u, ""), token, action, monitorId);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
return writeFailure(stderr, options.json === true, "agent_unreachable", `Agent is unreachable: ${reasonOf(error)}`);
|
|
68
|
+
}
|
|
69
|
+
let body;
|
|
70
|
+
try {
|
|
71
|
+
body = await readBoundedJson(response);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
return writeFailure(stderr, options.json === true, codeOf(error) ?? "monitor_invalid", `Agent returned an invalid monitor response: ${reasonOf(error)}`);
|
|
75
|
+
}
|
|
76
|
+
if (!response.ok) {
|
|
77
|
+
return writeFailure(stderr, options.json === true, errorCode(body) ?? "monitor_invalid", errorMessage(body, response.status));
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const result = action === "list"
|
|
81
|
+
? { monitors: parseMonitorProjections(recordOf(body)?.monitors) }
|
|
82
|
+
: parseMonitorProjection(body);
|
|
83
|
+
stdout(options.json === true ? `${JSON.stringify(result, null, 2)}\n` : renderHuman(action, result));
|
|
84
|
+
return 0;
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
return writeFailure(stderr, options.json === true, "monitor_invalid", `Agent returned an invalid monitor projection: ${reasonOf(error)}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async function request(fetchImpl, baseUrl, token, action, monitorId) {
|
|
91
|
+
const headers = { authorization: `Bearer ${token}` };
|
|
92
|
+
if (action === "list")
|
|
93
|
+
return await fetchImpl(`${baseUrl}/v1/monitors`, { headers, redirect: "error" });
|
|
94
|
+
const path = `${baseUrl}/v1/monitors/${encodeURIComponent(monitorId)}`;
|
|
95
|
+
return await fetchImpl(action === "cancel" ? `${path}/cancel` : path, {
|
|
96
|
+
...(action === "cancel" ? { method: "POST" } : {}),
|
|
97
|
+
headers,
|
|
98
|
+
redirect: "error",
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
function validUsage(action, monitorId) {
|
|
102
|
+
return action === "list"
|
|
103
|
+
? monitorId === undefined
|
|
104
|
+
: (action === "get" || action === "cancel")
|
|
105
|
+
&& monitorId !== undefined
|
|
106
|
+
&& monitorId.trim().length > 0
|
|
107
|
+
&& monitorId.length <= 256;
|
|
108
|
+
}
|
|
109
|
+
async function readBoundedJson(response) {
|
|
110
|
+
if (response.body === null)
|
|
111
|
+
throw coded("monitor_invalid", "response body is empty");
|
|
112
|
+
const reader = response.body.getReader();
|
|
113
|
+
const chunks = [];
|
|
114
|
+
let total = 0;
|
|
115
|
+
try {
|
|
116
|
+
for (;;) {
|
|
117
|
+
const { done, value } = await reader.read();
|
|
118
|
+
if (done)
|
|
119
|
+
break;
|
|
120
|
+
total += value.byteLength;
|
|
121
|
+
if (total > MAX_MONITORS_RESPONSE_BYTES) {
|
|
122
|
+
throw coded("monitor_response_too_large", `response exceeds ${String(MAX_MONITORS_RESPONSE_BYTES)} bytes`);
|
|
123
|
+
}
|
|
124
|
+
chunks.push(value);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
await reader.cancel().catch(() => undefined);
|
|
129
|
+
}
|
|
130
|
+
return JSON.parse(Buffer.concat(chunks.map((chunk) => Buffer.from(chunk)), total).toString("utf8"));
|
|
131
|
+
}
|
|
132
|
+
function renderHuman(action, result) {
|
|
133
|
+
if (action !== "list") {
|
|
134
|
+
const monitor = result;
|
|
135
|
+
return [
|
|
136
|
+
`${monitor.monitorId}: ${monitor.state}${monitor.persistent ? " (persistent)" : ""} ${monitor.description}`,
|
|
137
|
+
`Wake policy: ${monitor.limits.wakeOn}, dedupe ${monitor.limits.dedupe}, minimum interval ${String(monitor.limits.minWakeIntervalMs)} ms`,
|
|
138
|
+
`Suppressed: ${String(monitor.counters.batchesSuppressed)} batches / ${String(monitor.counters.linesSuppressed)} lines`,
|
|
139
|
+
`Wakes: ${String(monitor.counters.followUpWakes)} follow-up / ${String(monitor.counters.steeredWakes)} steered / ${String(monitor.counters.unknownDispositionWakes)} unknown disposition`,
|
|
140
|
+
"",
|
|
141
|
+
].join("\n");
|
|
142
|
+
}
|
|
143
|
+
const monitors = result.monitors;
|
|
144
|
+
if (monitors.length === 0)
|
|
145
|
+
return "No monitors recorded.\n";
|
|
146
|
+
return [
|
|
147
|
+
"MONITOR STATE SEQ DROPPED SUPPRESSED FOLLOW-UP STEERED UNKNOWN STARTED DESCRIPTION",
|
|
148
|
+
...monitors.map((monitor) => [
|
|
149
|
+
monitor.monitorId.padEnd(36),
|
|
150
|
+
monitor.state.padEnd(12),
|
|
151
|
+
String(monitor.counters.seq).padEnd(5),
|
|
152
|
+
String(monitor.counters.droppedLines).padEnd(8),
|
|
153
|
+
String(monitor.counters.linesSuppressed).padEnd(11),
|
|
154
|
+
String(monitor.counters.followUpWakes).padEnd(9),
|
|
155
|
+
String(monitor.counters.steeredWakes).padEnd(7),
|
|
156
|
+
String(monitor.counters.unknownDispositionWakes).padEnd(8),
|
|
157
|
+
monitor.timestamps.startedAt.padEnd(24),
|
|
158
|
+
monitor.description,
|
|
159
|
+
].join(" ")),
|
|
160
|
+
"",
|
|
161
|
+
].join("\n");
|
|
162
|
+
}
|
|
163
|
+
async function readOwnerSecret(path) {
|
|
164
|
+
const encoded = (await readBoundedOwnerOnlyFile(path, 256, "Monitor operator secret")).trim();
|
|
165
|
+
const secret = Buffer.from(encoded, "base64url");
|
|
166
|
+
if (secret.length !== 32 || secret.toString("base64url") !== encoded) {
|
|
167
|
+
throw new Error("secret contents are invalid");
|
|
168
|
+
}
|
|
169
|
+
return secret;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Monitors share the process-job protected state root, so the live agent
|
|
173
|
+
* advertises exactly one state directory and both operator surfaces read the
|
|
174
|
+
* same owner-private secret file under different HMAC labels.
|
|
175
|
+
*/
|
|
176
|
+
function monitorStateDir(source) {
|
|
177
|
+
const channels = recordOf(source.metadata?.channels);
|
|
178
|
+
const tui = recordOf(channels?.tui);
|
|
179
|
+
const monitors = recordOf(tui?.monitors);
|
|
180
|
+
if (monitors === undefined || tui?.kind !== "running")
|
|
181
|
+
return undefined;
|
|
182
|
+
// The monitor service publishes the root it actually opened. Falling back to
|
|
183
|
+
// the process-job entry keeps an older live agent readable, but a monitor
|
|
184
|
+
// controller that is up while process-job publication is degraded must still
|
|
185
|
+
// be operable.
|
|
186
|
+
const value = monitors.stateDir ?? recordOf(tui.processJobs)?.stateDir;
|
|
187
|
+
return typeof value === "string" && isAbsolute(value) && value.length <= 16_384
|
|
188
|
+
? resolve(value)
|
|
189
|
+
: undefined;
|
|
190
|
+
}
|
|
191
|
+
function writeFailure(stderr, json, code, message) {
|
|
192
|
+
stderr(json ? `${JSON.stringify({ error: { code, message } })}\n` : `${code}: ${message}\n`);
|
|
193
|
+
return 1;
|
|
194
|
+
}
|
|
195
|
+
function coded(code, message) {
|
|
196
|
+
return Object.assign(new Error(message), { code });
|
|
197
|
+
}
|
|
198
|
+
function codeOf(error) {
|
|
199
|
+
return typeof error === "object" && error !== null && typeof error.code === "string"
|
|
200
|
+
? error.code
|
|
201
|
+
: undefined;
|
|
202
|
+
}
|
|
203
|
+
function reasonOf(error) { return error instanceof Error ? error.message : String(error); }
|
|
204
|
+
function recordOf(value) {
|
|
205
|
+
return typeof value === "object" && value !== null && !Array.isArray(value)
|
|
206
|
+
? value
|
|
207
|
+
: undefined;
|
|
208
|
+
}
|
|
209
|
+
function errorCode(value) {
|
|
210
|
+
const error = recordOf(recordOf(value)?.error);
|
|
211
|
+
return typeof error?.code === "string" ? error.code : undefined;
|
|
212
|
+
}
|
|
213
|
+
function errorMessage(value, status) {
|
|
214
|
+
const error = recordOf(recordOf(value)?.error);
|
|
215
|
+
return typeof error?.message === "string" ? error.message : `HTTP ${String(status)}`;
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=monitors-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitors-command.js","sourceRoot":"","sources":["../src/monitors-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-only `monitors` configuration.
|
|
3
|
+
*
|
|
4
|
+
* Monitors are a STREAMING class of the background process-job substrate: they
|
|
5
|
+
* reuse its protected private-state root, its registration proof, its sandbox
|
|
6
|
+
* protection, and its origin binding, and therefore require
|
|
7
|
+
* `processJobs.enabled`. What they do not share is capacity — a persistent watch
|
|
8
|
+
* that held an ordinary background slot would starve real background work — so
|
|
9
|
+
* every limit below is counted independently of `processJobs.*`.
|
|
10
|
+
*/
|
|
11
|
+
export declare const MONITORS_DEFAULTS: Readonly<{
|
|
12
|
+
enabled: false;
|
|
13
|
+
maxActive: 8;
|
|
14
|
+
maxActivePerConversation: 2;
|
|
15
|
+
/** Ceiling for a timed monitor; `timeout_ms` may lower it, never raise it. */
|
|
16
|
+
maxRuntimeMs: number;
|
|
17
|
+
/** Ceiling for a `persistent: true` monitor. */
|
|
18
|
+
persistentMaxRuntimeMs: number;
|
|
19
|
+
/** Stdout lines produced within this window are delivered as one batch. */
|
|
20
|
+
coalesceMs: 200;
|
|
21
|
+
maxWakeIntervalMs: 300000;
|
|
22
|
+
maxBatchLines: 200;
|
|
23
|
+
maxBatchBytes: number;
|
|
24
|
+
maxLineBytes: number;
|
|
25
|
+
maxChainDepth: 4;
|
|
26
|
+
rateLimit: Readonly<{
|
|
27
|
+
windowMs: 1000;
|
|
28
|
+
maxLinesPerWindow: 200;
|
|
29
|
+
sustainedWindows: 5;
|
|
30
|
+
}>;
|
|
31
|
+
}>;
|
|
32
|
+
export declare const MONITORS_CAPS: Readonly<{
|
|
33
|
+
maxActive: 32;
|
|
34
|
+
maxActivePerConversation: 8;
|
|
35
|
+
maxRuntimeMs: number;
|
|
36
|
+
persistentMaxRuntimeMs: number;
|
|
37
|
+
coalesceMs: 5000;
|
|
38
|
+
maxWakeIntervalMs: 300000;
|
|
39
|
+
maxBatchLines: 2000;
|
|
40
|
+
maxBatchBytes: number;
|
|
41
|
+
maxLineBytes: number;
|
|
42
|
+
maxChainDepth: 64;
|
|
43
|
+
rateLimit: Readonly<{
|
|
44
|
+
windowMs: 60000;
|
|
45
|
+
maxLinesPerWindow: 20000;
|
|
46
|
+
sustainedWindows: 60;
|
|
47
|
+
}>;
|
|
48
|
+
}>;
|
|
49
|
+
/** Terminal monitors retained only until their single final wake settles. */
|
|
50
|
+
export declare const MONITORS_MAX_TERMINAL_RECORDS = 32;
|
|
51
|
+
export interface MonitorsRateLimitSettings {
|
|
52
|
+
readonly windowMs: number;
|
|
53
|
+
readonly maxLinesPerWindow: number;
|
|
54
|
+
readonly sustainedWindows: number;
|
|
55
|
+
}
|
|
56
|
+
export interface MonitorsSettings {
|
|
57
|
+
readonly configured: boolean;
|
|
58
|
+
readonly enabled: boolean;
|
|
59
|
+
readonly maxActive: number;
|
|
60
|
+
readonly maxActivePerConversation: number;
|
|
61
|
+
readonly maxRuntimeMs: number;
|
|
62
|
+
readonly persistentMaxRuntimeMs: number;
|
|
63
|
+
readonly coalesceMs: number;
|
|
64
|
+
readonly maxWakeIntervalMs: number;
|
|
65
|
+
readonly maxBatchLines: number;
|
|
66
|
+
readonly maxBatchBytes: number;
|
|
67
|
+
readonly maxLineBytes: number;
|
|
68
|
+
readonly maxChainDepth: number;
|
|
69
|
+
readonly rateLimit: MonitorsRateLimitSettings;
|
|
70
|
+
}
|
|
71
|
+
/** Load the host-only monitor block, failing closed on every unknown key. */
|
|
72
|
+
export declare function loadMonitorsSettings(input: {
|
|
73
|
+
readonly configPath: string;
|
|
74
|
+
}): Promise<MonitorsSettings>;
|
|
75
|
+
/** Parse one already-loaded config object; unknown keys fail closed. */
|
|
76
|
+
export declare function parseMonitorsSettings(raw: unknown): MonitorsSettings;
|
|
77
|
+
//# sourceMappingURL=monitors-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitors-config.d.ts","sourceRoot":"","sources":["../src/monitors-config.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB;;;;IAI5B,8EAA8E;;IAE9E,gDAAgD;;IAEhD,2EAA2E;;;;;;;;;;;;EAY3E,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;EAgBxB,CAAC;AAEH,6EAA6E;AAC7E,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAEhD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,yBAAyB,CAAC;CAC/C;AAmBD,6EAA6E;AAC7E,wBAAsB,oBAAoB,CAAC,KAAK,EAAE;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAS5B;AAED,wEAAwE;AACxE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,CAOpE"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
/**
|
|
3
|
+
* Host-only `monitors` configuration.
|
|
4
|
+
*
|
|
5
|
+
* Monitors are a STREAMING class of the background process-job substrate: they
|
|
6
|
+
* reuse its protected private-state root, its registration proof, its sandbox
|
|
7
|
+
* protection, and its origin binding, and therefore require
|
|
8
|
+
* `processJobs.enabled`. What they do not share is capacity — a persistent watch
|
|
9
|
+
* that held an ordinary background slot would starve real background work — so
|
|
10
|
+
* every limit below is counted independently of `processJobs.*`.
|
|
11
|
+
*/
|
|
12
|
+
export const MONITORS_DEFAULTS = Object.freeze({
|
|
13
|
+
enabled: false,
|
|
14
|
+
maxActive: 8,
|
|
15
|
+
maxActivePerConversation: 2,
|
|
16
|
+
/** Ceiling for a timed monitor; `timeout_ms` may lower it, never raise it. */
|
|
17
|
+
maxRuntimeMs: 60 * 60 * 1_000,
|
|
18
|
+
/** Ceiling for a `persistent: true` monitor. */
|
|
19
|
+
persistentMaxRuntimeMs: 24 * 60 * 60 * 1_000,
|
|
20
|
+
/** Stdout lines produced within this window are delivered as one batch. */
|
|
21
|
+
coalesceMs: 200,
|
|
22
|
+
maxWakeIntervalMs: 300_000,
|
|
23
|
+
maxBatchLines: 200,
|
|
24
|
+
maxBatchBytes: 64 * 1024,
|
|
25
|
+
maxLineBytes: 4 * 1024,
|
|
26
|
+
maxChainDepth: 4,
|
|
27
|
+
rateLimit: Object.freeze({
|
|
28
|
+
windowMs: 1_000,
|
|
29
|
+
maxLinesPerWindow: 200,
|
|
30
|
+
sustainedWindows: 5,
|
|
31
|
+
}),
|
|
32
|
+
});
|
|
33
|
+
export const MONITORS_CAPS = Object.freeze({
|
|
34
|
+
maxActive: 32,
|
|
35
|
+
maxActivePerConversation: 8,
|
|
36
|
+
maxRuntimeMs: 60 * 60 * 1_000,
|
|
37
|
+
persistentMaxRuntimeMs: 24 * 60 * 60 * 1_000,
|
|
38
|
+
coalesceMs: 5_000,
|
|
39
|
+
maxWakeIntervalMs: 300_000,
|
|
40
|
+
maxBatchLines: 2_000,
|
|
41
|
+
maxBatchBytes: 1024 * 1024,
|
|
42
|
+
maxLineBytes: 64 * 1024,
|
|
43
|
+
maxChainDepth: 64,
|
|
44
|
+
rateLimit: Object.freeze({
|
|
45
|
+
windowMs: 60_000,
|
|
46
|
+
maxLinesPerWindow: 20_000,
|
|
47
|
+
sustainedWindows: 60,
|
|
48
|
+
}),
|
|
49
|
+
});
|
|
50
|
+
/** Terminal monitors retained only until their single final wake settles. */
|
|
51
|
+
export const MONITORS_MAX_TERMINAL_RECORDS = 32;
|
|
52
|
+
const MONITORS_KEYS = [
|
|
53
|
+
"enabled",
|
|
54
|
+
"maxActive",
|
|
55
|
+
"maxActivePerConversation",
|
|
56
|
+
"maxRuntimeMs",
|
|
57
|
+
"persistentMaxRuntimeMs",
|
|
58
|
+
"coalesceMs",
|
|
59
|
+
"maxWakeIntervalMs",
|
|
60
|
+
"maxBatchLines",
|
|
61
|
+
"maxBatchBytes",
|
|
62
|
+
"maxLineBytes",
|
|
63
|
+
"maxChainDepth",
|
|
64
|
+
"rateLimit",
|
|
65
|
+
];
|
|
66
|
+
const RATE_LIMIT_KEYS = ["windowMs", "maxLinesPerWindow", "sustainedWindows"];
|
|
67
|
+
/** Load the host-only monitor block, failing closed on every unknown key. */
|
|
68
|
+
export async function loadMonitorsSettings(input) {
|
|
69
|
+
let raw = {};
|
|
70
|
+
try {
|
|
71
|
+
raw = JSON.parse(await readFile(input.configPath, "utf8"));
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// The core loader owns malformed/missing config reporting. This optional
|
|
75
|
+
// host block stays disabled until that loader accepts the file.
|
|
76
|
+
}
|
|
77
|
+
return parseMonitorsSettings(raw);
|
|
78
|
+
}
|
|
79
|
+
/** Parse one already-loaded config object; unknown keys fail closed. */
|
|
80
|
+
export function parseMonitorsSettings(raw) {
|
|
81
|
+
const root = objectOf(raw);
|
|
82
|
+
const value = root.monitors;
|
|
83
|
+
if (value === undefined)
|
|
84
|
+
return resolved(false, {});
|
|
85
|
+
const block = requireObject(value, "monitors");
|
|
86
|
+
rejectUnknownKeys(block, "monitors", MONITORS_KEYS);
|
|
87
|
+
return resolved(true, block);
|
|
88
|
+
}
|
|
89
|
+
function resolved(configured, block) {
|
|
90
|
+
const rateLimitValue = block.rateLimit;
|
|
91
|
+
const rateLimit = rateLimitValue === undefined
|
|
92
|
+
? {}
|
|
93
|
+
: requireObject(rateLimitValue, "monitors.rateLimit");
|
|
94
|
+
rejectUnknownKeys(rateLimit, "monitors.rateLimit", RATE_LIMIT_KEYS);
|
|
95
|
+
return {
|
|
96
|
+
configured,
|
|
97
|
+
enabled: optionalBoolean(block.enabled, "monitors.enabled") ?? MONITORS_DEFAULTS.enabled,
|
|
98
|
+
maxActive: bounded(block.maxActive, "monitors.maxActive", MONITORS_DEFAULTS.maxActive, MONITORS_CAPS.maxActive),
|
|
99
|
+
maxActivePerConversation: bounded(block.maxActivePerConversation, "monitors.maxActivePerConversation", MONITORS_DEFAULTS.maxActivePerConversation, MONITORS_CAPS.maxActivePerConversation),
|
|
100
|
+
maxRuntimeMs: bounded(block.maxRuntimeMs, "monitors.maxRuntimeMs", MONITORS_DEFAULTS.maxRuntimeMs, MONITORS_CAPS.maxRuntimeMs),
|
|
101
|
+
persistentMaxRuntimeMs: bounded(block.persistentMaxRuntimeMs, "monitors.persistentMaxRuntimeMs", MONITORS_DEFAULTS.persistentMaxRuntimeMs, MONITORS_CAPS.persistentMaxRuntimeMs),
|
|
102
|
+
coalesceMs: bounded(block.coalesceMs, "monitors.coalesceMs", MONITORS_DEFAULTS.coalesceMs, MONITORS_CAPS.coalesceMs),
|
|
103
|
+
maxWakeIntervalMs: bounded(block.maxWakeIntervalMs, "monitors.maxWakeIntervalMs", MONITORS_DEFAULTS.maxWakeIntervalMs, MONITORS_CAPS.maxWakeIntervalMs),
|
|
104
|
+
maxBatchLines: bounded(block.maxBatchLines, "monitors.maxBatchLines", MONITORS_DEFAULTS.maxBatchLines, MONITORS_CAPS.maxBatchLines),
|
|
105
|
+
maxBatchBytes: bounded(block.maxBatchBytes, "monitors.maxBatchBytes", MONITORS_DEFAULTS.maxBatchBytes, MONITORS_CAPS.maxBatchBytes),
|
|
106
|
+
maxLineBytes: bounded(block.maxLineBytes, "monitors.maxLineBytes", MONITORS_DEFAULTS.maxLineBytes, MONITORS_CAPS.maxLineBytes),
|
|
107
|
+
maxChainDepth: bounded(block.maxChainDepth, "monitors.maxChainDepth", MONITORS_DEFAULTS.maxChainDepth, MONITORS_CAPS.maxChainDepth),
|
|
108
|
+
rateLimit: {
|
|
109
|
+
windowMs: bounded(rateLimit.windowMs, "monitors.rateLimit.windowMs", MONITORS_DEFAULTS.rateLimit.windowMs, MONITORS_CAPS.rateLimit.windowMs),
|
|
110
|
+
maxLinesPerWindow: bounded(rateLimit.maxLinesPerWindow, "monitors.rateLimit.maxLinesPerWindow", MONITORS_DEFAULTS.rateLimit.maxLinesPerWindow, MONITORS_CAPS.rateLimit.maxLinesPerWindow),
|
|
111
|
+
sustainedWindows: bounded(rateLimit.sustainedWindows, "monitors.rateLimit.sustainedWindows", MONITORS_DEFAULTS.rateLimit.sustainedWindows, MONITORS_CAPS.rateLimit.sustainedWindows),
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function bounded(value, path, fallback, cap) {
|
|
116
|
+
if (value === undefined)
|
|
117
|
+
return fallback;
|
|
118
|
+
if (!Number.isSafeInteger(value) || Number(value) <= 0) {
|
|
119
|
+
throw new Error(`${path} must be a positive safe integer.`);
|
|
120
|
+
}
|
|
121
|
+
if (Number(value) > cap)
|
|
122
|
+
throw new Error(`${path} cannot exceed ${String(cap)}.`);
|
|
123
|
+
return Number(value);
|
|
124
|
+
}
|
|
125
|
+
function objectOf(value) {
|
|
126
|
+
return typeof value === "object" && value !== null && !Array.isArray(value)
|
|
127
|
+
? value
|
|
128
|
+
: {};
|
|
129
|
+
}
|
|
130
|
+
function requireObject(value, path) {
|
|
131
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
132
|
+
throw new Error(`${path} must be an object.`);
|
|
133
|
+
}
|
|
134
|
+
return value;
|
|
135
|
+
}
|
|
136
|
+
function optionalBoolean(value, path) {
|
|
137
|
+
if (value === undefined)
|
|
138
|
+
return undefined;
|
|
139
|
+
if (typeof value !== "boolean")
|
|
140
|
+
throw new Error(`${path} must be a boolean.`);
|
|
141
|
+
return value;
|
|
142
|
+
}
|
|
143
|
+
function rejectUnknownKeys(value, path, allowed) {
|
|
144
|
+
const allowedSet = new Set(allowed);
|
|
145
|
+
const unknown = Object.keys(value).filter((key) => !allowedSet.has(key));
|
|
146
|
+
if (unknown.length > 0) {
|
|
147
|
+
throw new Error(`${path} has unknown ${unknown.length === 1 ? "key" : "keys"}: ${unknown.join(", ")}.`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=monitors-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitors-config.js","sourceRoot":"","sources":["../src/monitors-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { type AgentRequestBase, type AgentResponder, type AgentResponse } from "@mono-agent/agent-contracts";
|
|
2
|
+
import type { MonoAgentAppLogger } from "./channels.js";
|
|
3
|
+
export interface MonitorWakeContext {
|
|
4
|
+
readonly monitorId: string;
|
|
5
|
+
readonly chainDepth: number;
|
|
6
|
+
}
|
|
7
|
+
export type MonitorWakeContextResolution = {
|
|
8
|
+
readonly kind: "none";
|
|
9
|
+
} | {
|
|
10
|
+
readonly kind: "resolved";
|
|
11
|
+
readonly context: MonitorWakeContext;
|
|
12
|
+
} | {
|
|
13
|
+
readonly kind: "missed";
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Run a genuine channel turn as a monitor wake.
|
|
17
|
+
*
|
|
18
|
+
* This nests INSIDE the process-job wake context on purpose. Both features raise
|
|
19
|
+
* host-owned turns on the same conversation, and the steering registry admits
|
|
20
|
+
* exactly one active run per conversation: a second, parallel registration would
|
|
21
|
+
* make every steer ambiguous and silently downgrade process-job wakes to a
|
|
22
|
+
* follow-up turn. Sharing it also means a monitor wake inherits the same
|
|
23
|
+
* targeted-run steering and the same unforgeable chain-depth increment, so a
|
|
24
|
+
* monitor started from a wake turn cannot escape `maxChainDepth`.
|
|
25
|
+
*/
|
|
26
|
+
export declare function runWithMonitorWakeContext<T>(context: MonitorWakeContext, operation: () => Promise<T>, deliveryKey: string): Promise<T>;
|
|
27
|
+
/**
|
|
28
|
+
* Capture an admitted monitor wake on the request identity that survives the
|
|
29
|
+
* responder-to-harness queue boundary, and suppress a sentinel-only answer.
|
|
30
|
+
*
|
|
31
|
+
* The suppression is the point of this wrapper. A monitor raises turns nobody
|
|
32
|
+
* asked for, so it must be able to conclude "nothing worth saying" without
|
|
33
|
+
* posting anything — but `NOTHING_TO_REPORT` is only honoured by the native
|
|
34
|
+
* cron/webhook notify path, which a channel wake turn does not go through.
|
|
35
|
+
* Blanking the answer here makes the adapters' existing "agent produced no
|
|
36
|
+
* answer" path do the suppressing, without teaching any adapter about monitors.
|
|
37
|
+
*/
|
|
38
|
+
export declare function bindMonitorWakeContextToResponder(responder: AgentResponder, options?: {
|
|
39
|
+
readonly logger?: MonoAgentAppLogger;
|
|
40
|
+
}): AgentResponder;
|
|
41
|
+
/**
|
|
42
|
+
* Blank a monitor wake answer that ends with the sentinel. Attachments are
|
|
43
|
+
* dropped with it: a turn that decided it has nothing to say must not still post
|
|
44
|
+
* files. A `narrated-sentinel` is honoured but logged, exactly as the native
|
|
45
|
+
* notify path does, because it means the model wrote prose before the marker.
|
|
46
|
+
*/
|
|
47
|
+
export declare function suppressSilentMonitorReply(response: AgentResponse, context: MonitorWakeContext & {
|
|
48
|
+
readonly deliveryKey?: string;
|
|
49
|
+
}, logger?: MonoAgentAppLogger): AgentResponse;
|
|
50
|
+
/**
|
|
51
|
+
* Whether this wake's turn ran and chose silence. Consumed once: the settling
|
|
52
|
+
* wake is the only reader, and a stale key must not make a later batch look
|
|
53
|
+
* delivered.
|
|
54
|
+
*/
|
|
55
|
+
export declare function consumeSilentMonitorWake(deliveryKey: string): boolean;
|
|
56
|
+
/** Resolve only an association previously issued by this app-owned seam. */
|
|
57
|
+
export declare function monitorWakeContextForRequest(request: Pick<AgentRequestBase, "metadata">): MonitorWakeContextResolution;
|
|
58
|
+
//# sourceMappingURL=monitors-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitors-context.d.ts","sourceRoot":"","sources":["../src/monitors-context.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGxD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAOD,MAAM,MAAM,4BAA4B,GACpC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAA;CAAE,GACnE;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AA0BhC;;;;;;;;;;GAUG;AACH,wBAAsB,yBAAyB,CAAC,CAAC,EAC/C,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,CAAC,CAAC,CAgBZ;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iCAAiC,CAC/C,SAAS,EAAE,cAAc,EACzB,OAAO,GAAE;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAA;CAAO,GACrD,cAAc,CA2DhB;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,kBAAkB,GAAG;IAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAC/D,MAAM,CAAC,EAAE,kBAAkB,GAC1B,aAAa,CAYf;AAaD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAErE;AAED,4EAA4E;AAC5E,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,GAC1C,4BAA4B,CAW9B"}
|