@mono-agent/operator-adapter 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.
Files changed (46) hide show
  1. package/README.md +95 -0
  2. package/dist/index.d.ts +17 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +10 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/live/config.d.ts +27 -0
  7. package/dist/live/config.d.ts.map +1 -0
  8. package/dist/live/config.js +67 -0
  9. package/dist/live/config.js.map +1 -0
  10. package/dist/live/constants.d.ts +18 -0
  11. package/dist/live/constants.d.ts.map +1 -0
  12. package/dist/live/constants.js +18 -0
  13. package/dist/live/constants.js.map +1 -0
  14. package/dist/live/errors.d.ts +12 -0
  15. package/dist/live/errors.d.ts.map +1 -0
  16. package/dist/live/errors.js +7 -0
  17. package/dist/live/errors.js.map +1 -0
  18. package/dist/live/index.d.ts +10 -0
  19. package/dist/live/index.d.ts.map +1 -0
  20. package/dist/live/index.js +8 -0
  21. package/dist/live/index.js.map +1 -0
  22. package/dist/live/server.d.ts +40 -0
  23. package/dist/live/server.d.ts.map +1 -0
  24. package/dist/live/server.js +219 -0
  25. package/dist/live/server.js.map +1 -0
  26. package/dist/tui/config.d.ts +28 -0
  27. package/dist/tui/config.d.ts.map +1 -0
  28. package/dist/tui/config.js +64 -0
  29. package/dist/tui/config.js.map +1 -0
  30. package/dist/tui/constants.d.ts +15 -0
  31. package/dist/tui/constants.d.ts.map +1 -0
  32. package/dist/tui/constants.js +15 -0
  33. package/dist/tui/constants.js.map +1 -0
  34. package/dist/tui/errors.d.ts +12 -0
  35. package/dist/tui/errors.d.ts.map +1 -0
  36. package/dist/tui/errors.js +7 -0
  37. package/dist/tui/errors.js.map +1 -0
  38. package/dist/tui/index.d.ts +8 -0
  39. package/dist/tui/index.d.ts.map +1 -0
  40. package/dist/tui/index.js +5 -0
  41. package/dist/tui/index.js.map +1 -0
  42. package/dist/tui/server.d.ts +74 -0
  43. package/dist/tui/server.d.ts.map +1 -0
  44. package/dist/tui/server.js +292 -0
  45. package/dist/tui/server.js.map +1 -0
  46. package/package.json +35 -0
