omniharness-cli 0.1.16 → 0.1.18

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 CHANGED
@@ -6,13 +6,14 @@ models, drives capability-based agents, verifies results, repairs failures, and
6
6
  learns from past outcomes — while OmniRoute stays responsible for routing model
7
7
  requests to providers.
8
8
 
9
- This package is a thin wrapper around the self-contained OmniHarness binary;
10
- the `omniharness` command is the binary itself.
9
+ This package installs the TypeScript/Ink OmniHarness terminal UI; the `omniharness` command launches the bundled CLI.
11
10
 
12
11
  ## Install
13
12
 
14
13
  ```sh
15
14
  npm install -g omniharness-cli
15
+ # If PowerShell still cannot find it, open a new terminal so npm's global bin
16
+ # directory is reloaded into PATH.
16
17
  ```
17
18
 
18
19
  ## Quick start
@@ -42,8 +43,7 @@ config, sessions, logs, or telemetry. The key is redacted from all output;
42
43
 
43
44
  ## Notes
44
45
 
45
- - Only `win32-x64` is shipped in this version; other platforms can be added by
46
- building the Go binary and publishing a new release.
46
+ - Node.js 20 or newer is required to run the CLI.
47
47
  - Publishing is automatic: every push to `main` on GitHub runs
48
48
  `.github/workflows/publish.yml`, which bumps the version, verifies
49
49
  (vet + tests), builds, and publishes via **npm trusted publishing (OIDC)**
