@agentmeshhq/agent 0.4.16 → 0.4.20
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/LICENSE +21 -0
- package/dist/__tests__/attach.test.d.ts +1 -0
- package/dist/__tests__/attach.test.js +200 -0
- package/dist/__tests__/attach.test.js.map +1 -0
- package/dist/__tests__/auth-guard.integration.test.js +1 -1
- package/dist/__tests__/auth-guard.integration.test.js.map +1 -1
- package/dist/__tests__/auth-guard.test.js +3 -3
- package/dist/__tests__/auth-guard.test.js.map +1 -1
- package/dist/__tests__/bootstrap.test.js +23 -0
- package/dist/__tests__/bootstrap.test.js.map +1 -1
- package/dist/__tests__/daemon-hub-resilience.test.js +2 -2
- package/dist/__tests__/daemon-hub-resilience.test.js.map +1 -1
- package/dist/__tests__/evicted-cleanup.test.js.map +1 -1
- package/dist/__tests__/injection-verify.test.d.ts +1 -0
- package/dist/__tests__/injection-verify.test.js +93 -0
- package/dist/__tests__/injection-verify.test.js.map +1 -0
- package/dist/__tests__/injector.test.js +124 -4
- package/dist/__tests__/injector.test.js.map +1 -1
- package/dist/__tests__/list.test.d.ts +1 -0
- package/dist/__tests__/list.test.js +62 -0
- package/dist/__tests__/list.test.js.map +1 -0
- package/dist/__tests__/opencode-serve.test.d.ts +1 -0
- package/dist/__tests__/opencode-serve.test.js +54 -0
- package/dist/__tests__/opencode-serve.test.js.map +1 -0
- package/dist/__tests__/opencode-session-policy.test.d.ts +1 -0
- package/dist/__tests__/opencode-session-policy.test.js +61 -0
- package/dist/__tests__/opencode-session-policy.test.js.map +1 -0
- package/dist/__tests__/opencode-session.test.d.ts +1 -0
- package/dist/__tests__/opencode-session.test.js +178 -0
- package/dist/__tests__/opencode-session.test.js.map +1 -0
- package/dist/__tests__/registry.register.test.js +16 -0
- package/dist/__tests__/registry.register.test.js.map +1 -1
- package/dist/__tests__/relay.test.d.ts +1 -0
- package/dist/__tests__/relay.test.js +136 -0
- package/dist/__tests__/relay.test.js.map +1 -0
- package/dist/__tests__/runner.test.js +17 -0
- package/dist/__tests__/runner.test.js.map +1 -1
- package/dist/__tests__/session-recovery.test.js +214 -11
- package/dist/__tests__/session-recovery.test.js.map +1 -1
- package/dist/__tests__/shared-resource-guards.test.js +1 -4
- package/dist/__tests__/shared-resource-guards.test.js.map +1 -1
- package/dist/__tests__/start-team-id.test.js +22 -0
- package/dist/__tests__/start-team-id.test.js.map +1 -1
- package/dist/__tests__/startup-diagnostics.test.d.ts +1 -0
- package/dist/__tests__/startup-diagnostics.test.js +250 -0
- package/dist/__tests__/startup-diagnostics.test.js.map +1 -0
- package/dist/__tests__/tmux-runtime.test.js +13 -0
- package/dist/__tests__/tmux-runtime.test.js.map +1 -1
- package/dist/__tests__/token-rejection-recovery.test.js +52 -0
- package/dist/__tests__/token-rejection-recovery.test.js.map +1 -1
- package/dist/__tests__/watcher-queue.test.d.ts +1 -0
- package/dist/__tests__/watcher-queue.test.js +90 -0
- package/dist/__tests__/watcher-queue.test.js.map +1 -0
- package/dist/__tests__/watcher-state.test.d.ts +1 -0
- package/dist/__tests__/watcher-state.test.js +159 -0
- package/dist/__tests__/watcher-state.test.js.map +1 -0
- package/dist/cli/attach.d.ts +1 -1
- package/dist/cli/attach.js +125 -2
- package/dist/cli/attach.js.map +1 -1
- package/dist/cli/auth.js.map +1 -1
- package/dist/cli/commands.d.ts +32 -0
- package/dist/cli/commands.js +165 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/index.js +97 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/list.js +26 -2
- package/dist/cli/list.js.map +1 -1
- package/dist/cli/relay.d.ts +4 -0
- package/dist/cli/relay.js +165 -3
- package/dist/cli/relay.js.map +1 -1
- package/dist/cli/start.d.ts +9 -1
- package/dist/cli/start.js +8 -0
- package/dist/cli/start.js.map +1 -1
- package/dist/cli/status.js +21 -8
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/test.js +12 -1
- package/dist/cli/test.js.map +1 -1
- package/dist/config/schema.d.ts +17 -1
- package/dist/core/auth-guard.js +2 -2
- package/dist/core/auth-guard.js.map +1 -1
- package/dist/core/chat-output-parser.d.ts +24 -0
- package/dist/core/chat-output-parser.js +150 -0
- package/dist/core/chat-output-parser.js.map +1 -0
- package/dist/core/chat-output-parser.test.d.ts +7 -0
- package/dist/core/chat-output-parser.test.js +151 -0
- package/dist/core/chat-output-parser.test.js.map +1 -0
- package/dist/core/daemon/bootstrap.d.ts +8 -0
- package/dist/core/daemon/bootstrap.js +6 -1
- package/dist/core/daemon/bootstrap.js.map +1 -1
- package/dist/core/daemon/crash-log.js +5 -0
- package/dist/core/daemon/crash-log.js.map +1 -1
- package/dist/core/daemon/injection-verify.d.ts +25 -0
- package/dist/core/daemon/injection-verify.js +94 -0
- package/dist/core/daemon/injection-verify.js.map +1 -0
- package/dist/core/daemon/roles.d.ts +2 -2
- package/dist/core/daemon/roles.js +3 -0
- package/dist/core/daemon/roles.js.map +1 -1
- package/dist/core/daemon/session-recovery.d.ts +18 -1
- package/dist/core/daemon/session-recovery.js +89 -5
- package/dist/core/daemon/session-recovery.js.map +1 -1
- package/dist/core/daemon/startup-diagnostics.d.ts +76 -0
- package/dist/core/daemon/startup-diagnostics.js +277 -0
- package/dist/core/daemon/startup-diagnostics.js.map +1 -0
- package/dist/core/daemon/state.d.ts +8 -0
- package/dist/core/daemon/state.js +8 -0
- package/dist/core/daemon/state.js.map +1 -1
- package/dist/core/daemon/tmux-session.d.ts +4 -0
- package/dist/core/daemon/tmux-session.js +9 -1
- package/dist/core/daemon/tmux-session.js.map +1 -1
- package/dist/core/daemon/watcher-loop.d.ts +27 -0
- package/dist/core/daemon/watcher-loop.js +134 -0
- package/dist/core/daemon/watcher-loop.js.map +1 -0
- package/dist/core/daemon/watcher-queue.d.ts +33 -0
- package/dist/core/daemon/watcher-queue.js +71 -0
- package/dist/core/daemon/watcher-queue.js.map +1 -0
- package/dist/core/daemon/watcher-state.d.ts +66 -0
- package/dist/core/daemon/watcher-state.js +151 -0
- package/dist/core/daemon/watcher-state.js.map +1 -0
- package/dist/core/daemon/workspace.js +10 -2
- package/dist/core/daemon/workspace.js.map +1 -1
- package/dist/core/daemon.d.ts +22 -1
- package/dist/core/daemon.js +289 -20
- package/dist/core/daemon.js.map +1 -1
- package/dist/core/handoff-sla.js +1 -1
- package/dist/core/handoff-sla.js.map +1 -1
- package/dist/core/injector.d.ts +2 -0
- package/dist/core/injector.js +227 -32
- package/dist/core/injector.js.map +1 -1
- package/dist/core/opencode-serve.d.ts +26 -0
- package/dist/core/opencode-serve.js +97 -0
- package/dist/core/opencode-serve.js.map +1 -0
- package/dist/core/opencode-session-policy.d.ts +10 -0
- package/dist/core/opencode-session-policy.js +10 -0
- package/dist/core/opencode-session-policy.js.map +1 -0
- package/dist/core/opencode-session.d.ts +12 -0
- package/dist/core/opencode-session.js +165 -0
- package/dist/core/opencode-session.js.map +1 -0
- package/dist/core/registry.d.ts +2 -1
- package/dist/core/registry.js +3 -2
- package/dist/core/registry.js.map +1 -1
- package/dist/core/runner/build.js +7 -31
- package/dist/core/runner/build.js.map +1 -1
- package/dist/core/runner/detect.js +2 -8
- package/dist/core/runner/detect.js.map +1 -1
- package/dist/core/runner/index.d.ts +3 -1
- package/dist/core/runner/index.js +2 -0
- package/dist/core/runner/index.js.map +1 -1
- package/dist/core/runner/kimi-models.d.ts +4 -0
- package/dist/core/runner/kimi-models.js +24 -0
- package/dist/core/runner/kimi-models.js.map +1 -0
- package/dist/core/runner/registry.d.ts +3 -0
- package/dist/core/runner/registry.js +75 -0
- package/dist/core/runner/registry.js.map +1 -0
- package/dist/core/runner/types.d.ts +17 -1
- package/dist/core/tmux-runtime.d.ts +2 -1
- package/dist/core/tmux-runtime.js +17 -1
- package/dist/core/tmux-runtime.js.map +1 -1
- package/dist/core/tmux.d.ts +4 -0
- package/dist/core/tmux.js +54 -11
- package/dist/core/tmux.js.map +1 -1
- package/dist/runtime/adapters/opencode.d.ts +63 -0
- package/dist/runtime/adapters/opencode.js +358 -0
- package/dist/runtime/adapters/opencode.js.map +1 -0
- package/dist/runtime/adapters/tmux-fallback.d.ts +23 -0
- package/dist/runtime/adapters/tmux-fallback.js +148 -0
- package/dist/runtime/adapters/tmux-fallback.js.map +1 -0
- package/dist/runtime/adapters/tmux-fallback.test.d.ts +4 -0
- package/dist/runtime/adapters/tmux-fallback.test.js +91 -0
- package/dist/runtime/adapters/tmux-fallback.test.js.map +1 -0
- package/dist/runtime/index.d.ts +146 -0
- package/dist/runtime/index.js +191 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/registry.d.ts +53 -0
- package/dist/runtime/registry.js +112 -0
- package/dist/runtime/registry.js.map +1 -0
- package/dist/runtime/registry.test.d.ts +4 -0
- package/dist/runtime/registry.test.js +69 -0
- package/dist/runtime/registry.test.js.map +1 -0
- package/dist/runtime/types.d.ts +158 -0
- package/dist/runtime/types.js +8 -0
- package/dist/runtime/types.js.map +1 -0
- package/package.json +11 -12
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime Adapter Registry
|
|
3
|
+
*
|
|
4
|
+
* Manages available runtime adapters and provides selection
|
|
5
|
+
* based on runner type and capabilities.
|
|
6
|
+
*/
|
|
7
|
+
import { opencodeAdapter } from "./adapters/opencode.js";
|
|
8
|
+
import { tmuxFallbackAdapter } from "./adapters/tmux-fallback.js";
|
|
9
|
+
/**
|
|
10
|
+
* Registry of available runtime adapters
|
|
11
|
+
*/
|
|
12
|
+
export class AdapterRegistry {
|
|
13
|
+
adapters = new Map();
|
|
14
|
+
fallbackAdapter;
|
|
15
|
+
constructor() {
|
|
16
|
+
// Register built-in adapters
|
|
17
|
+
this.register(opencodeAdapter);
|
|
18
|
+
// Set fallback
|
|
19
|
+
this.fallbackAdapter = tmuxFallbackAdapter;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Register a new adapter
|
|
23
|
+
*/
|
|
24
|
+
register(adapter) {
|
|
25
|
+
this.adapters.set(adapter.id, adapter);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get adapter by ID
|
|
29
|
+
*/
|
|
30
|
+
get(id) {
|
|
31
|
+
return this.adapters.get(id);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get all registered adapters
|
|
35
|
+
*/
|
|
36
|
+
getAll() {
|
|
37
|
+
return Array.from(this.adapters.values());
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get the fallback adapter
|
|
41
|
+
*/
|
|
42
|
+
getFallback() {
|
|
43
|
+
return this.fallbackAdapter;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Select the best adapter for a given session
|
|
47
|
+
*/
|
|
48
|
+
async selectAdapter(sessionName) {
|
|
49
|
+
// Try specialized adapters first (in priority order)
|
|
50
|
+
for (const adapter of this.adapters.values()) {
|
|
51
|
+
if (await adapter.canHandle(sessionName)) {
|
|
52
|
+
return adapter;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Fall back to generic tmux adapter
|
|
56
|
+
if (await this.fallbackAdapter.canHandle(sessionName)) {
|
|
57
|
+
return this.fallbackAdapter;
|
|
58
|
+
}
|
|
59
|
+
throw new Error(`No adapter available for session: ${sessionName}`);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Detect runner type and recommend adapter
|
|
63
|
+
*/
|
|
64
|
+
async detectRunner(sessionName) {
|
|
65
|
+
// Check if session exists
|
|
66
|
+
const fallbackCanHandle = await this.fallbackAdapter.canHandle(sessionName);
|
|
67
|
+
if (!fallbackCanHandle) {
|
|
68
|
+
return {
|
|
69
|
+
runnerType: "unknown",
|
|
70
|
+
structuredEventsAvailable: false,
|
|
71
|
+
recommendedAdapter: "none",
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
// Try to detect specific runner
|
|
75
|
+
for (const adapter of this.adapters.values()) {
|
|
76
|
+
if (await adapter.canHandle(sessionName)) {
|
|
77
|
+
return {
|
|
78
|
+
runnerType: adapter.supportedRunners[0] || "unknown",
|
|
79
|
+
structuredEventsAvailable: adapter.supportsStructuredEvents,
|
|
80
|
+
recommendedAdapter: adapter.id,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Generic tmux session
|
|
85
|
+
return {
|
|
86
|
+
runnerType: "tmux",
|
|
87
|
+
structuredEventsAvailable: false,
|
|
88
|
+
recommendedAdapter: this.fallbackAdapter.id,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** Global registry instance */
|
|
93
|
+
export const adapterRegistry = new AdapterRegistry();
|
|
94
|
+
/**
|
|
95
|
+
* Get the global adapter registry
|
|
96
|
+
*/
|
|
97
|
+
export function getAdapterRegistry() {
|
|
98
|
+
return adapterRegistry;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Select adapter for session (convenience function)
|
|
102
|
+
*/
|
|
103
|
+
export async function selectAdapter(sessionName) {
|
|
104
|
+
return adapterRegistry.selectAdapter(sessionName);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Detect runner for session (convenience function)
|
|
108
|
+
*/
|
|
109
|
+
export async function detectRunner(sessionName) {
|
|
110
|
+
return adapterRegistry.detectRunner(sessionName);
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/runtime/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter Registry Tests
|
|
3
|
+
*/
|
|
4
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { TmuxFallbackAdapter } from "./adapters/tmux-fallback.js";
|
|
6
|
+
import { AdapterRegistry, detectRunner, selectAdapter } from "./registry.js";
|
|
7
|
+
// Mock the tmux module
|
|
8
|
+
vi.mock("../../core/tmux.js", () => ({
|
|
9
|
+
sessionExists: vi.fn((name) => name.includes("test")),
|
|
10
|
+
sendKeys: vi.fn(() => true),
|
|
11
|
+
captureSessionOutput: vi.fn(() => "test output"),
|
|
12
|
+
getSessionName: vi.fn((name) => `agentmesh-${name}`),
|
|
13
|
+
}));
|
|
14
|
+
describe("AdapterRegistry", () => {
|
|
15
|
+
let registry;
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
registry = new AdapterRegistry();
|
|
18
|
+
});
|
|
19
|
+
describe("registration", () => {
|
|
20
|
+
it("should register adapters", () => {
|
|
21
|
+
const customAdapter = new TmuxFallbackAdapter();
|
|
22
|
+
registry.register(customAdapter);
|
|
23
|
+
expect(registry.get("tmux-fallback")).toBeDefined();
|
|
24
|
+
});
|
|
25
|
+
it("should return all registered adapters", () => {
|
|
26
|
+
const adapters = registry.getAll();
|
|
27
|
+
expect(adapters.length).toBeGreaterThanOrEqual(1); // At least opencode
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe("fallback adapter", () => {
|
|
31
|
+
it("should have a fallback adapter", () => {
|
|
32
|
+
const fallback = registry.getFallback();
|
|
33
|
+
expect(fallback).toBeDefined();
|
|
34
|
+
expect(fallback.id).toBe("tmux-fallback");
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe("selectAdapter", () => {
|
|
38
|
+
it("should return fallback for generic session", async () => {
|
|
39
|
+
const adapter = await registry.selectAdapter("agentmesh-test");
|
|
40
|
+
expect(adapter).toBeDefined();
|
|
41
|
+
});
|
|
42
|
+
it("should throw error for non-existent session", async () => {
|
|
43
|
+
await expect(registry.selectAdapter("agentmesh-nonexistent")).rejects.toThrow();
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe("detectRunner", () => {
|
|
47
|
+
it("should detect tmux session", async () => {
|
|
48
|
+
const result = await registry.detectRunner("agentmesh-test");
|
|
49
|
+
expect(result.runnerType).toBeDefined();
|
|
50
|
+
expect(result.recommendedAdapter).toBeDefined();
|
|
51
|
+
});
|
|
52
|
+
it("should return unknown for non-existent session", async () => {
|
|
53
|
+
const result = await registry.detectRunner("agentmesh-nonexistent");
|
|
54
|
+
expect(result.runnerType).toBe("unknown");
|
|
55
|
+
expect(result.recommendedAdapter).toBe("none");
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe("convenience functions", () => {
|
|
60
|
+
it("selectAdapter should work with global registry", async () => {
|
|
61
|
+
const adapter = await selectAdapter("agentmesh-test");
|
|
62
|
+
expect(adapter).toBeDefined();
|
|
63
|
+
});
|
|
64
|
+
it("detectRunner should work with global registry", async () => {
|
|
65
|
+
const result = await detectRunner("agentmesh-test");
|
|
66
|
+
expect(result.runnerType).toBeDefined();
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=registry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../src/runtime/registry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime Adapter Types
|
|
3
|
+
*
|
|
4
|
+
* Cross-runner runtime I/O contract for AgentMesh chat/control.
|
|
5
|
+
* Provides normalized event-based output instead of tmux pane scraping.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Output modes for runtime chat responses
|
|
9
|
+
*/
|
|
10
|
+
export type OutputMode = "clean" | "raw" | "structured";
|
|
11
|
+
/**
|
|
12
|
+
* Structured output metadata
|
|
13
|
+
*/
|
|
14
|
+
export interface StructuredOutput {
|
|
15
|
+
/** The cleaned LLM reply text */
|
|
16
|
+
content: string;
|
|
17
|
+
/** Raw captured output (for debugging) */
|
|
18
|
+
rawOutput: string;
|
|
19
|
+
/** Capture metadata */
|
|
20
|
+
metadata: {
|
|
21
|
+
/** ISO timestamp when output was captured */
|
|
22
|
+
capturedAt: string;
|
|
23
|
+
/** Number of lines captured from tmux */
|
|
24
|
+
linesCaptured: number;
|
|
25
|
+
/** Time taken to stabilize in milliseconds */
|
|
26
|
+
stabilizationMs: number;
|
|
27
|
+
/** Whether output was truncated */
|
|
28
|
+
truncated: boolean;
|
|
29
|
+
/** Delivery path: 'opencode-serve:<port>' or 'tmux-fallback' */
|
|
30
|
+
delivery_path?: string;
|
|
31
|
+
};
|
|
32
|
+
/** Parsing metadata */
|
|
33
|
+
parsing: {
|
|
34
|
+
/** Whether the output was successfully parsed */
|
|
35
|
+
success: boolean;
|
|
36
|
+
/** Parser used (e.g., 'tmux-regex', 'ansi-strip', 'json-events') */
|
|
37
|
+
parser: string;
|
|
38
|
+
/** Error message if parsing failed */
|
|
39
|
+
error?: string;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Runtime event types
|
|
44
|
+
*/
|
|
45
|
+
export type RuntimeEventType = "output.start" | "output.chunk" | "output.complete" | "output.error" | "runner.ready" | "runner.busy" | "tool.start" | "tool.complete" | "message.delta" | "message.complete";
|
|
46
|
+
/**
|
|
47
|
+
* Runtime event from runner
|
|
48
|
+
*/
|
|
49
|
+
export interface RuntimeEvent {
|
|
50
|
+
/** Event type */
|
|
51
|
+
type: RuntimeEventType;
|
|
52
|
+
/** ISO timestamp */
|
|
53
|
+
timestamp: string;
|
|
54
|
+
/** Event payload (type-specific) */
|
|
55
|
+
payload: unknown;
|
|
56
|
+
/** Correlation ID for request/response pairing */
|
|
57
|
+
correlationId?: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Chat input request
|
|
61
|
+
*/
|
|
62
|
+
export interface ChatInputRequest {
|
|
63
|
+
/** Message content to inject */
|
|
64
|
+
content: string;
|
|
65
|
+
/** Output mode preference */
|
|
66
|
+
outputMode: OutputMode;
|
|
67
|
+
/** Message ID for correlation */
|
|
68
|
+
messageId: string;
|
|
69
|
+
/** Workspace ID */
|
|
70
|
+
workspace: string;
|
|
71
|
+
/** Agent ID */
|
|
72
|
+
agentId: string;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Chat output response
|
|
76
|
+
*/
|
|
77
|
+
export type ChatOutputResponse = {
|
|
78
|
+
mode: "clean";
|
|
79
|
+
content: string;
|
|
80
|
+
} | {
|
|
81
|
+
mode: "raw";
|
|
82
|
+
content: string;
|
|
83
|
+
} | {
|
|
84
|
+
mode: "structured";
|
|
85
|
+
data: StructuredOutput;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Runtime adapter interface
|
|
89
|
+
*
|
|
90
|
+
* Implementations provide runner-specific I/O handling.
|
|
91
|
+
*/
|
|
92
|
+
export interface RuntimeAdapter {
|
|
93
|
+
/** Adapter identifier */
|
|
94
|
+
readonly id: string;
|
|
95
|
+
/** Human-readable name */
|
|
96
|
+
readonly displayName: string;
|
|
97
|
+
/** Supported runner types */
|
|
98
|
+
readonly supportedRunners: string[];
|
|
99
|
+
/** Whether this adapter supports structured events */
|
|
100
|
+
readonly supportsStructuredEvents: boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Check if this adapter can handle the given session
|
|
103
|
+
*/
|
|
104
|
+
canHandle(sessionName: string): boolean | Promise<boolean>;
|
|
105
|
+
/**
|
|
106
|
+
* Inject chat input into the runtime session
|
|
107
|
+
*/
|
|
108
|
+
injectInput(sessionName: string, request: ChatInputRequest): boolean | Promise<boolean>;
|
|
109
|
+
/**
|
|
110
|
+
* Capture output from the runtime session
|
|
111
|
+
*/
|
|
112
|
+
captureOutput(sessionName: string, request: ChatInputRequest): ChatOutputResponse | Promise<ChatOutputResponse>;
|
|
113
|
+
/**
|
|
114
|
+
* Wait for stable output and return in requested mode
|
|
115
|
+
*/
|
|
116
|
+
waitForOutput(sessionName: string, request: ChatInputRequest, options?: WaitForOutputOptions): Promise<ChatOutputResponse>;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Options for waitForOutput
|
|
120
|
+
*/
|
|
121
|
+
export interface WaitForOutputOptions {
|
|
122
|
+
/** Poll interval in milliseconds (default: 2000) */
|
|
123
|
+
pollMs?: number;
|
|
124
|
+
/** Stabilization time in milliseconds (default: 5000) */
|
|
125
|
+
stableMs?: number;
|
|
126
|
+
/** Hard timeout in milliseconds (default: 60000) */
|
|
127
|
+
timeoutMs?: number;
|
|
128
|
+
/** Maximum lines to capture (default: 120) */
|
|
129
|
+
maxLines?: number;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Adapter capability flags
|
|
133
|
+
*/
|
|
134
|
+
export interface AdapterCapabilities {
|
|
135
|
+
/** Supports JSON event streaming */
|
|
136
|
+
jsonEvents: boolean;
|
|
137
|
+
/** Supports ANSI stripping */
|
|
138
|
+
ansiStripping: boolean;
|
|
139
|
+
/** Supports prompt detection */
|
|
140
|
+
promptDetection: boolean;
|
|
141
|
+
/** Supports tool execution tracking */
|
|
142
|
+
toolTracking: boolean;
|
|
143
|
+
/** Supports mid-work chat (while tools running) */
|
|
144
|
+
midWorkChat: boolean;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Runner detection result
|
|
148
|
+
*/
|
|
149
|
+
export interface RunnerDetectionResult {
|
|
150
|
+
/** Detected runner type */
|
|
151
|
+
runnerType: string;
|
|
152
|
+
/** Detected runner version (if available) */
|
|
153
|
+
version?: string;
|
|
154
|
+
/** Whether structured events are available */
|
|
155
|
+
structuredEventsAvailable: boolean;
|
|
156
|
+
/** Recommended adapter ID */
|
|
157
|
+
recommendedAdapter: string;
|
|
158
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentmeshhq/agent",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.20",
|
|
4
4
|
"description": "AgentMesh Agent Wrapper - Turn any AI coding assistant into a dispatchable, nudge-able agent",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -16,15 +16,6 @@
|
|
|
16
16
|
"access": "public",
|
|
17
17
|
"registry": "https://registry.npmjs.org/"
|
|
18
18
|
},
|
|
19
|
-
"scripts": {
|
|
20
|
-
"dev": "tsx watch src/cli/index.ts",
|
|
21
|
-
"build": "tsc -p tsconfig.json",
|
|
22
|
-
"lint": "biome check src",
|
|
23
|
-
"start": "node dist/cli/index.js",
|
|
24
|
-
"test": "vitest run",
|
|
25
|
-
"test:watch": "vitest",
|
|
26
|
-
"prepublishOnly": "pnpm build && pnpm test"
|
|
27
|
-
},
|
|
28
19
|
"dependencies": {
|
|
29
20
|
"commander": "^12.0.0",
|
|
30
21
|
"picocolors": "^1.0.0",
|
|
@@ -53,5 +44,13 @@
|
|
|
53
44
|
"url": "https://github.com/therajushahi/agentmesh.git",
|
|
54
45
|
"directory": "packages/agent"
|
|
55
46
|
},
|
|
56
|
-
"homepage": "https://agentmeshhq.dev"
|
|
57
|
-
|
|
47
|
+
"homepage": "https://agentmeshhq.dev",
|
|
48
|
+
"scripts": {
|
|
49
|
+
"dev": "tsx watch src/cli/index.ts",
|
|
50
|
+
"build": "tsc -p tsconfig.json",
|
|
51
|
+
"lint": "biome check src",
|
|
52
|
+
"start": "node dist/cli/index.js",
|
|
53
|
+
"test": "vitest run",
|
|
54
|
+
"test:watch": "vitest"
|
|
55
|
+
}
|
|
56
|
+
}
|