@@ -0,0 +1,28 @@
1
+ import type { JsonEnvFieldSpec, RedactedSecretValue, SettingsJson } from "@mono-agent/agent-contracts";
2
+ export interface TuiAdapterConfig {
3
+ readonly enabled: boolean;
4
+ readonly host: string;
5
+ readonly port: number;
6
+ readonly basePath: string;
7
+ readonly allowNonLoopback: boolean;
8
+ readonly apiKey?: string;
9
+ }
10
+ export interface RedactedTuiAdapterConfig extends Omit<TuiAdapterConfig, "apiKey"> {
11
+ readonly apiKey: RedactedSecretValue;
12
+ }
13
+ export interface LoadTuiAdapterConfigInput {
14
+ readonly env: Record<string, string | undefined>;
15
+ readonly json?: SettingsJson;
16
+ readonly jsonPath?: string;
17
+ }
18
+ export declare function loadTuiAdapterConfig(input: LoadTuiAdapterConfigInput): Promise<TuiAdapterConfig>;
19
+ export declare function redactTuiAdapterConfig(config: TuiAdapterConfig): RedactedTuiAdapterConfig;
20
+ /**
21
+ * The `tui` section's field registry: the single source of truth both the
22
+ * JSON→env layering below and the app's config provenance view derive from.
23
+ * The `tui.apiKey` id doubles as a cross-package contract: `mono-agent tui`
24
+ * resolves a running agent's key by reading this field from the agent's
25
+ * config file (the trace-source registry never carries secrets).
26
+ */
27
+ export declare const TUI_CONFIG_FIELDS: readonly JsonEnvFieldSpec[];
28
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/tui/config.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAKvG,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,wBAAyB,SAAQ,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC;IAChF,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;CACtC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAcD,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,gBAAgB,CAAC,CAY3B;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,wBAAwB,CASzF;AAED;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,gBAAgB,EAOxD,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { fieldSpecMappings, layerJsonOntoEnv, readBoolean, readInteger, readJsonSection, readSettingsJson, readString, normalizeOptionalString, redactedSecret, } from "@mono-agent/agent-contracts";
2
+ import { DEFAULT_BASE_PATH, DEFAULT_HOST, DEFAULT_PORT } from "./constants.js";
3
+ import { TuiAdapterError } from "./errors.js";
4
+ /**
5
+ * Unlike every chat channel (telegram/slack/…, default OFF), the TUI endpoint
6
+ * is ON by default: it is an operator surface, binds loopback-only on an
7
+ * ephemeral port, and needs no credentials — and `mono-agent tui` must be able
8
+ * to reach any running agent without a per-agent config edit. Set
9
+ * `"tui": { "enabled": false }` to opt out.
10
+ */
11
+ const DEFAULT_ENABLED = true;
12
+ const invalidConfig = (message, details) => new TuiAdapterError("invalid_config", message, details);
13
+ export async function loadTuiAdapterConfig(input) {
14
+ const json = input.json ?? (input.jsonPath === undefined ? {} : (await readSettingsJson(input.jsonPath)).json);
15
+ const env = layerTuiJsonOntoEnv(json, input.env);
16
+ const apiKey = normalizeOptionalString(env.MONO_AGENT_TUI_API_KEY);
17
+ return {
18
+ enabled: readBoolean(env.MONO_AGENT_TUI_ENABLED, "MONO_AGENT_TUI_ENABLED", DEFAULT_ENABLED, invalidConfig),
19
+ host: readString(env.MONO_AGENT_TUI_HOST, DEFAULT_HOST),
20
+ port: readInteger(env.MONO_AGENT_TUI_PORT, "MONO_AGENT_TUI_PORT", DEFAULT_PORT, invalidConfig, { min: 0, max: 65535 }),
21
+ basePath: readBasePath(env.MONO_AGENT_TUI_BASE_PATH),
22
+ allowNonLoopback: readBoolean(env.MONO_AGENT_TUI_ALLOW_NON_LOOPBACK, "MONO_AGENT_TUI_ALLOW_NON_LOOPBACK", false, invalidConfig),
23
+ ...(apiKey === undefined ? {} : { apiKey }),
24
+ };
25
+ }
26
+ export function redactTuiAdapterConfig(config) {
27
+ return {
28
+ enabled: config.enabled,
29
+ host: config.host,
30
+ port: config.port,
31
+ basePath: config.basePath,
32
+ allowNonLoopback: config.allowNonLoopback,
33
+ apiKey: redactedSecret(config.apiKey),
34
+ };
35
+ }
36
+ /**
37
+ * The `tui` section's field registry: the single source of truth both the
38
+ * JSON→env layering below and the app's config provenance view derive from.
39
+ * The `tui.apiKey` id doubles as a cross-package contract: `mono-agent tui`
40
+ * resolves a running agent's key by reading this field from the agent's
41
+ * config file (the trace-source registry never carries secrets).
42
+ */
43
+ export const TUI_CONFIG_FIELDS = [
44
+ { id: "tui.enabled", env: "MONO_AGENT_TUI_ENABLED", kind: "boolean", fromJson: (s) => s.enabled },
45
+ { id: "tui.host", env: "MONO_AGENT_TUI_HOST", fromJson: (s) => s.host },
46
+ { id: "tui.port", env: "MONO_AGENT_TUI_PORT", kind: "integer", fromJson: (s) => s.port },
47
+ { id: "tui.basePath", env: "MONO_AGENT_TUI_BASE_PATH", fromJson: (s) => s.basePath },
48
+ { id: "tui.allowNonLoopback", env: "MONO_AGENT_TUI_ALLOW_NON_LOOPBACK", kind: "boolean", fromJson: (s) => s.allowNonLoopback },
49
+ { id: "tui.apiKey", env: "MONO_AGENT_TUI_API_KEY", secret: true, fromJson: (s) => s.apiKey },
50
+ ];
51
+ function layerTuiJsonOntoEnv(json, env) {
52
+ return layerJsonOntoEnv(env, fieldSpecMappings(readJsonSection(json, "tui"), TUI_CONFIG_FIELDS));
53
+ }
54
+ function readBasePath(raw) {
55
+ const value = readString(raw, DEFAULT_BASE_PATH);
56
+ if (!value.startsWith("/") || value.includes("?") || value.includes("#")) {
57
+ throw invalidConfig("MONO_AGENT_TUI_BASE_PATH must be an absolute path without query or hash.");
58
+ }
59
+ // An all-slashes value ("////") must collapse to "/" — stripping it to ""
60
+ // here would pass config loading and then fail startTuiAdapter at startup.
61
+ const stripped = value.replace(/\/+$/u, "");
62
+ return stripped.length === 0 ? "/" : stripped;
63
+ }
64
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/tui/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare const DEFAULT_HOST = "127.0.0.1";
2
+ export declare const DEFAULT_PORT = 0;
3
+ export declare const DEFAULT_BASE_PATH = "/tui";
4
+ /**
5
+ * Wire schema version surfaced by GET /v1/info so a version-skewed TUI can
6
+ * detect an incompatible agent before starting a turn.
7
+ */
8
+ export declare const TUI_WIRE_SCHEMA = 1;
9
+ /**
10
+ * Upper bound for one serialized NDJSON frame. Oversized payloads (huge tool
11
+ * results / progress chunks) are truncated with a marker rather than stalling
12
+ * or ballooning the socket; the full data remains in the run's JSONL artifacts.
13
+ */
14
+ export declare const MAX_FRAME_BYTES: number;
15
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/tui/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,cAAc,CAAC;AACxC,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,iBAAiB,SAAS,CAAC;AAExC;;;GAGG;AACH,eAAO,MAAM,eAAe,IAAI,CAAC;AAEjC;;;;GAIG;AACH,eAAO,MAAM,eAAe,QAAa,CAAC"}
@@ -0,0 +1,15 @@
1
+ export const DEFAULT_HOST = "127.0.0.1";
2
+ export const DEFAULT_PORT = 0;
3
+ export const DEFAULT_BASE_PATH = "/tui";
4
+ /**
5
+ * Wire schema version surfaced by GET /v1/info so a version-skewed TUI can
6
+ * detect an incompatible agent before starting a turn.
7
+ */
8
+ export const TUI_WIRE_SCHEMA = 1;
9
+ /**
10
+ * Upper bound for one serialized NDJSON frame. Oversized payloads (huge tool
11
+ * results / progress chunks) are truncated with a marker rather than stalling
12
+ * or ballooning the socket; the full data remains in the run's JSONL artifacts.
13
+ */
14
+ export const MAX_FRAME_BYTES = 256 * 1024;
15
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/tui/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC;AACxC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAC9B,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAExC;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AAEjC;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,GAAG,IAAI,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { CodedError } from "@mono-agent/agent-contracts";
2
+ export type TuiAdapterErrorCode = "invalid_config" | "invalid_request" | "missing_required_config" | "unsafe_host" | "start_failed";
3
+ export interface TuiAdapterErrorDetails {
4
+ readonly code?: TuiAdapterErrorCode;
5
+ readonly reason?: string;
6
+ readonly [key: string]: unknown;
7
+ }
8
+ export declare class TuiAdapterError extends CodedError<TuiAdapterErrorCode> {
9
+ readonly details: TuiAdapterErrorDetails;
10
+ constructor(code: TuiAdapterErrorCode, message: string, details?: TuiAdapterErrorDetails);
11
+ }
12
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/tui/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAEzD,MAAM,MAAM,mBAAmB,GAC3B,gBAAgB,GAChB,iBAAiB,GACjB,yBAAyB,GACzB,aAAa,GACb,cAAc,CAAC;AAEnB,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,mBAAmB,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED,qBAAa,eAAgB,SAAQ,UAAU,CAAC,mBAAmB,CAAC;IAClE,SAAiB,OAAO,EAAE,sBAAsB,CAAC;gBAG/C,IAAI,EAAE,mBAAmB,EACzB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,sBAA2B;CAIvC"}
@@ -0,0 +1,7 @@
1
+ import { CodedError } from "@mono-agent/agent-contracts";
2
+ export class TuiAdapterError extends CodedError {
3
+ constructor(code, message, details = {}) {
4
+ super(code, message, details);
5
+ }
6
+ }
7
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/tui/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAezD,MAAM,OAAO,eAAgB,SAAQ,UAA+B;IAGlE,YACE,IAAyB,EACzB,OAAe,EACf,UAAkC,EAAE;QAEpC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ export { TuiAdapterError } from "./errors.js";
2
+ export type { TuiAdapterErrorCode, TuiAdapterErrorDetails } from "./errors.js";
3
+ export { startTuiAdapter } from "./server.js";
4
+ export type { TuiAdapterInfo, TuiAdapterLogger, TuiAdapterOptions, TuiAdapterStartResult, } from "./server.js";
5
+ export { loadTuiAdapterConfig, redactTuiAdapterConfig, TUI_CONFIG_FIELDS, } from "./config.js";
6
+ export type { LoadTuiAdapterConfigInput, RedactedTuiAdapterConfig, TuiAdapterConfig, } from "./config.js";
7
+ export { DEFAULT_BASE_PATH, DEFAULT_HOST, DEFAULT_PORT, MAX_FRAME_BYTES, TUI_WIRE_SCHEMA } from "./constants.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,yBAAyB,EACzB,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { TuiAdapterError } from "./errors.js";
2
+ export { startTuiAdapter } from "./server.js";
3
+ export { loadTuiAdapterConfig, redactTuiAdapterConfig, TUI_CONFIG_FIELDS, } from "./config.js";
4
+ export { DEFAULT_BASE_PATH, DEFAULT_HOST, DEFAULT_PORT, MAX_FRAME_BYTES, TUI_WIRE_SCHEMA } from "./constants.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAO9C,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAMrB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { type AgentResponder } from "@mono-agent/agent-contracts";
2
+ export interface TuiAdapterLogger {
3
+ debug?(message: string, metadata?: Record<string, unknown>): void;
4
+ info?(message: string, metadata?: Record<string, unknown>): void;
5
+ warn?(message: string, metadata?: Record<string, unknown>): void;
6
+ error?(message: string, metadata?: Record<string, unknown>): void;
7
+ }
8
+ /** Static facts surfaced by GET /v1/info so the TUI can label the session. */
9
+ export interface TuiAdapterInfo {
10
+ readonly label?: string;
11
+ readonly model?: string;
12
+ /**
13
+ * The statically configured reasoning-effort level. Per-run overrides
14
+ * (e.g. a per-trigger effort override on a given turn) do NOT flow through
15
+ * here — those arrive via the `run_config` runtime_telemetry event instead.
16
+ */
17
+ readonly effort?: string;
18
+ /**
19
+ * The candidate models a TUI session may switch to — the host's primary model
20
+ * first, then each configured fallback, as canonical reference strings. Absent
21
+ * on older agents; the TUI tolerates that and offers no model picker.
22
+ */
23
+ readonly models?: readonly string[];
24
+ /**
25
+ * Per-model reasoning/effort metadata, keyed by the same canonical ref
26
+ * strings that appear in `models`. Local-provider models resolve a precise
27
+ * `reasoningMode` (`"effort"` with graded `effortLevels`, `"toggle"` for
28
+ * binary thinking, or `"none"`); cloud models degrade to `{ reasoning: true }`
29
+ * with no mode/levels so the TUI falls back to the global effort enum. Absent
30
+ * on older agents; the TUI tolerates that and offers no model-aware picker.
31
+ */
32
+ readonly modelOptions?: Record<string, {
33
+ readonly effortLevels?: readonly string[];
34
+ readonly reasoning?: boolean;
35
+ readonly reasoningMode?: string;
36
+ readonly label?: string;
37
+ }>;
38
+ }
39
+ export interface TuiAdapterOptions {
40
+ readonly host?: string;
41
+ readonly port?: number;
42
+ readonly basePath?: string;
43
+ readonly allowNonLoopback?: boolean;
44
+ readonly apiKey?: string;
45
+ readonly responder: AgentResponder;
46
+ readonly logger?: TuiAdapterLogger;
47
+ /**
48
+ * Static info, OR a provider invoked fresh on every GET /v1/info. Discovery
49
+ * of local-provider models can change after the adapter starts (an endpoint
50
+ * started later, or restarted); a provider lets `/v1/info` reflect that
51
+ * without a restart. The channel composition layer is responsible for
52
+ * caching/rate-limiting any expensive work the provider does — this adapter
53
+ * just calls it (and awaits it) on every request.
54
+ */
55
+ readonly info?: TuiAdapterInfo | (() => TuiAdapterInfo | Promise<TuiAdapterInfo>);
56
+ /**
57
+ * Invoked when the already-listening HTTP server dies (e.g. EADDRINUSE
58
+ * appearing later, socket-level failure). The hosting channel driver maps
59
+ * this to its onFailure hook so the channel flips to "failed" instead of
60
+ * silently serving nothing.
61
+ */
62
+ readonly onServerError?: (reason: string) => void;
63
+ }
64
+ export interface TuiAdapterStartResult {
65
+ readonly url: string;
66
+ readonly baseUrl: string;
67
+ readonly infoUrl: string;
68
+ readonly turnsUrl: string;
69
+ readonly host: string;
70
+ readonly port: number;
71
+ stop(): Promise<void>;
72
+ }
73
+ export declare function startTuiAdapter(options: TuiAdapterOptions): Promise<TuiAdapterStartResult>;
74
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/tui/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAKL,KAAK,cAAc,EAIpB,MAAM,6BAA6B,CAAC;AAerC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAClE,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACjE,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACjE,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACnE;AAED,8EAA8E;AAC9E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC;;;;;;;OAOG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/K;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IACnC;;;;;;;OAOG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,cAAc,GAAG,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IAClF;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA+JhG"}
@@ -0,0 +1,292 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { createServer } from "node:http";
3
+ import { isAgentResponseCancelledError, serializeAgentStreamFrame, } from "@mono-agent/agent-contracts";
4
+ import { assertSafeBind, bearerTokensEqual, close, hostForUrl, listen, normalizeOptionalString, readAuthorizationBearer, } from "@mono-agent/agent-contracts";
5
+ import express, {} from "express";
6
+ import { DEFAULT_BASE_PATH, DEFAULT_HOST, DEFAULT_PORT, MAX_FRAME_BYTES, TUI_WIRE_SCHEMA } from "./constants.js";
7
+ import { TuiAdapterError } from "./errors.js";
8
+ export async function startTuiAdapter(options) {
9
+ if (typeof options.responder?.respond !== "function") {
10
+ throw new TuiAdapterError("invalid_config", "startTuiAdapter requires a responder with respond().");
11
+ }
12
+ const host = options.host ?? DEFAULT_HOST;
13
+ const port = options.port ?? DEFAULT_PORT;
14
+ const basePath = normalizeBasePath(options.basePath ?? DEFAULT_BASE_PATH);
15
+ const apiKey = normalizeOptionalString(options.apiKey);
16
+ assertSafeBind(host, options.allowNonLoopback === true, (boundHost) => new TuiAdapterError("unsafe_host", "TUI adapter refuses to bind a non-loopback host unless allowNonLoopback is true.", { host: boundHost }));
17
+ const app = express();
18
+ const server = createServer(app);
19
+ const infoPath = `${basePath}/v1/info`;
20
+ const turnsPath = `${basePath}/v1/turns`;
21
+ const cancelPath = `${basePath}/v1/conversations/:conversationId/cancel`;
22
+ app.use(express.json({ limit: "1mb" }));
23
+ app.get(infoPath, (req, res) => {
24
+ if (!authorize(req, res, apiKey)) {
25
+ return;
26
+ }
27
+ void resolveInfo(options.info)
28
+ .then((info) => {
29
+ res.status(200).json({
30
+ schema: TUI_WIRE_SCHEMA,
31
+ pid: process.pid,
32
+ ...(info?.label === undefined ? {} : { label: info.label }),
33
+ ...(info?.model === undefined ? {} : { model: info.model }),
34
+ ...(info?.effort === undefined ? {} : { effort: info.effort }),
35
+ ...(info?.models === undefined || info.models.length === 0 ? {} : { models: info.models }),
36
+ ...(info?.modelOptions === undefined || Object.keys(info.modelOptions).length === 0
37
+ ? {}
38
+ : { modelOptions: info.modelOptions }),
39
+ });
40
+ })
41
+ .catch((error) => {
42
+ options.logger?.error?.("TUI info provider failed.", { error: errorToMessage(error) });
43
+ sendJsonError(res, 500, error);
44
+ });
45
+ });
46
+ app.post(turnsPath, (req, res) => {
47
+ if (!authorize(req, res, apiKey)) {
48
+ return;
49
+ }
50
+ void handleTurn(req, res).catch((error) => {
51
+ options.logger?.error?.("TUI turn failed before response.", { error: errorToMessage(error) });
52
+ if (!res.headersSent) {
53
+ sendJsonError(res, error instanceof TuiAdapterError && error.code === "invalid_request" ? 400 : 500, error);
54
+ }
55
+ });
56
+ });
57
+ app.post(cancelPath, (req, res) => {
58
+ if (!authorize(req, res, apiKey)) {
59
+ return;
60
+ }
61
+ const rawConversationId = req.params.conversationId;
62
+ const conversationId = normalizeOptionalString(typeof rawConversationId === "string" ? rawConversationId : undefined);
63
+ if (conversationId === undefined) {
64
+ sendJsonError(res, 400, new TuiAdapterError("invalid_request", "conversationId is required."));
65
+ return;
66
+ }
67
+ if (typeof options.responder.cancel !== "function") {
68
+ sendJsonError(res, 501, new TuiAdapterError("invalid_request", "This responder does not support cancel."));
69
+ return;
70
+ }
71
+ options.responder.cancel(conversationId, "tui_cancel");
72
+ res.status(202).json({ cancelled: conversationId });
73
+ });
74
+ app.use((error, _req, res, next) => {
75
+ if (res.headersSent) {
76
+ next(error);
77
+ return;
78
+ }
79
+ // 400 only for client mistakes (invalid_request, body-parse SyntaxError);
80
+ // anything else is a server-side failure and must read as one.
81
+ const isClientError = codeOf(error) === "invalid_request" ||
82
+ (error instanceof SyntaxError && error.status === 400);
83
+ sendJsonError(res, isClientError ? 400 : 500, error);
84
+ });
85
+ const address = await listen(server, port, host, {
86
+ listenFailed: (reason) => new TuiAdapterError("start_failed", "TUI adapter failed to listen.", { reason }),
87
+ noAddress: () => new TuiAdapterError("start_failed", "TUI adapter did not receive a TCP address."),
88
+ });
89
+ server.on("error", (error) => {
90
+ options.onServerError?.(errorToMessage(error));
91
+ });
92
+ const boundPort = address.port;
93
+ const url = `http://${hostForUrl(host)}:${boundPort}`;
94
+ async function handleTurn(req, res) {
95
+ const body = normalizeTurnBody(req.body);
96
+ const controller = new AbortController();
97
+ const requestId = randomUUID();
98
+ const request = {
99
+ conversationId: body.conversationId,
100
+ text: body.text,
101
+ abortSignal: controller.signal,
102
+ metadata: { ...body.metadata, source: "tui", tuiRequestId: requestId },
103
+ };
104
+ res.status(200);
105
+ res.setHeader("Content-Type", "application/x-ndjson");
106
+ res.setHeader("Cache-Control", "no-cache");
107
+ res.socket?.setNoDelay(true);
108
+ res.flushHeaders();
109
+ res.once("close", () => {
110
+ if (!res.writableEnded) {
111
+ controller.abort(new Error("TUI client disconnected."));
112
+ }
113
+ });
114
+ const stream = new NdjsonMessageStream(res);
115
+ try {
116
+ const response = await options.responder.respond(request, stream);
117
+ stream.writeFrame({
118
+ kind: "finish",
119
+ ...(response.text === undefined ? {} : { finalText: response.text }),
120
+ ...(response.metadata === undefined ? {} : { metadata: response.metadata }),
121
+ });
122
+ }
123
+ catch (error) {
124
+ const cancelled = isAgentResponseCancelledError(error) || controller.signal.aborted;
125
+ const code = codeOf(error);
126
+ stream.writeFrame({
127
+ kind: "error",
128
+ message: errorToMessage(error),
129
+ ...(code === undefined ? {} : { code }),
130
+ cancelled,
131
+ });
132
+ }
133
+ finally {
134
+ res.end();
135
+ }
136
+ }
137
+ return {
138
+ url,
139
+ baseUrl: `${url}${basePath}`,
140
+ infoUrl: `${url}${infoPath}`,
141
+ turnsUrl: `${url}${turnsPath}`,
142
+ host,
143
+ port: boundPort,
144
+ async stop() {
145
+ await close(server);
146
+ },
147
+ };
148
+ }
149
+ /**
150
+ * Serializes each AgentMessageStream callback as one NDJSON frame. Writes are
151
+ * fire-and-forget: a slow TUI must never stall the harness, so backpressure is
152
+ * absorbed by the socket buffer and oversized event payloads are truncated.
153
+ */
154
+ class NdjsonMessageStream {
155
+ res;
156
+ constructor(res) {
157
+ this.res = res;
158
+ }
159
+ writeFrame(frame) {
160
+ if (this.res.writableEnded) {
161
+ return;
162
+ }
163
+ let line = serializeAgentStreamFrame(frame);
164
+ if (Buffer.byteLength(line, "utf8") > MAX_FRAME_BYTES && frame.kind === "event") {
165
+ line = serializeAgentStreamFrame({ kind: "event", event: truncateEvent(frame.event) });
166
+ }
167
+ this.res.write(line);
168
+ }
169
+ async status(text) {
170
+ this.writeFrame({ kind: "status", text });
171
+ }
172
+ async append(delta) {
173
+ this.writeFrame({ kind: "append", delta });
174
+ }
175
+ async replace(text) {
176
+ this.writeFrame({ kind: "replace", text });
177
+ }
178
+ async event(event) {
179
+ this.writeFrame({ kind: "event", event });
180
+ }
181
+ async finish() {
182
+ // The terminal "finish" frame is written by handleTurn from the responder's
183
+ // AgentResponse (which carries metadata); mid-stream finish() is a no-op.
184
+ }
185
+ }
186
+ /**
187
+ * Shrink the unbounded fields (tool results / progress) of an oversized event
188
+ * and mark the truncation. The full payload stays available in run artifacts.
189
+ */
190
+ function truncateEvent(event) {
191
+ const cap = MAX_FRAME_BYTES / 2;
192
+ if (event.type === "tool_call_progress") {
193
+ return {
194
+ ...event,
195
+ partialResult: truncateUnknown(event.partialResult, cap),
196
+ metadata: { ...event.metadata, truncated: true },
197
+ };
198
+ }
199
+ if (event.type === "tool_call_completed") {
200
+ return {
201
+ ...event,
202
+ content: truncateUnknown(event.content, cap),
203
+ ...(event.arguments === undefined ? {} : { arguments: truncateUnknown(event.arguments, cap) }),
204
+ metadata: { ...event.metadata, truncated: true },
205
+ };
206
+ }
207
+ if (event.type === "tool_call_started") {
208
+ return {
209
+ ...event,
210
+ arguments: truncateUnknown(event.arguments, cap),
211
+ metadata: { ...event.metadata, truncated: true },
212
+ };
213
+ }
214
+ if (event.type === "assistant_thought") {
215
+ return {
216
+ ...event,
217
+ text: event.text.slice(0, cap),
218
+ metadata: { ...event.metadata, truncated: true },
219
+ };
220
+ }
221
+ // Remaining variants are small fixed shapes; if one still overflows, stringify-and-cut.
222
+ return {
223
+ type: "runtime_telemetry",
224
+ kind: "oversized_event",
225
+ data: { originalType: event.type, preview: JSON.stringify(event).slice(0, 1024) },
226
+ metadata: { truncated: true },
227
+ };
228
+ }
229
+ function truncateUnknown(value, cap) {
230
+ const text = typeof value === "string" ? value : JSON.stringify(value) ?? "";
231
+ return text.length > cap ? `${text.slice(0, cap)}… [truncated]` : text;
232
+ }
233
+ function normalizeTurnBody(body) {
234
+ if (typeof body !== "object" || body === null) {
235
+ throw new TuiAdapterError("invalid_request", "Request body must be a JSON object.");
236
+ }
237
+ const record = body;
238
+ const conversationId = normalizeOptionalString(typeof record.conversationId === "string" ? record.conversationId : undefined);
239
+ const text = typeof record.text === "string" ? record.text : undefined;
240
+ if (conversationId === undefined) {
241
+ throw new TuiAdapterError("invalid_request", "conversationId is required.");
242
+ }
243
+ if (text === undefined || text.length === 0) {
244
+ throw new TuiAdapterError("invalid_request", "text is required.");
245
+ }
246
+ const metadata = typeof record.metadata === "object" && record.metadata !== null && !Array.isArray(record.metadata)
247
+ ? record.metadata
248
+ : {};
249
+ return { conversationId, text, metadata };
250
+ }
251
+ async function resolveInfo(info) {
252
+ if (typeof info === "function") {
253
+ return await info();
254
+ }
255
+ return info;
256
+ }
257
+ function authorize(req, res, apiKey) {
258
+ if (apiKey === undefined) {
259
+ return true;
260
+ }
261
+ const presented = readAuthorizationBearer(req.header("authorization"));
262
+ if (presented !== undefined && bearerTokensEqual(presented, apiKey)) {
263
+ return true;
264
+ }
265
+ res.status(401).json({ error: { message: "Invalid API key.", code: "invalid_api_key" } });
266
+ return false;
267
+ }
268
+ function sendJsonError(res, status, error) {
269
+ res.status(status).json({
270
+ error: {
271
+ message: errorToMessage(error),
272
+ ...(codeOf(error) === undefined ? {} : { code: codeOf(error) }),
273
+ },
274
+ });
275
+ }
276
+ function codeOf(error) {
277
+ const candidate = error?.code;
278
+ return typeof candidate === "string" ? candidate : undefined;
279
+ }
280
+ function errorToMessage(error) {
281
+ if (error instanceof Error && error.message.length > 0) {
282
+ return error.message;
283
+ }
284
+ return String(error);
285
+ }
286
+ function normalizeBasePath(basePath) {
287
+ if (!basePath.startsWith("/")) {
288
+ throw new TuiAdapterError("invalid_config", "basePath must start with '/'.");
289
+ }
290
+ return basePath.length === 1 ? "" : basePath.replace(/\/+$/u, "");
291
+ }
292
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/tui/server.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@mono-agent/operator-adapter",
3
+ "version": "0.4.1",
4
+ "description": "Loopback operator adapters for mono-agent: full-fidelity TUI NDJSON turns and read-only live SSE run-event streams.",
5
+ "type": "module",
6
+ "license": "UNLICENSED",
7
+ "private": false,
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md"
19
+ ],
20
+ "dependencies": {
21
+ "@mono-agent/agent-contracts": "0.4.1",
22
+ "express": "^5.1.0"
23
+ },
24
+ "devDependencies": {
25
+ "@types/express": "^5.0.2"
26
+ },
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "scripts": {
31
+ "build": "tsc -p tsconfig.build.json",
32
+ "typecheck": "tsc -p tsconfig.json --noEmit",
33
+ "test": "vitest run --passWithNoTests"
34
+ }
35
+ }