package/cli.js ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const { spawnSync } = require('node:child_process');
5
+ const path = require('node:path');
6
+
7
+ const result = spawnSync(process.execPath, [path.join(__dirname, 'dist', 'cli.js'), ...process.argv.slice(2)], {
8
+ stdio: 'inherit',
9
+ });
10
+
11
+ if (result.error) {
12
+ console.error(`omniharness-cli: failed to launch: ${result.error.message}`);
13
+ process.exit(1);
14
+ }
15
+ process.exit(result.status ?? 1);
@@ -0,0 +1,19 @@
1
+ import { Agent } from '@mastra/core/agent';
2
+ import { OmniRouteClient } from '../config/omniRoute.js';
3
+ import type { HarnessState } from '../types/index.js';
4
+ import { type SystemTools } from '../tools/systemTools.js';
5
+ export interface MastraEngineConfig {
6
+ workspaceRoot: string;
7
+ model?: string;
8
+ endpoint?: string;
9
+ apiKey?: string;
10
+ shellAllowed?: boolean;
11
+ }
12
+ export interface MastraEngine {
13
+ readonly agent: Agent;
14
+ readonly client: OmniRouteClient;
15
+ readonly tools: SystemTools;
16
+ readonly state: HarnessState;
17
+ run(prompt: string, signal?: AbortSignal): Promise<string>;
18
+ }
19
+ export declare function createMastraEngine(config: MastraEngineConfig): MastraEngine;
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMastraEngine = createMastraEngine;
4
+ const agent_1 = require("@mastra/core/agent");
5
+ const tools_1 = require("@mastra/core/tools");
6
+ const zod_1 = require("zod");
7
+ const omniRoute_js_1 = require("../config/omniRoute.js");
8
+ const systemTools_js_1 = require("../tools/systemTools.js");
9
+ function mastraTool(tool, inputSchema, outputSchema) {
10
+ return (0, tools_1.createTool)({
11
+ id: tool.name,
12
+ description: tool.description,
13
+ inputSchema,
14
+ outputSchema,
15
+ execute: (input) => tool.execute(input),
16
+ });
17
+ }
18
+ function omniRouteModel(client, model) {
19
+ return {
20
+ specificationVersion: 'v1',
21
+ provider: 'omniroute',
22
+ modelId: model,
23
+ defaultObjectGenerationMode: 'json',
24
+ doGenerate: async (options) => {
25
+ const messages = [];
26
+ for (const part of options.prompt) {
27
+ if (part.role === 'system')
28
+ messages.push({ role: 'system', content: part.content });
29
+ else if (part.role === 'user' || part.role === 'assistant') {
30
+ const content = typeof part.content === 'string' ? part.content : part.content.map((item) => item.type === 'text' ? item.text : '').join('');
31
+ messages.push({ role: part.role, content });
32
+ }
33
+ }
34
+ const result = await client.chat(model, messages, options.abortSignal);
35
+ return {
36
+ text: result.content,
37
+ finishReason: 'stop',
38
+ usage: {
39
+ promptTokens: result.usage?.inputTokens ?? 0,
40
+ completionTokens: result.usage?.outputTokens ?? 0,
41
+ },
42
+ rawCall: { rawPrompt: JSON.stringify(options.prompt), rawSettings: {} },
43
+ rawResponse: { headers: Object.fromEntries(result.headers.entries()) },
44
+ warnings: [],
45
+ };
46
+ },
47
+ doStream: async () => { throw new Error('streaming is not enabled by this adapter'); },
48
+ };
49
+ }
50
+ function createMastraEngine(config) {
51
+ const client = new omniRoute_js_1.OmniRouteClient({ endpoint: config.endpoint, apiKey: config.apiKey });
52
+ const tools = (0, systemTools_js_1.createSystemTools)(config.workspaceRoot, config.shellAllowed ?? false);
53
+ const activeModel = config.model ?? 'auto/best-coding';
54
+ const agent = new agent_1.Agent({
55
+ name: 'omniharness-developer',
56
+ instructions: 'You are a careful autonomous developer. Inspect context before editing. Explain actions briefly, use tools only inside the workspace, and never claim verification without running it.',
57
+ model: omniRouteModel(client, activeModel),
58
+ tools: {
59
+ read_file: mastraTool(tools.readFile, zod_1.z.object({ path: zod_1.z.string().min(1) }), zod_1.z.object({ path: zod_1.z.string(), content: zod_1.z.string() })),
60
+ write_file: mastraTool(tools.writeFile, zod_1.z.object({ path: zod_1.z.string().min(1), content: zod_1.z.string() }), zod_1.z.object({ path: zod_1.z.string(), bytes: zod_1.z.number() })),
61
+ run_command: mastraTool(tools.runCommand, zod_1.z.object({ command: zod_1.z.string().min(1), args: zod_1.z.array(zod_1.z.string()).optional() }), zod_1.z.object({ stdout: zod_1.z.string(), stderr: zod_1.z.string(), code: zod_1.z.number() })),
62
+ index_workspace: mastraTool(tools.indexWorkspace, zod_1.z.void(), zod_1.z.object({ root: zod_1.z.string(), indexedAt: zod_1.z.string().nullable(), files: zod_1.z.array(zod_1.z.unknown()).readonly(), contextLocked: zod_1.z.boolean() })),
63
+ git_diff: mastraTool(tools.gitDiff, zod_1.z.void(), zod_1.z.string()),
64
+ },
65
+ });
66
+ const state = {
67
+ taskStatus: 'idle', prompt: '', activeModel,
68
+ workspace: { root: config.workspaceRoot, indexedAt: null, files: [], contextLocked: false },
69
+ metrics: client.snapshotMetrics(), messages: [],
70
+ };
71
+ return {
72
+ agent, client, tools, state,
73
+ async run(prompt, signal) {
74
+ state.prompt = prompt;
75
+ state.taskStatus = 'running';
76
+ const messages = [...state.messages, { role: 'user', content: prompt, createdAt: new Date().toISOString() }];
77
+ const result = await client.chat(state.activeModel, messages.map(({ role, content }) => ({ role: role === 'user' ? 'user' : 'assistant', content })), signal);
78
+ state.taskStatus = 'completed';
79
+ state.metrics = client.snapshotMetrics();
80
+ state.messages = [...messages, { role: 'assistant', content: result.content, createdAt: new Date().toISOString() }];
81
+ return result.content;
82
+ },
83
+ };
84
+ }
85
+ //# sourceMappingURL=mastraEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mastraEngine.js","sourceRoot":"","sources":["../../src/agent/mastraEngine.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const ink_1 = require("ink");
6
+ const mastraEngine_js_1 = require("./agent/mastraEngine.js");
7
+ const terminalInterface_js_1 = require("./ui/terminalInterface.js");
8
+ const engine = (0, mastraEngine_js_1.createMastraEngine)({ workspaceRoot: process.cwd() });
9
+ (0, ink_1.render)((0, jsx_runtime_1.jsx)(terminalInterface_js_1.TerminalInterface, { engine: engine }));
10
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":";;;;AAEA,6BAA6B;AAC7B,6DAA6D;AAC7D,oEAA8D;AAE9D,MAAM,MAAM,GAAG,IAAA,oCAAkB,EAAC,EAAE,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACpE,IAAA,YAAM,EAAC,uBAAC,wCAAiB,IAAC,MAAM,EAAE,MAAM,GAAI,CAAC,CAAC"}
@@ -0,0 +1,52 @@
1
+ import type { OmniRouteMetrics } from '../types/index.js';
2
+ export interface OmniRouteConfig {
3
+ endpoint?: string;
4
+ apiKey?: string;
5
+ timeoutMs?: number;
6
+ }
7
+ export interface OmniRouteCombo {
8
+ name: string;
9
+ strategy?: string;
10
+ models: readonly {
11
+ model?: string;
12
+ providerId?: string;
13
+ kind?: string;
14
+ }[];
15
+ isDefault?: boolean;
16
+ }
17
+ export interface ChatMessage {
18
+ role: 'system' | 'user' | 'assistant' | 'tool';
19
+ content: string;
20
+ }
21
+ export interface ChatResult {
22
+ content: string;
23
+ model: string;
24
+ usage?: {
25
+ inputTokens: number;
26
+ outputTokens: number;
27
+ totalTokens: number;
28
+ };
29
+ headers: Headers;
30
+ }
31
+ export declare class OmniRouteError extends Error {
32
+ readonly status: number;
33
+ constructor(status: number, message: string);
34
+ }
35
+ export declare class OmniRouteClient {
36
+ readonly endpoint: string;
37
+ private readonly timeoutMs;
38
+ private apiKey;
39
+ private readonly metrics;
40
+ constructor(config?: OmniRouteConfig);
41
+ setApiKey(apiKey: string): void;
42
+ snapshotMetrics(): OmniRouteMetrics;
43
+ listCombos(signal?: AbortSignal): Promise<readonly OmniRouteCombo[]>;
44
+ chat(model: string, messages: readonly ChatMessage[], signal?: AbortSignal): Promise<ChatResult>;
45
+ private request;
46
+ private updateMetrics;
47
+ private safeBody;
48
+ private headerNumber;
49
+ private number;
50
+ private isRecord;
51
+ private combineSignals;
52
+ }
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OmniRouteClient = exports.OmniRouteError = void 0;
4
+ class OmniRouteError extends Error {
5
+ status;
6
+ constructor(status, message) {
7
+ super(`OmniRoute ${status}: ${message}`);
8
+ this.status = status;
9
+ this.name = 'OmniRouteError';
10
+ }
11
+ }
12
+ exports.OmniRouteError = OmniRouteError;
13
+ const DEFAULT_ENDPOINT = 'http://localhost:20128';
14
+ class OmniRouteClient {
15
+ endpoint;
16
+ timeoutMs;
17
+ apiKey;
18
+ metrics = {
19
+ compression: { inputTokens: 0, compressedTokens: 0, ratio: 1, strategy: 'none', updatedAt: new Date().toISOString() },
20
+ fallback: { attempts: 0 },
21
+ requestCount: 0,
22
+ };
23
+ constructor(config = {}) {
24
+ this.endpoint = (config.endpoint ?? process.env.OMNIROUTE_URL ?? DEFAULT_ENDPOINT).replace(/\/$/, '');
25
+ this.apiKey = config.apiKey ?? process.env.OMNIROUTE_API_KEY ?? '';
26
+ this.timeoutMs = config.timeoutMs ?? 120_000;
27
+ }
28
+ setApiKey(apiKey) {
29
+ this.apiKey = apiKey.trim();
30
+ }
31
+ snapshotMetrics() {
32
+ return structuredClone(this.metrics);
33
+ }
34
+ async listCombos(signal) {
35
+ const response = await this.request('/v1/combos', { method: 'GET', signal });
36
+ const payload = await response.json();
37
+ if (Array.isArray(payload))
38
+ return payload;
39
+ if (this.isRecord(payload) && Array.isArray(payload.combos))
40
+ return payload.combos;
41
+ throw new OmniRouteError(response.status, 'invalid combos response');
42
+ }
43
+ async chat(model, messages, signal) {
44
+ const response = await this.request('/chat/completions', {
45
+ method: 'POST',
46
+ signal,
47
+ headers: { 'content-type': 'application/json' },
48
+ body: JSON.stringify({ model, messages, stream: false }),
49
+ });
50
+ const payload = await response.json();
51
+ if (!this.isRecord(payload) || !Array.isArray(payload.choices) || payload.choices.length === 0) {
52
+ throw new OmniRouteError(response.status, 'invalid chat response');
53
+ }
54
+ const choice = payload.choices[0];
55
+ const message = this.isRecord(choice) && this.isRecord(choice.message) ? choice.message : {};
56
+ const usage = this.isRecord(payload.usage) ? payload.usage : undefined;
57
+ return {
58
+ content: typeof message.content === 'string' ? message.content : '',
59
+ model,
60
+ usage: usage ? {
61
+ inputTokens: this.number(usage.prompt_tokens),
62
+ outputTokens: this.number(usage.completion_tokens),
63
+ totalTokens: this.number(usage.total_tokens),
64
+ } : undefined,
65
+ headers: response.headers,
66
+ };
67
+ }
68
+ async request(path, init) {
69
+ const controller = new AbortController();
70
+ const timer = setTimeout(() => controller.abort(), this.timeoutMs);
71
+ const signal = init.signal ? this.combineSignals(init.signal, controller.signal) : controller.signal;
72
+ const headers = new Headers(init.headers);
73
+ if (this.apiKey)
74
+ headers.set('authorization', `Bearer ${this.apiKey}`);
75
+ headers.set('x-omniharness-client', 'omniharness');
76
+ headers.set('x-omniharness-metrics', 'tokens,compression,fallback,quota');
77
+ this.metrics.requestCount += 1;
78
+ try {
79
+ const response = await fetch(`${this.endpoint}${path}`, { ...init, headers, signal });
80
+ this.updateMetrics(response.headers);
81
+ if (!response.ok)
82
+ throw new OmniRouteError(response.status, await this.safeBody(response));
83
+ return response;
84
+ }
85
+ finally {
86
+ clearTimeout(timer);
87
+ }
88
+ }
89
+ updateMetrics(headers) {
90
+ const compression = this.metrics.compression;
91
+ const input = this.headerNumber(headers, 'x-omniroute-input-tokens');
92
+ const compressed = this.headerNumber(headers, 'x-omniroute-compressed-tokens');
93
+ if (input !== undefined && compressed !== undefined && input > 0) {
94
+ compression.inputTokens = input;
95
+ compression.compressedTokens = compressed;
96
+ compression.ratio = compressed / input;
97
+ compression.strategy = headers.get('x-omniroute-compression') ?? 'none';
98
+ compression.updatedAt = new Date().toISOString();
99
+ }
100
+ const fallback = this.metrics.fallback;
101
+ fallback.activeProvider = headers.get('x-omniroute-provider') ?? fallback.activeProvider;
102
+ fallback.lastFailure = headers.get('x-omniroute-fallback-reason') ?? fallback.lastFailure;
103
+ const attempts = this.headerNumber(headers, 'x-omniroute-fallback-attempts');
104
+ if (attempts !== undefined)
105
+ fallback.attempts = attempts;
106
+ const cooldown = headers.get('x-omniroute-cooldown-until');
107
+ if (cooldown)
108
+ fallback.cooldownUntil = cooldown;
109
+ const quota = this.headerNumber(headers, 'x-omniroute-remaining-quota');
110
+ if (quota !== undefined)
111
+ this.metrics.remainingQuota = quota;
112
+ }
113
+ async safeBody(response) {
114
+ const body = await response.text();
115
+ return body.slice(0, 500).replace(this.apiKey, '[REDACTED]');
116
+ }
117
+ headerNumber(headers, name) {
118
+ const value = headers.get(name);
119
+ if (value === null)
120
+ return undefined;
121
+ const parsed = Number(value);
122
+ return Number.isFinite(parsed) ? parsed : undefined;
123
+ }
124
+ number(value) {
125
+ return typeof value === 'number' && Number.isFinite(value) ? value : 0;
126
+ }
127
+ isRecord(value) {
128
+ return typeof value === 'object' && value !== null;
129
+ }
130
+ combineSignals(first, second) {
131
+ const controller = new AbortController();
132
+ const abort = () => controller.abort();
133
+ if (first.aborted || second.aborted) {
134
+ controller.abort();
135
+ return controller.signal;
136
+ }
137
+ first.addEventListener('abort', abort, { once: true });
138
+ second.addEventListener('abort', abort, { once: true });
139
+ return controller.signal;
140
+ }
141
+ }
142
+ exports.OmniRouteClient = OmniRouteClient;
143
+ //# sourceMappingURL=omniRoute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omniRoute.js","sourceRoot":"","sources":["../../src/config/omniRoute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { AgentToolDeclaration, WorkspaceState } from '../types/index.js';
2
+ export interface SystemTools {
3
+ readFile: AgentToolDeclaration<{
4
+ path: string;
5
+ }, {
6
+ path: string;
7
+ content: string;
8
+ }>;
9
+ writeFile: AgentToolDeclaration<{
10
+ path: string;
11
+ content: string;
12
+ }, {
13
+ path: string;
14
+ bytes: number;
15
+ }>;
16
+ runCommand: AgentToolDeclaration<{
17
+ command: string;
18
+ args?: readonly string[];
19
+ }, {
20
+ stdout: string;
21
+ stderr: string;
22
+ code: number;
23
+ }>;
24
+ indexWorkspace: AgentToolDeclaration<void, WorkspaceState>;
25
+ gitDiff: AgentToolDeclaration<void, string>;
26
+ }
27
+ export declare function createSystemTools(workspaceRoot: string, shellAllowed?: boolean): SystemTools;
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createSystemTools = createSystemTools;
7
+ const node_child_process_1 = require("node:child_process");
8
+ const node_fs_1 = require("node:fs");
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const node_util_1 = require("node:util");
11
+ const zod_1 = require("zod");
12
+ const execFileAsync = (0, node_util_1.promisify)(node_child_process_1.execFile);
13
+ const MAX_OUTPUT = 32_000;
14
+ const relativePath = zod_1.z.string().min(1).refine((value) => !node_path_1.default.isAbsolute(value) && value !== '..' && !value.startsWith(`..${node_path_1.default.sep}`));
15
+ function within(root, target) {
16
+ const absoluteRoot = node_path_1.default.resolve(root);
17
+ const absoluteTarget = node_path_1.default.resolve(root, target);
18
+ const relative = node_path_1.default.relative(absoluteRoot, absoluteTarget);
19
+ if (relative.startsWith('..') || node_path_1.default.isAbsolute(relative))
20
+ throw new Error('path escapes workspace root');
21
+ return absoluteTarget;
22
+ }
23
+ function createSystemTools(workspaceRoot, shellAllowed = false) {
24
+ const root = node_path_1.default.resolve(workspaceRoot);
25
+ const readFile = {
26
+ name: 'read_file', description: 'Read a UTF-8 file inside the workspace.', risk: 'low', inputSchema: { path: 'relative file path' },
27
+ async execute(input) {
28
+ const parsed = relativePath.parse(input.path);
29
+ const target = within(root, parsed);
30
+ return { path: parsed, content: await node_fs_1.promises.readFile(target, 'utf8') };
31
+ },
32
+ };
33
+ const writeFile = {
34
+ name: 'write_file', description: 'Write a UTF-8 file inside the workspace.', risk: 'high', inputSchema: { path: 'relative file path', content: 'file contents' },
35
+ async execute(input) {
36
+ const parsed = relativePath.parse(input.path);
37
+ const target = within(root, parsed);
38
+ await node_fs_1.promises.mkdir(node_path_1.default.dirname(target), { recursive: true });
39
+ await node_fs_1.promises.writeFile(target, input.content, 'utf8');
40
+ return { path: parsed, bytes: Buffer.byteLength(input.content) };
41
+ },
42
+ };
43
+ const runCommand = {
44
+ name: 'run_command', description: 'Run an approved executable in the workspace.', risk: 'high', inputSchema: { command: 'executable', args: 'arguments' },
45
+ async execute(input, signal) {
46
+ if (!shellAllowed)
47
+ throw new Error('shell execution is disabled by policy');
48
+ const result = await execFileAsync(input.command, [...(input.args ?? [])], { cwd: root, maxBuffer: MAX_OUTPUT, signal });
49
+ return { stdout: result.stdout.slice(0, MAX_OUTPUT), stderr: result.stderr.slice(0, MAX_OUTPUT), code: 0 };
50
+ },
51
+ };
52
+ const gitDiff = {
53
+ name: 'git_diff', description: 'Collect the current workspace git diff.', risk: 'low', inputSchema: {},
54
+ async execute(_input, signal) {
55
+ const result = await execFileAsync('git', ['diff', '--no-ext-diff', '--'], { cwd: root, maxBuffer: MAX_OUTPUT, signal });
56
+ return result.stdout.slice(0, MAX_OUTPUT);
57
+ },
58
+ };
59
+ const indexWorkspace = {
60
+ name: 'index_workspace', description: 'Recursively index non-hidden workspace files.', risk: 'low', inputSchema: {},
61
+ async execute() {
62
+ const files = [];
63
+ async function walk(directory) {
64
+ for (const entry of await node_fs_1.promises.readdir(directory, { withFileTypes: true })) {
65
+ if (entry.name.startsWith('.') || entry.name === 'node_modules')
66
+ continue;
67
+ const target = node_path_1.default.join(directory, entry.name);
68
+ if (entry.isDirectory()) {
69
+ files.push({ path: node_path_1.default.relative(root, target), bytes: 0, kind: 'directory' });
70
+ await walk(target);
71
+ }
72
+ else if (entry.isFile()) {
73
+ const stat = await node_fs_1.promises.stat(target);
74
+ files.push({ path: node_path_1.default.relative(root, target), bytes: stat.size, kind: 'file', extension: node_path_1.default.extname(entry.name) || undefined });
75
+ }
76
+ }
77
+ }
78
+ await walk(root);
79
+ files.sort((a, b) => a.path.localeCompare(b.path));
80
+ return { root, indexedAt: new Date().toISOString(), files, contextLocked: false };
81
+ },
82
+ };
83
+ return { readFile, writeFile, runCommand, indexWorkspace, gitDiff };
84
+ }
85
+ //# sourceMappingURL=systemTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemTools.js","sourceRoot":"","sources":["../../src/tools/systemTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ export type TaskStatus = 'idle' | 'planning' | 'running' | 'waiting' | 'completed' | 'failed' | 'cancelled';
2
+ export type ToolRisk = 'low' | 'medium' | 'high' | 'critical';
3
+ export interface WorkspaceFile {
4
+ path: string;
5
+ bytes: number;
6
+ kind: 'file' | 'directory';
7
+ extension?: string;
8
+ }
9
+ export interface WorkspaceState {
10
+ root: string;
11
+ indexedAt: string | null;
12
+ files: readonly WorkspaceFile[];
13
+ gitBranch?: string;
14
+ gitDiffStat?: string;
15
+ contextLocked: boolean;
16
+ }
17
+ export interface CompressionTracker {
18
+ inputTokens: number;
19
+ compressedTokens: number;
20
+ ratio: number;
21
+ strategy: 'rtk' | 'caveman' | 'none';
22
+ updatedAt: string;
23
+ }
24
+ export interface FallbackTracker {
25
+ activeProvider?: string;
26
+ attempts: number;
27
+ lastFailure?: string;
28
+ cooldownUntil?: string;
29
+ }
30
+ export interface OmniRouteMetrics {
31
+ compression: CompressionTracker;
32
+ fallback: FallbackTracker;
33
+ remainingQuota?: number;
34
+ requestCount: number;
35
+ }
36
+ export interface AgentToolDeclaration<TInput = unknown, TOutput = unknown> {
37
+ name: string;
38
+ description: string;
39
+ risk: ToolRisk;
40
+ inputSchema: unknown;
41
+ execute(input: TInput, signal?: AbortSignal): Promise<TOutput>;
42
+ }
43
+ export interface HarnessState {
44
+ taskStatus: TaskStatus;
45
+ prompt: string;
46
+ workspace: WorkspaceState;
47
+ metrics: OmniRouteMetrics;
48
+ activeModel: string;
49
+ messages: readonly HarnessMessage[];
50
+ }
51
+ export interface HarnessMessage {
52
+ role: 'user' | 'assistant' | 'thought' | 'action' | 'error';
53
+ content: string;
54
+ createdAt: string;
55
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import type { MastraEngine } from '../agent/mastraEngine.js';
3
+ interface Props {
4
+ engine: MastraEngine;
5
+ }
6
+ export declare function TerminalInterface({ engine }: Props): React.ReactElement;
7
+ export {};
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TerminalInterface = TerminalInterface;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = require("react");
9
+ const ink_1 = require("ink");
10
+ const ink_spinner_1 = __importDefault(require("ink-spinner"));
11
+ function widthOf(stdout) {
12
+ return Math.max(48, stdout.columns ?? 80);
13
+ }
14
+ function clip(text, width) {
15
+ return text.length <= width ? text : `${text.slice(0, Math.max(0, width - 1))}…`;
16
+ }
17
+ function TerminalInterface({ engine }) {
18
+ const { exit } = (0, ink_1.useApp)();
19
+ const { stdout } = (0, ink_1.useStdout)();
20
+ const [width, setWidth] = (0, react_1.useState)(() => widthOf(stdout));
21
+ const [input, setInput] = (0, react_1.useState)('');
22
+ const [lines, setLines] = (0, react_1.useState)([]);
23
+ const [busy, setBusy] = (0, react_1.useState)(false);
24
+ const [error, setError] = (0, react_1.useState)();
25
+ (0, react_1.useEffect)(() => {
26
+ const onResize = () => setWidth(widthOf(stdout));
27
+ stdout.on('resize', onResize);
28
+ return () => { stdout.off('resize', onResize); };
29
+ }, [stdout]);
30
+ (0, ink_1.useInput)((value, key) => {
31
+ if (key.ctrl && value === 'c') {
32
+ exit();
33
+ return;
34
+ }
35
+ if (key.return) {
36
+ const prompt = input.trim();
37
+ if (!prompt || busy)
38
+ return;
39
+ setInput('');
40
+ setBusy(true);
41
+ setError(undefined);
42
+ setLines((current) => [...current, { role: 'user', text: prompt }]);
43
+ void engine.run(prompt).then((answer) => {
44
+ setLines((current) => [...current, { role: 'assistant', text: answer }]);
45
+ }).catch((reason) => {
46
+ const message = reason instanceof Error ? reason.message : String(reason);
47
+ setError(message);
48
+ setLines((current) => [...current, { role: 'error', text: message }]);
49
+ }).finally(() => setBusy(false));
50
+ return;
51
+ }
52
+ if (key.backspace) {
53
+ setInput((current) => current.slice(0, -1));
54
+ return;
55
+ }
56
+ if (!key.ctrl && !key.meta && value)
57
+ setInput((current) => current + value);
58
+ });
59
+ const contentWidth = Math.max(20, width - 6);
60
+ const metrics = engine.client.snapshotMetrics();
61
+ const compression = metrics.compression.inputTokens > 0 ? `${Math.round((1 - metrics.compression.ratio) * 100)}% via ${metrics.compression.strategy.toUpperCase()}` : 'pending';
62
+ const visibleLines = (0, react_1.useMemo)(() => lines.slice(-Math.max(3, (stdout.rows ?? 24) - 9)), [lines, stdout.rows]);
63
+ return (0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "column", width: width, paddingX: 1, children: [(0, jsx_runtime_1.jsxs)(ink_1.Box, { borderStyle: "round", borderColor: "cyan", paddingX: 1, justifyContent: "space-between", children: [(0, jsx_runtime_1.jsx)(ink_1.Text, { bold: true, color: "cyan", children: "OmniHarness v2.0" }), (0, jsx_runtime_1.jsx)(ink_1.Text, { dimColor: true, children: "OmniRoute Local :20128" })] }), (0, jsx_runtime_1.jsxs)(ink_1.Box, { marginTop: 1, flexDirection: "row", children: [(0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "column", width: Math.max(24, Math.floor(width * 0.27)), borderStyle: "single", borderColor: "gray", paddingX: 1, children: [(0, jsx_runtime_1.jsx)(ink_1.Text, { bold: true, children: "ROUTE" }), (0, jsx_runtime_1.jsxs)(ink_1.Text, { children: ["provider: ", metrics.fallback.activeProvider ?? 'auto'] }), (0, jsx_runtime_1.jsxs)(ink_1.Text, { children: ["compression: ", compression] }), (0, jsx_runtime_1.jsxs)(ink_1.Text, { children: ["cooldown: ", metrics.fallback.cooldownUntil ?? 'none'] }), (0, jsx_runtime_1.jsxs)(ink_1.Text, { children: ["requests: ", metrics.requestCount] })] }), (0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "column", flexGrow: 1, marginLeft: 1, borderStyle: "single", borderColor: "gray", paddingX: 1, children: [visibleLines.length === 0 && (0, jsx_runtime_1.jsx)(ink_1.Text, { dimColor: true, children: "Describe a task to begin." }), visibleLines.map((line, index) => (0, jsx_runtime_1.jsxs)(ink_1.Text, { color: line.role === 'user' ? 'blue' : line.role === 'error' ? 'red' : undefined, children: [line.role === 'user' ? 'YOU ' : line.role === 'error' ? 'ERR ' : 'AGENT', " ", clip(line.text, contentWidth)] }, `${index}-${line.role}`)), busy && (0, jsx_runtime_1.jsxs)(ink_1.Text, { color: "cyan", children: [(0, jsx_runtime_1.jsx)(ink_spinner_1.default, { type: "dots" }), " working through OmniRoute\u2026"] })] })] }), (0, jsx_runtime_1.jsxs)(ink_1.Box, { marginTop: 1, borderStyle: "round", borderColor: error ? 'red' : 'cyan', paddingX: 1, children: [(0, jsx_runtime_1.jsx)(ink_1.Text, { color: "cyan", children: "\u203A " }), (0, jsx_runtime_1.jsx)(ink_1.Text, { children: clip(input || 'type a task and press enter', contentWidth) })] }), (0, jsx_runtime_1.jsxs)(ink_1.Text, { dimColor: true, children: ["Ctrl+C quit \u00B7 model ", engine.state.activeModel] })] });
64
+ }
65
+ //# sourceMappingURL=terminalInterface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminalInterface.js","sourceRoot":"","sources":["../../src/ui/terminalInterface.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omniharness-cli",
3
- "version": "0.1.16",
3
+ "version": "0.1.18",
4
4
  "description": "OmniHarness — local-first agent orchestration harness for OmniRoute.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -8,9 +8,10 @@
8
8
  "url": "https://github.com/mattycigemp-crypto/omniharness.git"
9
9
  },
10
10
  "bin": {
11
- "omniharness": "dist/cli.js"
11
+ "omniharness": "cli.js"
12
12
  },
13
13
  "files": [
14
+ "cli.js",
14
15
  "dist/",
15
16
  "README.md"
16
17
  ],