harnery 0.36.0 → 0.37.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/dist/commander.js +4 -0
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +87 -46
- package/dist/commands/artifacts.d.ts.map +1 -1
- package/dist/commands/artifacts.js +26 -1
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +11 -0
- package/dist/commands/diagnostics.d.ts +4 -0
- package/dist/commands/diagnostics.d.ts.map +1 -0
- package/dist/commands/diagnostics.js +229 -0
- package/dist/commands/files.d.ts +12 -0
- package/dist/commands/files.d.ts.map +1 -1
- package/dist/commands/files.js +54 -1
- package/dist/commands/governor.d.ts.map +1 -1
- package/dist/commands/governor.js +4 -0
- package/dist/commands/ledger-v3.d.ts.map +1 -1
- package/dist/commands/ledger-v3.js +71 -2
- package/dist/commands/qa-run.d.ts +4 -0
- package/dist/commands/qa-run.d.ts.map +1 -0
- package/dist/commands/qa-run.js +141 -0
- package/dist/commands/resources.d.ts +4 -0
- package/dist/commands/resources.d.ts.map +1 -0
- package/dist/commands/resources.js +29 -0
- package/dist/commands/supervisor.d.ts +4 -0
- package/dist/commands/supervisor.d.ts.map +1 -0
- package/dist/commands/supervisor.js +101 -0
- package/dist/commands/web.d.ts.map +1 -1
- package/dist/commands/web.js +17 -0
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +4 -0
- package/dist/core/agents/cli.js +7 -3
- package/dist/core/agents/health.d.ts +17 -0
- package/dist/core/agents/health.d.ts.map +1 -0
- package/dist/core/agents/health.js +109 -0
- package/dist/core/agents/mailbox.d.ts +92 -0
- package/dist/core/agents/mailbox.d.ts.map +1 -0
- package/dist/core/agents/mailbox.js +325 -0
- package/dist/core/agents/reconcile-coordination-v3.d.ts +44 -0
- package/dist/core/agents/reconcile-coordination-v3.d.ts.map +1 -0
- package/dist/core/agents/reconcile-coordination-v3.js +58 -0
- package/dist/core/agents/render/prompt-context.d.ts +5 -0
- package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
- package/dist/core/agents/render/prompt-context.js +34 -13
- package/dist/core/agents/render/session-context.d.ts +8 -0
- package/dist/core/agents/render/session-context.d.ts.map +1 -1
- package/dist/core/agents/render/session-context.js +34 -3
- package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
- package/dist/core/agents/rules/commit-conflict.js +50 -1
- package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
- package/dist/core/agents/rules/stop-hook.js +6 -10
- package/dist/core/agents/session-finalizer-v3.js +4 -1
- package/dist/core/artifacts/index.d.ts +26 -1
- package/dist/core/artifacts/index.d.ts.map +1 -1
- package/dist/core/artifacts/index.js +146 -6
- package/dist/core/config.d.ts +12 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +43 -0
- package/dist/core/diagnostics/advice.d.ts +9 -0
- package/dist/core/diagnostics/advice.d.ts.map +1 -0
- package/dist/core/diagnostics/advice.js +112 -0
- package/dist/core/diagnostics/bundle.d.ts +35 -0
- package/dist/core/diagnostics/bundle.d.ts.map +1 -0
- package/dist/core/diagnostics/bundle.js +874 -0
- package/dist/core/diagnostics/comparison.d.ts +5 -0
- package/dist/core/diagnostics/comparison.d.ts.map +1 -0
- package/dist/core/diagnostics/comparison.js +444 -0
- package/dist/core/diagnostics/contract.d.ts +245 -0
- package/dist/core/diagnostics/contract.d.ts.map +1 -0
- package/dist/core/diagnostics/contract.js +18 -0
- package/dist/core/diagnostics/identity.d.ts +3 -0
- package/dist/core/diagnostics/identity.d.ts.map +1 -0
- package/dist/core/diagnostics/identity.js +10 -0
- package/dist/core/diagnostics/index.d.ts +8 -0
- package/dist/core/diagnostics/index.d.ts.map +1 -0
- package/dist/core/diagnostics/index.js +7 -0
- package/dist/core/diagnostics/replay.d.ts +8 -0
- package/dist/core/diagnostics/replay.d.ts.map +1 -0
- package/dist/core/diagnostics/replay.js +213 -0
- package/dist/core/diagnostics/sanitize.d.ts +9 -0
- package/dist/core/diagnostics/sanitize.d.ts.map +1 -0
- package/dist/core/diagnostics/sanitize.js +84 -0
- package/dist/core/events/legacy-storage/compression.d.ts +13 -0
- package/dist/core/events/legacy-storage/compression.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/compression.js +107 -0
- package/dist/core/events/legacy-storage/index.d.ts +1 -0
- package/dist/core/events/legacy-storage/index.d.ts.map +1 -1
- package/dist/core/events/legacy-storage/index.js +1 -0
- package/dist/core/events/v3/archive-retention.d.ts +33 -0
- package/dist/core/events/v3/archive-retention.d.ts.map +1 -0
- package/dist/core/events/v3/archive-retention.js +195 -0
- package/dist/core/events/v3/capabilities.d.ts +1 -1
- package/dist/core/events/v3/capabilities.d.ts.map +1 -1
- package/dist/core/events/v3/capabilities.js +1 -0
- package/dist/core/events/v3/index.d.ts +1 -0
- package/dist/core/events/v3/index.d.ts.map +1 -1
- package/dist/core/events/v3/index.js +1 -0
- package/dist/core/events/v3/live-routing.d.ts.map +1 -1
- package/dist/core/events/v3/live-routing.js +1 -0
- package/dist/core/events/v3/producers/hook-base.d.ts +1 -1
- package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
- package/dist/core/events/v3/producers/hook-base.js +13 -2
- package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
- package/dist/core/events/v3/producers/intake.js +1 -0
- package/dist/core/events/v3/producers/recorder.d.ts +16 -0
- package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/recorder.js +88 -1
- package/dist/core/hooks/adapter/output.d.ts +8 -0
- package/dist/core/hooks/adapter/output.d.ts.map +1 -1
- package/dist/core/hooks/adapter/output.js +11 -1
- package/dist/core/hooks/cli.js +183 -192
- package/dist/core/hooks/health.d.ts +59 -0
- package/dist/core/hooks/health.d.ts.map +1 -0
- package/dist/core/hooks/health.js +84 -0
- package/dist/core/resources/contract.d.ts +90 -0
- package/dist/core/resources/contract.d.ts.map +1 -0
- package/dist/core/resources/contract.js +2 -0
- package/dist/core/resources/index.d.ts +6 -0
- package/dist/core/resources/index.d.ts.map +1 -0
- package/dist/core/resources/index.js +5 -0
- package/dist/core/resources/sampler.d.ts +27 -0
- package/dist/core/resources/sampler.d.ts.map +1 -0
- package/dist/core/resources/sampler.js +357 -0
- package/dist/core/resources/service-status.d.ts +3 -0
- package/dist/core/resources/service-status.d.ts.map +1 -0
- package/dist/core/resources/service-status.js +48 -0
- package/dist/core/resources/service.d.ts +26 -0
- package/dist/core/resources/service.d.ts.map +1 -0
- package/dist/core/resources/service.js +292 -0
- package/dist/core/resources/storage.d.ts +13 -0
- package/dist/core/resources/storage.d.ts.map +1 -0
- package/dist/core/resources/storage.js +30 -0
- package/dist/core/storage/atomic-json.d.ts +3 -0
- package/dist/core/storage/atomic-json.d.ts.map +1 -0
- package/dist/core/storage/atomic-json.js +15 -0
- package/dist/core/storage/builtins.d.ts.map +1 -1
- package/dist/core/storage/builtins.js +45 -6
- package/dist/core/storage/logger.d.ts +2 -0
- package/dist/core/storage/logger.d.ts.map +1 -1
- package/dist/core/storage/logger.js +2 -0
- package/dist/core/storage/query.d.ts +14 -0
- package/dist/core/storage/query.d.ts.map +1 -1
- package/dist/core/storage/query.js +51 -0
- package/dist/core/supervisor/activity.d.ts +4 -0
- package/dist/core/supervisor/activity.d.ts.map +1 -0
- package/dist/core/supervisor/activity.js +141 -0
- package/dist/core/supervisor/contract.d.ts +268 -0
- package/dist/core/supervisor/contract.d.ts.map +1 -0
- package/dist/core/supervisor/contract.js +35 -0
- package/dist/core/supervisor/explanations.d.ts +4 -0
- package/dist/core/supervisor/explanations.d.ts.map +1 -0
- package/dist/core/supervisor/explanations.js +71 -0
- package/dist/core/supervisor/findings.d.ts +20 -0
- package/dist/core/supervisor/findings.d.ts.map +1 -0
- package/dist/core/supervisor/findings.js +399 -0
- package/dist/core/supervisor/history.d.ts +9 -0
- package/dist/core/supervisor/history.d.ts.map +1 -0
- package/dist/core/supervisor/history.js +46 -0
- package/dist/core/supervisor/hook-health-alerts.d.ts +14 -0
- package/dist/core/supervisor/hook-health-alerts.d.ts.map +1 -0
- package/dist/core/supervisor/hook-health-alerts.js +70 -0
- package/dist/core/supervisor/hook-health-storage.d.ts +5 -0
- package/dist/core/supervisor/hook-health-storage.d.ts.map +1 -0
- package/dist/core/supervisor/hook-health-storage.js +24 -0
- package/dist/core/supervisor/hook-health.d.ts +72 -0
- package/dist/core/supervisor/hook-health.d.ts.map +1 -0
- package/dist/core/supervisor/hook-health.js +203 -0
- package/dist/core/supervisor/hooks.d.ts +10 -0
- package/dist/core/supervisor/hooks.d.ts.map +1 -0
- package/dist/core/supervisor/hooks.js +28 -0
- package/dist/core/supervisor/index.d.ts +15 -0
- package/dist/core/supervisor/index.d.ts.map +1 -0
- package/dist/core/supervisor/index.js +14 -0
- package/dist/core/supervisor/log-feed.d.ts +9 -0
- package/dist/core/supervisor/log-feed.d.ts.map +1 -0
- package/dist/core/supervisor/log-feed.js +103 -0
- package/dist/core/supervisor/service.d.ts +29 -0
- package/dist/core/supervisor/service.d.ts.map +1 -0
- package/dist/core/supervisor/service.js +450 -0
- package/dist/core/supervisor/services.d.ts +11 -0
- package/dist/core/supervisor/services.d.ts.map +1 -0
- package/dist/core/supervisor/services.js +155 -0
- package/dist/core/supervisor/status.d.ts +3 -0
- package/dist/core/supervisor/status.d.ts.map +1 -0
- package/dist/core/supervisor/status.js +48 -0
- package/dist/core/supervisor/storage.d.ts +30 -0
- package/dist/core/supervisor/storage.d.ts.map +1 -0
- package/dist/core/supervisor/storage.js +73 -0
- package/dist/core/supervisor/timeline.d.ts +3 -0
- package/dist/core/supervisor/timeline.d.ts.map +1 -0
- package/dist/core/supervisor/timeline.js +87 -0
- package/dist/core/workflow/admission.d.ts +23 -0
- package/dist/core/workflow/admission.d.ts.map +1 -0
- package/dist/core/workflow/admission.js +136 -0
- package/dist/core/workflow/engine.d.ts.map +1 -1
- package/dist/core/workflow/engine.js +77 -2
- package/dist/core/workflow/index.d.ts +3 -2
- package/dist/core/workflow/index.d.ts.map +1 -1
- package/dist/core/workflow/index.js +2 -1
- package/dist/core/workflow/proof.d.ts +2 -1
- package/dist/core/workflow/proof.d.ts.map +1 -1
- package/dist/core/workflow/proof.js +39 -1
- package/dist/core/workflow/run-state.d.ts +3 -2
- package/dist/core/workflow/run-state.d.ts.map +1 -1
- package/dist/core/workflow/run-state.js +8 -1
- package/dist/core/workflow/types.d.ts +33 -1
- package/dist/core/workflow/types.d.ts.map +1 -1
- package/dist/core/workflow/types.js +2 -1
- package/dist/lib/browser/client.d.ts +5 -0
- package/dist/lib/browser/client.d.ts.map +1 -1
- package/dist/lib/browser/client.js +1 -0
- package/dist/lib/browser/index.d.ts +2 -0
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/index.js +2 -0
- package/dist/lib/browser/qa-run-contracts.d.ts +173 -0
- package/dist/lib/browser/qa-run-contracts.d.ts.map +1 -0
- package/dist/lib/browser/qa-run-contracts.js +226 -0
- package/dist/lib/browser/qa-run.d.ts +51 -0
- package/dist/lib/browser/qa-run.d.ts.map +1 -0
- package/dist/lib/browser/qa-run.js +684 -0
- package/dist/lib/coord-root-id.d.ts +9 -0
- package/dist/lib/coord-root-id.d.ts.map +1 -0
- package/dist/lib/coord-root-id.js +17 -0
- package/dist/lib/instructions/apply.d.ts +3 -1
- package/dist/lib/instructions/apply.d.ts.map +1 -1
- package/dist/lib/instructions/apply.js +74 -3
- package/dist/lib/instructions/templates.d.ts.map +1 -1
- package/dist/lib/instructions/templates.js +6 -0
- package/package.json +12 -1
- package/src/commander.ts +26 -0
- package/src/commands/agents.ts +102 -49
- package/src/commands/artifacts.ts +40 -2
- package/src/commands/browse.ts +15 -0
- package/src/commands/diagnostics.ts +271 -0
- package/src/commands/files.ts +102 -2
- package/src/commands/governor.ts +8 -0
- package/src/commands/ledger-v3.ts +82 -0
- package/src/commands/qa-run.ts +184 -0
- package/src/commands/resources.ts +38 -0
- package/src/commands/supervisor.ts +141 -0
- package/src/commands/web.ts +19 -0
- package/src/commands/workflow.ts +8 -0
- package/src/core/agents/cli.ts +7 -3
- package/src/core/agents/health.ts +142 -0
- package/src/core/agents/mailbox.ts +373 -0
- package/src/core/agents/reconcile-coordination-v3.ts +77 -0
- package/src/core/agents/render/prompt-context.ts +42 -12
- package/src/core/agents/render/session-context.ts +37 -3
- package/src/core/agents/rules/commit-conflict.ts +58 -1
- package/src/core/agents/rules/stop-hook.ts +6 -12
- package/src/core/agents/session-finalizer-v3.ts +4 -1
- package/src/core/artifacts/index.ts +196 -10
- package/src/core/config.ts +111 -2
- package/src/core/diagnostics/advice.ts +147 -0
- package/src/core/diagnostics/bundle.ts +1142 -0
- package/src/core/diagnostics/comparison.ts +565 -0
- package/src/core/diagnostics/contract.ts +311 -0
- package/src/core/diagnostics/identity.ts +11 -0
- package/src/core/diagnostics/index.ts +7 -0
- package/src/core/diagnostics/replay.ts +314 -0
- package/src/core/diagnostics/sanitize.ts +97 -0
- package/src/core/events/legacy-storage/compression.ts +130 -0
- package/src/core/events/legacy-storage/index.ts +1 -0
- package/src/core/events/v3/archive-retention.ts +251 -0
- package/src/core/events/v3/capabilities.ts +2 -0
- package/src/core/events/v3/index.ts +9 -0
- package/src/core/events/v3/live-routing.ts +1 -0
- package/src/core/events/v3/producers/hook-base.ts +14 -2
- package/src/core/events/v3/producers/intake.ts +1 -0
- package/src/core/events/v3/producers/recorder.ts +110 -1
- package/src/core/hooks/adapter/output.ts +12 -1
- package/src/core/hooks/cli.ts +192 -215
- package/src/core/hooks/health.ts +146 -0
- package/src/core/resources/contract.ts +98 -0
- package/src/core/resources/index.ts +5 -0
- package/src/core/resources/sampler.ts +458 -0
- package/src/core/resources/service-status.ts +62 -0
- package/src/core/resources/service.ts +337 -0
- package/src/core/resources/storage.ts +44 -0
- package/src/core/storage/atomic-json.ts +15 -0
- package/src/core/storage/builtins.ts +62 -6
- package/src/core/storage/logger.ts +2 -0
- package/src/core/storage/query.ts +58 -0
- package/src/core/supervisor/activity.ts +193 -0
- package/src/core/supervisor/contract.ts +312 -0
- package/src/core/supervisor/explanations.ts +104 -0
- package/src/core/supervisor/findings.ts +788 -0
- package/src/core/supervisor/history.ts +61 -0
- package/src/core/supervisor/hook-health-alerts.ts +108 -0
- package/src/core/supervisor/hook-health-storage.ts +25 -0
- package/src/core/supervisor/hook-health.ts +301 -0
- package/src/core/supervisor/hooks.ts +35 -0
- package/src/core/supervisor/index.ts +14 -0
- package/src/core/supervisor/log-feed.ts +131 -0
- package/src/core/supervisor/service.ts +511 -0
- package/src/core/supervisor/services.ts +203 -0
- package/src/core/supervisor/status.ts +59 -0
- package/src/core/supervisor/storage.ts +126 -0
- package/src/core/supervisor/timeline.ts +133 -0
- package/src/core/workflow/admission.ts +215 -0
- package/src/core/workflow/engine.ts +93 -1
- package/src/core/workflow/index.ts +10 -0
- package/src/core/workflow/proof.ts +54 -1
- package/src/core/workflow/run-state.ts +13 -1
- package/src/core/workflow/types.ts +39 -1
- package/src/lib/browser/client.ts +6 -0
- package/src/lib/browser/index.ts +29 -0
- package/src/lib/browser/qa-run-contracts.ts +380 -0
- package/src/lib/browser/qa-run.ts +784 -0
- package/src/lib/coord-root-id.ts +23 -0
- package/src/lib/instructions/apply.ts +81 -2
- package/src/lib/instructions/templates.ts +6 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/commands/supervisor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAe1E,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAwGN"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { readSupervisorHookHealth } from "../core/supervisor/hook-health-storage.js";
|
|
3
|
+
import { requestSupervisorStop, runSupervisor, spawnSupervisor, } from "../core/supervisor/service.js";
|
|
4
|
+
import { readSupervisorStatus } from "../core/supervisor/status.js";
|
|
5
|
+
import { readSupervisorFindings, readSupervisorHistory, readSupervisorLogFeed, readSupervisorSnapshot, } from "../core/supervisor/storage.js";
|
|
6
|
+
export function registerSupervisorCommand(program, emit, context) {
|
|
7
|
+
const supervisor = program
|
|
8
|
+
.command("supervisor")
|
|
9
|
+
.description("Run Harnery's optional local diagnostic supervisor");
|
|
10
|
+
supervisor
|
|
11
|
+
.command("start")
|
|
12
|
+
.description("Start the detached local supervisor")
|
|
13
|
+
.option("--root <path>", "Explicit coordination root")
|
|
14
|
+
.option("--interval-ms <milliseconds>", "Collection interval from 500 to 60000 ms", integer)
|
|
15
|
+
.option("--idle-exit-ms <milliseconds>", "Exit after this long without a live dashboard consumer or attributed agent", integer)
|
|
16
|
+
.option("--keep-alive", "Remain resident until explicitly stopped")
|
|
17
|
+
.action(async (options) => {
|
|
18
|
+
try {
|
|
19
|
+
emit.data(await spawnSupervisor(resolve(options.root ?? coordRoot(context)), {
|
|
20
|
+
intervalMs: options.intervalMs,
|
|
21
|
+
idleExitMs: options.idleExitMs,
|
|
22
|
+
keepAlive: options.keepAlive,
|
|
23
|
+
}));
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
fail(emit, "supervisor_start_failed", error);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
supervisor
|
|
30
|
+
.command("status")
|
|
31
|
+
.description("Show supervisor liveness and its latest bounded projections")
|
|
32
|
+
.option("--root <path>", "Explicit coordination root")
|
|
33
|
+
.action((options) => {
|
|
34
|
+
try {
|
|
35
|
+
const root = resolve(options.root ?? coordRoot(context));
|
|
36
|
+
emit.data({
|
|
37
|
+
service: readSupervisorStatus(root),
|
|
38
|
+
snapshot: readSupervisorSnapshot(root),
|
|
39
|
+
history: readSupervisorHistory(root),
|
|
40
|
+
findings: readSupervisorFindings(root),
|
|
41
|
+
hook_health: readSupervisorHookHealth(root),
|
|
42
|
+
log_feed: readSupervisorLogFeed(root),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
fail(emit, "supervisor_status_failed", error);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
supervisor
|
|
50
|
+
.command("stop")
|
|
51
|
+
.description("Request a graceful supervisor stop")
|
|
52
|
+
.option("--root <path>", "Explicit coordination root")
|
|
53
|
+
.action(async (options) => {
|
|
54
|
+
try {
|
|
55
|
+
const root = resolve(options.root ?? coordRoot(context));
|
|
56
|
+
let status = requestSupervisorStop(root);
|
|
57
|
+
const deadline = Date.now() + 5_000;
|
|
58
|
+
while (status.running && Date.now() < deadline) {
|
|
59
|
+
await new Promise((done) => setTimeout(done, 50));
|
|
60
|
+
status = readSupervisorStatus(root);
|
|
61
|
+
}
|
|
62
|
+
emit.data(status);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
fail(emit, "supervisor_stop_failed", error);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
supervisor
|
|
69
|
+
.command("daemon", { hidden: true })
|
|
70
|
+
.description("Internal detached local supervisor entrypoint")
|
|
71
|
+
.option("--root <path>", "Explicit coordination root")
|
|
72
|
+
.option("--interval-ms <milliseconds>", "Collection interval", integer)
|
|
73
|
+
.option("--idle-exit-ms <milliseconds>", "Idle exit interval", integer)
|
|
74
|
+
.option("--keep-alive", "Remain resident until explicitly stopped")
|
|
75
|
+
.action(async (options) => {
|
|
76
|
+
try {
|
|
77
|
+
emit.data(await runSupervisor({
|
|
78
|
+
coordRoot: resolve(options.root ?? coordRoot(context)),
|
|
79
|
+
intervalMs: options.intervalMs,
|
|
80
|
+
idleExitMs: options.idleExitMs,
|
|
81
|
+
keepAlive: options.keepAlive,
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
fail(emit, "supervisor_daemon_failed", error);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
function coordRoot(context) {
|
|
90
|
+
return context?.resolveCoordRoot?.() ?? context?.repoRoot ?? process.cwd();
|
|
91
|
+
}
|
|
92
|
+
function integer(value) {
|
|
93
|
+
const parsed = Number(value);
|
|
94
|
+
if (!Number.isInteger(parsed))
|
|
95
|
+
throw new Error(`expected an integer, got ${value}`);
|
|
96
|
+
return parsed;
|
|
97
|
+
}
|
|
98
|
+
function fail(emit, code, error) {
|
|
99
|
+
emit.error({ code, message: error instanceof Error ? error.message : String(error) });
|
|
100
|
+
emit.setExitCode(1);
|
|
101
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/commands/web.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/commands/web.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA8CnD;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAM1D;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKrE;AAED,iFAAiF;AACjF,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAKhF;AAED,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,GAC9D,MAAM,CAQR;AAmDD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAevE;AAsBD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CA2N5E"}
|
package/dist/commands/web.js
CHANGED
|
@@ -6,6 +6,8 @@ import { fileURLToPath, pathToFileURL } from "node:url";
|
|
|
6
6
|
import { DEFAULT_WEB_PORT, resolveWebPort } from "../core/config.js";
|
|
7
7
|
import { ensureSemanticServiceRunning } from "../core/semantic/service.js";
|
|
8
8
|
import { processLogDestination } from "../core/storage/process-log.js";
|
|
9
|
+
import { ensureSupervisorRunning } from "../core/supervisor/service.js";
|
|
10
|
+
import { registerSupervisorConsumer, unregisterSupervisorConsumer, } from "../core/supervisor/services.js";
|
|
9
11
|
import { parsePerformanceWindow, readWebPerformanceReport, WEB_PERFORMANCE_LOG, } from "../lib/web-performance.js";
|
|
10
12
|
import { lazyFetchWebRoot, webRunner } from "./web-fetch.js";
|
|
11
13
|
/**
|
|
@@ -100,6 +102,17 @@ async function startSemanticServiceWithWeb(coordRoot, emit) {
|
|
|
100
102
|
emit.log(`semantic reader · unavailable (${result.error ?? "startup failed"})`, "warn");
|
|
101
103
|
}
|
|
102
104
|
}
|
|
105
|
+
async function startSupervisorWithWeb(coordRoot, emit) {
|
|
106
|
+
registerSupervisorConsumer(coordRoot, { id: "dashboard" });
|
|
107
|
+
const result = await ensureSupervisorRunning(coordRoot);
|
|
108
|
+
if (result.state === "started")
|
|
109
|
+
emit.log("local supervisor · started automatically", "info");
|
|
110
|
+
if (result.state === "running")
|
|
111
|
+
emit.log("local supervisor · already running", "info");
|
|
112
|
+
if (result.state === "unavailable") {
|
|
113
|
+
emit.log(`local supervisor · unavailable (${result.error})`, "warn");
|
|
114
|
+
}
|
|
115
|
+
}
|
|
103
116
|
/**
|
|
104
117
|
* Resolve the web app root. A local `web/` (source checkout / submodule) wins.
|
|
105
118
|
* Otherwise, on an npm install, lazy-fetch it (clone + install) unless the
|
|
@@ -203,6 +216,7 @@ export function registerWebCommand(program, emit) {
|
|
|
203
216
|
}
|
|
204
217
|
if (!(await requireAvailablePort(emit, port)))
|
|
205
218
|
return;
|
|
219
|
+
await startSupervisorWithWeb(coordRoot, emit);
|
|
206
220
|
await startSemanticServiceWithWeb(coordRoot, emit);
|
|
207
221
|
const heapMb = resolveMaxOldSpaceMb(opts.maxOldSpace);
|
|
208
222
|
const nodeOptions = nodeOptionsWithWebDiagnostics(root, heapMb);
|
|
@@ -232,6 +246,7 @@ export function registerWebCommand(program, emit) {
|
|
|
232
246
|
process.on("SIGINT", () => cleanup("SIGINT"));
|
|
233
247
|
process.on("SIGTERM", () => cleanup("SIGTERM"));
|
|
234
248
|
child.on("exit", (code, sig) => {
|
|
249
|
+
unregisterSupervisorConsumer(coordRoot, "dashboard");
|
|
235
250
|
if (sig) {
|
|
236
251
|
emit.log(`web exited on ${sig}`, "info");
|
|
237
252
|
}
|
|
@@ -292,6 +307,7 @@ export function registerWebCommand(program, emit) {
|
|
|
292
307
|
}
|
|
293
308
|
if (!(await requireAvailablePort(emit, port)))
|
|
294
309
|
return;
|
|
310
|
+
await startSupervisorWithWeb(coordRoot, emit);
|
|
295
311
|
await startSemanticServiceWithWeb(coordRoot, emit);
|
|
296
312
|
const heapMb = resolveMaxOldSpaceMb(opts.maxOldSpace);
|
|
297
313
|
const nodeOptions = nodeOptionsWithWebDiagnostics(root, heapMb);
|
|
@@ -320,6 +336,7 @@ export function registerWebCommand(program, emit) {
|
|
|
320
336
|
process.on("SIGINT", () => cleanup("SIGINT"));
|
|
321
337
|
process.on("SIGTERM", () => cleanup("SIGTERM"));
|
|
322
338
|
child.on("exit", (code) => {
|
|
339
|
+
unregisterSupervisorConsumer(coordRoot, "dashboard");
|
|
323
340
|
process.exitCode = code ?? 0;
|
|
324
341
|
});
|
|
325
342
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/commands/workflow.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/commands/workflow.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA0EnD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAmvBjF"}
|
|
@@ -24,6 +24,7 @@ export function registerWorkflowCommand(program, emit) {
|
|
|
24
24
|
.description("Workflow script (plain JS: `export default async ({agent, parallel, stage, log, evidence, authorize}) => …`)")
|
|
25
25
|
.option("--max-agents <n>", "Total-agent ceiling for the run (default 50)")
|
|
26
26
|
.option("--concurrency <n>", "Concurrent-subagent cap (default 4)")
|
|
27
|
+
.option("--observe-pressure", "Record observer-only local pressure before the first real child dispatch")
|
|
27
28
|
.option("--cwd <dir>", "Working directory children spawn in (default: coord root)")
|
|
28
29
|
.option("--adapter <name>", `Default adapter for agent() calls: ${adapters.join(" | ")} (default claude-code); scripts can override per agent via opts.adapter`)
|
|
29
30
|
.option("--resume-from <run-id>", "Reuse completed agent results from a prior run's transcript; only changed/failed calls re-run")
|
|
@@ -94,6 +95,9 @@ export function registerWorkflowCommand(program, emit) {
|
|
|
94
95
|
allowApiBilling: opts.allowApiBilling,
|
|
95
96
|
maxAgents: opts.maxAgents ? Number.parseInt(opts.maxAgents, 10) : undefined,
|
|
96
97
|
concurrency: opts.concurrency ? Number.parseInt(opts.concurrency, 10) : undefined,
|
|
98
|
+
diagnosticAdmission: opts.observePressure
|
|
99
|
+
? { schema_version: 1, mode: "shadow" }
|
|
100
|
+
: undefined,
|
|
97
101
|
cwd: opts.cwd,
|
|
98
102
|
...adapterProofInputs(registry.list().map((adapter) => adapter.profile), { versionProbe: probeBinaryVersion }),
|
|
99
103
|
policy: opts.policy ? loadPolicyFile(opts.policy) : undefined,
|
package/dist/core/agents/cli.js
CHANGED
|
@@ -621,8 +621,10 @@ async function handleStaleSweep(root, _rest) {
|
|
|
621
621
|
return 0;
|
|
622
622
|
}
|
|
623
623
|
async function handleReconcileFinalization(root) {
|
|
624
|
-
|
|
625
|
-
|
|
624
|
+
// Shares the supervisor composition with `agents reconcile` so session start
|
|
625
|
+
// sweeps the stale cache in the same pass, as ADR 0077 specified.
|
|
626
|
+
const { reconcileCoordinationV3 } = await import("./reconcile-coordination-v3.js");
|
|
627
|
+
const result = reconcileCoordinationV3(root);
|
|
626
628
|
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
627
629
|
return result.diagnostics.some((item) => item === "ledger_not_authority_safe") ? 2 : 0;
|
|
628
630
|
}
|
|
@@ -671,6 +673,7 @@ async function handlePromptContext(root, rest) {
|
|
|
671
673
|
const instanceId = args.instance;
|
|
672
674
|
const sessionId = args.session ?? instanceId;
|
|
673
675
|
const agentName = args.name;
|
|
676
|
+
const adapter = args.adapter;
|
|
674
677
|
const sessionNameNudge = args["session-name-nudge"] === "true";
|
|
675
678
|
const taskNudge = args["task-nudge"] === "true";
|
|
676
679
|
const hostPromptReminder = args["host-prompt-reminder"] === "true";
|
|
@@ -679,7 +682,7 @@ async function handlePromptContext(root, rest) {
|
|
|
679
682
|
// reminder with the adapter-neutral wording.
|
|
680
683
|
const turnRitualNudge = args["turn-ritual-nudge"] === "true" ? "generic" : args["turn-ritual-nudge"];
|
|
681
684
|
if (!instanceId) {
|
|
682
|
-
process.stderr.write("agent-coord prompt-context --instance <id> [--session <id>] [--name <agent-name>] [--session-name-nudge] [--task-nudge] [--host-prompt-reminder] [--status-footer-nudge] [--turn-ritual-nudge <adapter>]\n");
|
|
685
|
+
process.stderr.write("agent-coord prompt-context --instance <id> [--session <id>] [--name <agent-name>] [--adapter <id>] [--session-name-nudge] [--task-nudge] [--host-prompt-reminder] [--status-footer-nudge] [--turn-ritual-nudge <adapter>]\n");
|
|
683
686
|
return 2;
|
|
684
687
|
}
|
|
685
688
|
const { renderPromptContext } = await import("./render/prompt-context.js");
|
|
@@ -693,6 +696,7 @@ async function handlePromptContext(root, rest) {
|
|
|
693
696
|
hostPromptReminder,
|
|
694
697
|
statusFooterNudge,
|
|
695
698
|
turnRitualNudge,
|
|
699
|
+
adapter,
|
|
696
700
|
});
|
|
697
701
|
process.stdout.write(text);
|
|
698
702
|
return 0;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SupervisorCapability, SupervisorSourceReference } from "../supervisor/contract.js";
|
|
2
|
+
export interface CoordinationHealthDiagnostic {
|
|
3
|
+
code: "malformed_json" | "invalid_contract";
|
|
4
|
+
byte_offset: number;
|
|
5
|
+
segment_ordinal: number;
|
|
6
|
+
event_id?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface CoordinationHealthSnapshot {
|
|
9
|
+
observed_at: string;
|
|
10
|
+
capability: SupervisorCapability;
|
|
11
|
+
recent_events: readonly SupervisorSourceReference[];
|
|
12
|
+
diagnostics: readonly CoordinationHealthDiagnostic[];
|
|
13
|
+
omitted_event_count: number;
|
|
14
|
+
}
|
|
15
|
+
/** Read bounded V3 references without retaining event payloads or the full ledger reader. */
|
|
16
|
+
export declare function collectCoordinationHealthSnapshot(coordRoot: string, now?: Date): CoordinationHealthSnapshot;
|
|
17
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/core/agents/health.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAEjG,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,gBAAgB,GAAG,kBAAkB,CAAC;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,oBAAoB,CAAC;IACjC,aAAa,EAAE,SAAS,yBAAyB,EAAE,CAAC;IACpD,WAAW,EAAE,SAAS,4BAA4B,EAAE,CAAC;IACrD,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAMD,6FAA6F;AAC7F,wBAAgB,iCAAiC,CAC/C,SAAS,EAAE,MAAM,EACjB,GAAG,OAAa,GACf,0BAA0B,CA4C5B"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { closeSync, existsSync, lstatSync, openSync, readSync } from "node:fs";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
const MAX_EVENT_REFERENCES = 64;
|
|
4
|
+
const MAX_DIAGNOSTICS = 16;
|
|
5
|
+
const MAX_TAIL_BYTES = 256 * 1_024;
|
|
6
|
+
/** Read bounded V3 references without retaining event payloads or the full ledger reader. */
|
|
7
|
+
export function collectCoordinationHealthSnapshot(coordRoot, now = new Date()) {
|
|
8
|
+
const observedAt = now.toISOString();
|
|
9
|
+
const active = join(resolve(coordRoot), ".harnery", "ledgers", "v3", "active.ndjson");
|
|
10
|
+
if (!existsSync(active))
|
|
11
|
+
return unavailable(observedAt, "ledger-missing");
|
|
12
|
+
let handle;
|
|
13
|
+
try {
|
|
14
|
+
const stat = lstatSync(active);
|
|
15
|
+
if (stat.isSymbolicLink() || !stat.isFile())
|
|
16
|
+
return unavailable(observedAt, "ledger-unsafe");
|
|
17
|
+
if (stat.size === 0)
|
|
18
|
+
return available(observedAt, [], [], 0);
|
|
19
|
+
const start = Math.max(0, stat.size - MAX_TAIL_BYTES);
|
|
20
|
+
const bytes = Buffer.allocUnsafe(stat.size - start);
|
|
21
|
+
handle = openSync(active, "r");
|
|
22
|
+
const count = readSync(handle, bytes, 0, bytes.length, start);
|
|
23
|
+
const lines = bytes.subarray(0, count).toString("utf8").split("\n");
|
|
24
|
+
if (start > 0)
|
|
25
|
+
lines.shift();
|
|
26
|
+
const completeLines = lines.filter((line) => line.length > 0);
|
|
27
|
+
const diagnostics = [];
|
|
28
|
+
const references = [];
|
|
29
|
+
let byteOffset = start;
|
|
30
|
+
for (const line of completeLines) {
|
|
31
|
+
const reference = parseReference(line);
|
|
32
|
+
if (reference)
|
|
33
|
+
references.push(reference);
|
|
34
|
+
else if (diagnostics.length < MAX_DIAGNOSTICS) {
|
|
35
|
+
diagnostics.push({
|
|
36
|
+
code: line.trimStart().startsWith("{") ? "invalid_contract" : "malformed_json",
|
|
37
|
+
byte_offset: byteOffset,
|
|
38
|
+
segment_ordinal: 1,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
byteOffset += Buffer.byteLength(line) + 1;
|
|
42
|
+
}
|
|
43
|
+
const recent = references.slice(-MAX_EVENT_REFERENCES);
|
|
44
|
+
return available(observedAt, recent, diagnostics, Math.max(0, references.length - recent.length) + (start > 0 ? 1 : 0));
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return unavailable(observedAt, "tail-read-failed", "error");
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
if (handle !== undefined)
|
|
51
|
+
closeSync(handle);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function parseReference(line) {
|
|
55
|
+
try {
|
|
56
|
+
const value = JSON.parse(line);
|
|
57
|
+
const contract = object(value.contract);
|
|
58
|
+
const time = object(value.time);
|
|
59
|
+
const producer = object(value.producer);
|
|
60
|
+
if (contract.major !== 3 ||
|
|
61
|
+
typeof value.event_id !== "string" ||
|
|
62
|
+
typeof value.event_type !== "string" ||
|
|
63
|
+
typeof time.observed_at !== "string" ||
|
|
64
|
+
typeof producer.sequence !== "number" ||
|
|
65
|
+
!Number.isSafeInteger(producer.sequence))
|
|
66
|
+
return undefined;
|
|
67
|
+
return {
|
|
68
|
+
id: `v3:${value.event_id}`,
|
|
69
|
+
source_kind: "coordination.v3",
|
|
70
|
+
source_id: value.event_type,
|
|
71
|
+
record_id: value.event_id,
|
|
72
|
+
sequence: producer.sequence,
|
|
73
|
+
schema_version: 3,
|
|
74
|
+
observed_at: time.observed_at,
|
|
75
|
+
capability: "supported",
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function object(value) {
|
|
83
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
84
|
+
? value
|
|
85
|
+
: {};
|
|
86
|
+
}
|
|
87
|
+
function available(observedAt, recentEvents, diagnostics, omittedEventCount) {
|
|
88
|
+
const state = diagnostics.length === 0 ? "supported" : "partial";
|
|
89
|
+
return {
|
|
90
|
+
observed_at: observedAt,
|
|
91
|
+
capability: {
|
|
92
|
+
source_kind: "coordination.v3.references",
|
|
93
|
+
state,
|
|
94
|
+
...(state === "partial" ? { reason_code: diagnostics[0]?.code ?? "tail-invalid" } : {}),
|
|
95
|
+
},
|
|
96
|
+
recent_events: recentEvents.map((reference) => ({ ...reference, capability: state })),
|
|
97
|
+
diagnostics,
|
|
98
|
+
omitted_event_count: omittedEventCount,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function unavailable(observedAt, reasonCode, state = "unsupported") {
|
|
102
|
+
return {
|
|
103
|
+
observed_at: observedAt,
|
|
104
|
+
capability: { source_kind: "coordination.v3.references", state, reason_code: reasonCode },
|
|
105
|
+
recent_events: [],
|
|
106
|
+
diagnostics: [],
|
|
107
|
+
omitted_event_count: 0,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Name-addressed durable mailbox.
|
|
3
|
+
*
|
|
4
|
+
* Peer messaging used to require a live recipient: the sender resolved a name
|
|
5
|
+
* to a running instance and wrote into that instance's journal. Two failures
|
|
6
|
+
* followed from that. A message to a name whose session had ended was refused
|
|
7
|
+
* outright, so the sender spent a long sequence of discovery calls looking for
|
|
8
|
+
* somewhere else to put it. A message to a live peer was accepted but never
|
|
9
|
+
* shown to them, because nothing surfaces another session's journal.
|
|
10
|
+
*
|
|
11
|
+
* This module addresses the durable persona name instead of the instance, so a
|
|
12
|
+
* message can be queued before its recipient exists. Delivery happens on the
|
|
13
|
+
* recipient's side: their next SessionStart or prompt drains the queue, shows
|
|
14
|
+
* the messages, and records them in their journal.
|
|
15
|
+
*
|
|
16
|
+
* Storage: `.harnery/mailbox/<slug>.jsonl`, one JSON record per line, appended
|
|
17
|
+
* by senders and removed by an atomic claim on the recipient's side. Delivered
|
|
18
|
+
* records are appended to `.harnery/mailbox/delivered/<slug>.jsonl` for audit.
|
|
19
|
+
*
|
|
20
|
+
* Related but distinct: `core/inbox` is an instance-keyed transport with a
|
|
21
|
+
* storage-framework service behind it. This mailbox is name-keyed, file-only,
|
|
22
|
+
* and follows the same shape as council manifests and journals.
|
|
23
|
+
*/
|
|
24
|
+
export declare const MAILBOX_MESSAGE_SCHEMA: "harnery.mailbox-message/v1";
|
|
25
|
+
/** Per-message body ceiling. Larger payloads belong in a managed artifact, with
|
|
26
|
+
* the path sent as the message. */
|
|
27
|
+
export declare const MAX_BODY_BYTES = 4000;
|
|
28
|
+
/** Pending messages held for one name before senders are refused. */
|
|
29
|
+
export declare const MAX_PENDING = 25;
|
|
30
|
+
export interface MailboxMessageV1 {
|
|
31
|
+
schema: typeof MAILBOX_MESSAGE_SCHEMA;
|
|
32
|
+
message_id: string;
|
|
33
|
+
/** Bare display name the sender addressed (registry casing when known). */
|
|
34
|
+
to_name: string;
|
|
35
|
+
from_name: string;
|
|
36
|
+
from_instance_id: string;
|
|
37
|
+
created_at: string;
|
|
38
|
+
body: string;
|
|
39
|
+
/** True when the sender already appended this to a live recipient's journal,
|
|
40
|
+
* so the drain surfaces it without writing a duplicate entry. */
|
|
41
|
+
journaled: boolean;
|
|
42
|
+
}
|
|
43
|
+
export type MailboxCapacityReason = "body_limit" | "pending_limit";
|
|
44
|
+
export declare class MailboxCapacityError extends Error {
|
|
45
|
+
readonly reason_code: MailboxCapacityReason;
|
|
46
|
+
readonly current: number;
|
|
47
|
+
readonly limit: number;
|
|
48
|
+
constructor(reason_code: MailboxCapacityReason, current: number, limit: number);
|
|
49
|
+
}
|
|
50
|
+
/** Strip an `agent-` prefix and normalize to the registry's bare form. */
|
|
51
|
+
export declare function bareAgentName(raw: string): string;
|
|
52
|
+
export declare function mailboxDir(coordRoot: string): string;
|
|
53
|
+
export declare function mailboxPath(coordRoot: string, name: string): string;
|
|
54
|
+
/** Every name a message may be addressed to: live sessions, the durable
|
|
55
|
+
* identity registry, and the built-in name pool. A name outside all three is a
|
|
56
|
+
* typo, and queueing it would silently swallow the message. */
|
|
57
|
+
export declare function isAddressableName(coordRoot: string, name: string): boolean;
|
|
58
|
+
/** Names close enough to a miss to be worth suggesting (prefix or one edit). */
|
|
59
|
+
export declare function suggestNames(coordRoot: string, name: string, limit?: number): string[];
|
|
60
|
+
export interface QueueInput {
|
|
61
|
+
coordRoot: string;
|
|
62
|
+
toName: string;
|
|
63
|
+
fromName: string;
|
|
64
|
+
fromInstanceId: string;
|
|
65
|
+
body: string;
|
|
66
|
+
journaled?: boolean;
|
|
67
|
+
}
|
|
68
|
+
export interface QueueResult {
|
|
69
|
+
message: MailboxMessageV1;
|
|
70
|
+
path: string;
|
|
71
|
+
pending: number;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Append one message to a name's mailbox. Throws `MailboxCapacityError` when
|
|
75
|
+
* the body or the pending queue is over its ceiling; the caller turns that into
|
|
76
|
+
* an actionable CLI error.
|
|
77
|
+
*/
|
|
78
|
+
export declare function queueMailboxMessage(input: QueueInput): QueueResult;
|
|
79
|
+
/** Pending messages for a name, without claiming them. */
|
|
80
|
+
export declare function peekMailbox(coordRoot: string, name: string): MailboxMessageV1[];
|
|
81
|
+
/**
|
|
82
|
+
* Claim and return every pending message for a name.
|
|
83
|
+
*
|
|
84
|
+
* The claim is an atomic rename, so two sessions sharing a name cannot deliver
|
|
85
|
+
* the same message twice: whichever rename wins owns the batch. Claimed records
|
|
86
|
+
* are appended to the delivered archive before the claim file is removed, so a
|
|
87
|
+
* crash between the two leaves an auditable copy rather than a silent loss.
|
|
88
|
+
*/
|
|
89
|
+
export declare function drainMailbox(coordRoot: string, name: string): MailboxMessageV1[];
|
|
90
|
+
/** Render a drained batch as the context block a recipient reads. */
|
|
91
|
+
export declare function formatMailboxDelivery(coordRoot: string, messages: readonly MailboxMessageV1[]): string;
|
|
92
|
+
//# sourceMappingURL=mailbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mailbox.d.ts","sourceRoot":"","sources":["../../../src/core/agents/mailbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAqBH,eAAO,MAAM,sBAAsB,EAAG,4BAAqC,CAAC;AAE5E;mCACmC;AACnC,eAAO,MAAM,cAAc,OAAO,CAAC;AACnC,qEAAqE;AACrE,eAAO,MAAM,WAAW,KAAK,CAAC;AAI9B,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,sBAAsB,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb;qEACiE;IACjE,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,qBAAqB,GAAG,YAAY,GAAG,eAAe,CAAC;AAEnE,qBAAa,oBAAqB,SAAQ,KAAK;IAE3C,QAAQ,CAAC,WAAW,EAAE,qBAAqB;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM;gBAFb,WAAW,EAAE,qBAAqB,EAClC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM;CAOzB;AAED,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGjD;AAYD,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnE;AAqBD;;+DAE+D;AAC/D,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAU1E;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,MAAM,EAAE,CAiBjF;AAiBD,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CA6BlE;AAED,0DAA0D;AAC1D,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAa/E;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAmDhF;AA8CD,qEAAqE;AACrE,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,SAAS,gBAAgB,EAAE,GACpC,MAAM,CAcR"}
|