@agentex/agent 0.0.23 → 0.0.26
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/CHANGELOG.md +338 -0
- package/LICENSE +21 -0
- package/README.md +110 -0
- package/dist/derived.d.ts +5 -3
- package/dist/derived.d.ts.map +1 -1
- package/dist/derived.js +11 -7
- package/dist/derived.js.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/providers/acp/index.d.ts +1 -1
- package/dist/providers/acp/index.d.ts.map +1 -1
- package/dist/providers/acp/index.js +5 -97
- package/dist/providers/acp/index.js.map +1 -1
- package/dist/providers/acp/session.d.ts +8 -1
- package/dist/providers/acp/session.d.ts.map +1 -1
- package/dist/providers/acp/session.js +94 -0
- package/dist/providers/acp/session.js.map +1 -1
- package/dist/providers/claude/attach.d.ts +8 -0
- package/dist/providers/claude/attach.d.ts.map +1 -0
- package/dist/providers/claude/attach.js +113 -0
- package/dist/providers/claude/attach.js.map +1 -0
- package/dist/providers/claude/execute.d.ts.map +1 -1
- package/dist/providers/claude/execute.js +17 -2
- package/dist/providers/claude/execute.js.map +1 -1
- package/dist/providers/claude/goal-capability.d.ts +15 -0
- package/dist/providers/claude/goal-capability.d.ts.map +1 -0
- package/dist/providers/claude/goal-capability.js +20 -0
- package/dist/providers/claude/goal-capability.js.map +1 -0
- package/dist/providers/claude/index.d.ts.map +1 -1
- package/dist/providers/claude/index.js +8 -4
- package/dist/providers/claude/index.js.map +1 -1
- package/dist/providers/claude/session.d.ts +11 -9
- package/dist/providers/claude/session.d.ts.map +1 -1
- package/dist/providers/claude/session.js +36 -14
- package/dist/providers/claude/session.js.map +1 -1
- package/dist/providers/codex/attach.d.ts +9 -0
- package/dist/providers/codex/attach.d.ts.map +1 -0
- package/dist/providers/codex/attach.js +93 -0
- package/dist/providers/codex/attach.js.map +1 -0
- package/dist/providers/codex/execute.d.ts.map +1 -1
- package/dist/providers/codex/execute.js +17 -3
- package/dist/providers/codex/execute.js.map +1 -1
- package/dist/providers/codex/goal-capability.d.ts +13 -0
- package/dist/providers/codex/goal-capability.d.ts.map +1 -0
- package/dist/providers/codex/goal-capability.js +18 -0
- package/dist/providers/codex/goal-capability.js.map +1 -0
- package/dist/providers/codex/index.d.ts +1 -0
- package/dist/providers/codex/index.d.ts.map +1 -1
- package/dist/providers/codex/index.js +9 -6
- package/dist/providers/codex/index.js.map +1 -1
- package/dist/providers/codex/session.d.ts +11 -7
- package/dist/providers/codex/session.d.ts.map +1 -1
- package/dist/providers/codex/session.js +37 -12
- package/dist/providers/codex/session.js.map +1 -1
- package/dist/providers/codex/transcript-normalize.d.ts +28 -0
- package/dist/providers/codex/transcript-normalize.d.ts.map +1 -0
- package/dist/providers/codex/transcript-normalize.js +191 -0
- package/dist/providers/codex/transcript-normalize.js.map +1 -0
- package/dist/providers/cursor/index.d.ts.map +1 -1
- package/dist/providers/cursor/index.js +2 -2
- package/dist/providers/cursor/index.js.map +1 -1
- package/dist/providers/openclaw/index.d.ts.map +1 -1
- package/dist/providers/openclaw/index.js +2 -2
- package/dist/providers/openclaw/index.js.map +1 -1
- package/dist/providers/opencode/index.d.ts.map +1 -1
- package/dist/providers/opencode/index.js +3 -5
- package/dist/providers/opencode/index.js.map +1 -1
- package/dist/providers/pi/index.d.ts.map +1 -1
- package/dist/providers/pi/index.js +3 -5
- package/dist/providers/pi/index.js.map +1 -1
- package/dist/providers/process/index.d.ts.map +1 -1
- package/dist/providers/process/index.js +2 -2
- package/dist/providers/process/index.js.map +1 -1
- package/dist/registry.d.ts +0 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +0 -4
- package/dist/registry.js.map +1 -1
- package/dist/sessions/index.d.ts +3 -0
- package/dist/sessions/index.d.ts.map +1 -0
- package/dist/sessions/index.js +2 -0
- package/dist/sessions/index.js.map +1 -0
- package/dist/sessions/record.d.ts +43 -0
- package/dist/sessions/record.d.ts.map +1 -0
- package/dist/sessions/record.js +85 -0
- package/dist/sessions/record.js.map +1 -0
- package/dist/types.d.ts +176 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/endpoint.d.ts +38 -0
- package/dist/utils/endpoint.d.ts.map +1 -0
- package/dist/utils/endpoint.js +151 -0
- package/dist/utils/endpoint.js.map +1 -0
- package/dist/utils/env.d.ts.map +1 -1
- package/dist/utils/env.js +5 -1
- package/dist/utils/env.js.map +1 -1
- package/dist/utils/uuid.d.ts +7 -1
- package/dist/utils/uuid.d.ts.map +1 -1
- package/dist/utils/uuid.js +21 -1
- package/dist/utils/uuid.js.map +1 -1
- package/package.json +64 -7
- package/src/derived.ts +311 -0
- package/src/goals/controller.ts +442 -0
- package/src/goals/index.ts +21 -0
- package/src/goals/normalize.ts +173 -0
- package/src/goals/sentinel.ts +90 -0
- package/src/index.ts +270 -0
- package/src/providers/_shared/http-agent.ts +304 -0
- package/src/providers/acp/index.ts +103 -0
- package/src/providers/acp/parse.ts +131 -0
- package/src/providers/acp/session.ts +744 -0
- package/src/providers/claude/attach.ts +147 -0
- package/src/providers/claude/codec.ts +43 -0
- package/src/providers/claude/execute.ts +300 -0
- package/src/providers/claude/goal-capability.ts +21 -0
- package/src/providers/claude/index.ts +72 -0
- package/src/providers/claude/mcp.ts +82 -0
- package/src/providers/claude/parse.ts +824 -0
- package/src/providers/claude/session.ts +1192 -0
- package/src/providers/claude/transcript.ts +555 -0
- package/src/providers/codex/attach.ts +123 -0
- package/src/providers/codex/codec.ts +50 -0
- package/src/providers/codex/execute.ts +337 -0
- package/src/providers/codex/goal-capability.ts +19 -0
- package/src/providers/codex/index.ts +57 -0
- package/src/providers/codex/modes.ts +159 -0
- package/src/providers/codex/parse.ts +691 -0
- package/src/providers/codex/plan-mode.ts +49 -0
- package/src/providers/codex/session.ts +1287 -0
- package/src/providers/codex/transcript-normalize.ts +197 -0
- package/src/providers/codex/transcript.ts +487 -0
- package/src/providers/codex/usage-scanner.ts +178 -0
- package/src/providers/copilot/index.ts +19 -0
- package/src/providers/cursor/codec.ts +44 -0
- package/src/providers/cursor/execute.ts +271 -0
- package/src/providers/cursor/index.ts +25 -0
- package/src/providers/cursor/parse.ts +288 -0
- package/src/providers/gemini/index.ts +21 -0
- package/src/providers/openclaw/codec.ts +40 -0
- package/src/providers/openclaw/execute.ts +19 -0
- package/src/providers/openclaw/index.ts +29 -0
- package/src/providers/opencode/codec.ts +50 -0
- package/src/providers/opencode/event-parse.ts +141 -0
- package/src/providers/opencode/execute.ts +251 -0
- package/src/providers/opencode/http-session.ts +427 -0
- package/src/providers/opencode/index.ts +30 -0
- package/src/providers/opencode/parse.ts +203 -0
- package/src/providers/opencode/server.ts +0 -0
- package/src/providers/pi/codec.ts +44 -0
- package/src/providers/pi/execute.ts +297 -0
- package/src/providers/pi/index.ts +30 -0
- package/src/providers/pi/parse.ts +231 -0
- package/src/providers/pi/session.ts +381 -0
- package/src/providers/process/execute.ts +148 -0
- package/src/providers/process/index.ts +52 -0
- package/src/registry.ts +40 -0
- package/src/sessions/index.ts +8 -0
- package/src/sessions/record.ts +108 -0
- package/src/types.ts +1638 -0
- package/src/utils/ask-user-question.ts +57 -0
- package/src/utils/auth.ts +661 -0
- package/src/utils/binary.ts +179 -0
- package/src/utils/endpoint.ts +172 -0
- package/src/utils/env.ts +63 -0
- package/src/utils/execute-all.ts +68 -0
- package/src/utils/exit-plan-mode.ts +40 -0
- package/src/utils/instructions.ts +427 -0
- package/src/utils/process.ts +223 -0
- package/src/utils/runtime-config.ts +100 -0
- package/src/utils/runtime-homes.ts +49 -0
- package/src/utils/skill-commands.ts +493 -0
- package/src/utils/skills.ts +500 -0
- package/src/utils/template.ts +16 -0
- package/src/utils/tool-names.ts +51 -0
- package/src/utils/uuid.ts +21 -0
- package/src/utils/workspace.ts +156 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
AuthReport,
|
|
3
|
+
AuthResolveContext,
|
|
4
|
+
ListModesOptions,
|
|
5
|
+
ProviderModel,
|
|
6
|
+
ProviderModule,
|
|
7
|
+
SessionContext,
|
|
8
|
+
} from "../../types.js";
|
|
9
|
+
import { ensureCommandResolvable } from "../../utils/binary.js";
|
|
10
|
+
import type { AcpSessionDeps, AcpTransformers } from "./session.js";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Configuration for a generic ACP-backed provider. The canonical use is the
|
|
14
|
+
* config-extend `extends: "acp"` form, but any code can build one directly:
|
|
15
|
+
*
|
|
16
|
+
* ```ts
|
|
17
|
+
* registerProvider(acpProvider({ id: "gemini", command: ["gemini", "--acp"] }));
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export interface AcpProviderConfig {
|
|
21
|
+
/** Unique provider id. */
|
|
22
|
+
id: string;
|
|
23
|
+
/** Command to spawn the ACP agent: [binary, ...args]. */
|
|
24
|
+
command: string[];
|
|
25
|
+
/** Environment overlay applied to every spawn. */
|
|
26
|
+
env?: Record<string, string>;
|
|
27
|
+
/** Display label (informational). */
|
|
28
|
+
label?: string;
|
|
29
|
+
/** Static model list surfaced via listModels(). */
|
|
30
|
+
models?: ProviderModel[];
|
|
31
|
+
/** Default mode id applied on session creation. */
|
|
32
|
+
modeId?: string;
|
|
33
|
+
/** Per-agent quirk transformers (modes / modeId). */
|
|
34
|
+
transformers?: AcpTransformers;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async function resolveAcpAuth(
|
|
38
|
+
config: AcpProviderConfig,
|
|
39
|
+
authCtx?: AuthResolveContext,
|
|
40
|
+
): Promise<AuthReport> {
|
|
41
|
+
const binary = authCtx?.command ?? config.command[0]!;
|
|
42
|
+
try {
|
|
43
|
+
const resolved = await ensureCommandResolvable(binary);
|
|
44
|
+
return {
|
|
45
|
+
providerType: config.id,
|
|
46
|
+
binary: { installed: true, resolvedPath: resolved.bin },
|
|
47
|
+
options: [],
|
|
48
|
+
source: "filesystem",
|
|
49
|
+
};
|
|
50
|
+
} catch (err) {
|
|
51
|
+
return {
|
|
52
|
+
providerType: config.id,
|
|
53
|
+
binary: { installed: false, error: err instanceof Error ? err.message : String(err) },
|
|
54
|
+
options: [],
|
|
55
|
+
source: "filesystem",
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Build a generic ACP-backed `ProviderModule`. */
|
|
61
|
+
export function acpProvider(config: AcpProviderConfig): ProviderModule {
|
|
62
|
+
const deps: AcpSessionDeps = {
|
|
63
|
+
provider: config.id,
|
|
64
|
+
command: config.command,
|
|
65
|
+
...(config.env ? { env: config.env } : {}),
|
|
66
|
+
...(config.modeId ? { modeId: config.modeId } : {}),
|
|
67
|
+
...(config.transformers ? { transformers: config.transformers } : {}),
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const provider: ProviderModule = {
|
|
71
|
+
type: config.id,
|
|
72
|
+
capabilities: {
|
|
73
|
+
sessions: true,
|
|
74
|
+
modelDiscovery: Boolean(config.models),
|
|
75
|
+
quotaProbing: false,
|
|
76
|
+
mcp: false,
|
|
77
|
+
skills: false,
|
|
78
|
+
instructions: false,
|
|
79
|
+
workspace: true,
|
|
80
|
+
planMode: false,
|
|
81
|
+
concurrentSend: false,
|
|
82
|
+
cancelQueuedMessage: false,
|
|
83
|
+
stopTask: false,
|
|
84
|
+
modes: true,
|
|
85
|
+
// Real capability set is negotiated at the ACP initialize handshake.
|
|
86
|
+
dynamicCapabilities: true,
|
|
87
|
+
},
|
|
88
|
+
// Session machinery (+ the ACP SDK it dynamically imports) loads only when
|
|
89
|
+
// an ACP provider is actually invoked — index.ts stays a light leaf.
|
|
90
|
+
execute: async (ctx) => (await import("./session.js")).runAcpExecute(deps, ctx),
|
|
91
|
+
createSession: async (ctx) => (await import("./session.js")).createAcpSession(deps, ctx),
|
|
92
|
+
resolveAuth: (authCtx) => resolveAcpAuth(config, authCtx),
|
|
93
|
+
listModes: async (opts?: ListModesOptions) =>
|
|
94
|
+
(await import("./session.js")).listAcpModes(deps, opts as SessionContext | undefined),
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
if (config.models) {
|
|
98
|
+
const models = config.models;
|
|
99
|
+
provider.listModels = async () => models;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return provider;
|
|
103
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import type { BaseStreamEventFields, StreamEvent } from "../../types.js";
|
|
2
|
+
|
|
3
|
+
function str(v: unknown): string | null {
|
|
4
|
+
return typeof v === "string" && v.length > 0 ? v : null;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/** Extract text from an ACP `ContentBlock` (a chunk update's `content`). */
|
|
8
|
+
export function extractContentText(content: unknown): string | null {
|
|
9
|
+
if (!content || typeof content !== "object") return null;
|
|
10
|
+
const c = content as Record<string, unknown>;
|
|
11
|
+
if (c["type"] === "text" && typeof c["text"] === "string") return c["text"];
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Extract displayable text from a tool call's `content` (ToolCallContent[]). */
|
|
16
|
+
export function extractToolContentText(content: unknown): string | null {
|
|
17
|
+
if (!Array.isArray(content)) return null;
|
|
18
|
+
const parts: string[] = [];
|
|
19
|
+
for (const item of content) {
|
|
20
|
+
if (!item || typeof item !== "object") continue;
|
|
21
|
+
const c = item as Record<string, unknown>;
|
|
22
|
+
if (c["type"] === "content") {
|
|
23
|
+
const inner = extractContentText(c["content"]);
|
|
24
|
+
if (inner) parts.push(inner);
|
|
25
|
+
} else if (c["type"] === "diff") {
|
|
26
|
+
const nd = c["newText"] ?? c["new_text"];
|
|
27
|
+
if (typeof nd === "string") parts.push(nd);
|
|
28
|
+
}
|
|
29
|
+
// Note: a "terminal" ToolCallContent carries only a `terminalId` (its output
|
|
30
|
+
// must be fetched via the ACP terminal/* methods, which we don't implement),
|
|
31
|
+
// so there's no inline text to extract here.
|
|
32
|
+
}
|
|
33
|
+
return parts.length ? parts.join("\n") : null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface AcpBaseInfo {
|
|
37
|
+
provider: string;
|
|
38
|
+
sessionId: string | null;
|
|
39
|
+
timestamp: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function makeBase(update: Record<string, unknown>, info: AcpBaseInfo): BaseStreamEventFields {
|
|
43
|
+
// ACP doesn't expose per-event/message/turn ids, so those stay null; the
|
|
44
|
+
// tool callId IS available, so tool_call/tool_result correlate properly.
|
|
45
|
+
return {
|
|
46
|
+
timestamp: info.timestamp,
|
|
47
|
+
providerType: info.provider,
|
|
48
|
+
sessionId: info.sessionId,
|
|
49
|
+
messageId: null,
|
|
50
|
+
eventId: null,
|
|
51
|
+
turnId: null,
|
|
52
|
+
parentToolCallId: null,
|
|
53
|
+
raw: update,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Map an ACP `session/update` payload (`params.update`) to an agentex
|
|
59
|
+
* `StreamEvent`. Returns null for updates with no agentex equivalent (user
|
|
60
|
+
* echoes, in-progress tool ticks). Unknown update kinds surface as
|
|
61
|
+
* `type: "unknown"` for forward-compat.
|
|
62
|
+
*/
|
|
63
|
+
export function mapAcpUpdate(update: Record<string, unknown>, info: AcpBaseInfo): StreamEvent | null {
|
|
64
|
+
const kind = update["sessionUpdate"];
|
|
65
|
+
const base = makeBase(update, info);
|
|
66
|
+
switch (kind) {
|
|
67
|
+
case "agent_message_chunk": {
|
|
68
|
+
const text = extractContentText(update["content"]);
|
|
69
|
+
return text != null ? { type: "assistant", text, ...base } : null;
|
|
70
|
+
}
|
|
71
|
+
case "agent_thought_chunk": {
|
|
72
|
+
const text = extractContentText(update["content"]);
|
|
73
|
+
return text != null ? { type: "thinking", text, ...base } : null;
|
|
74
|
+
}
|
|
75
|
+
case "user_message_chunk":
|
|
76
|
+
return null;
|
|
77
|
+
case "tool_call":
|
|
78
|
+
return {
|
|
79
|
+
type: "tool_call",
|
|
80
|
+
toolCallId: str(update["toolCallId"]),
|
|
81
|
+
name: str(update["title"]) ?? str(update["kind"]) ?? "tool",
|
|
82
|
+
input: update["rawInput"] ?? null,
|
|
83
|
+
...base,
|
|
84
|
+
};
|
|
85
|
+
case "tool_call_update": {
|
|
86
|
+
const status = str(update["status"]);
|
|
87
|
+
// Only emit a result once the tool reaches a terminal state.
|
|
88
|
+
if (status === "completed" || status === "failed") {
|
|
89
|
+
const content =
|
|
90
|
+
extractToolContentText(update["content"]) ??
|
|
91
|
+
(typeof update["rawOutput"] === "string" ? (update["rawOutput"] as string) : "");
|
|
92
|
+
return {
|
|
93
|
+
type: "tool_result",
|
|
94
|
+
toolCallId: str(update["toolCallId"]),
|
|
95
|
+
toolName: str(update["title"]),
|
|
96
|
+
content,
|
|
97
|
+
isError: status === "failed",
|
|
98
|
+
exitCode: null,
|
|
99
|
+
...base,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
default:
|
|
105
|
+
return { type: "unknown", subtype: str(kind) ?? "unknown", ...base };
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// NOTE: ACP's `usage_update` reports context-window `{ size, used }` rather than
|
|
110
|
+
// the input/output token split agentex's `TokenUsage` models, so we intentionally
|
|
111
|
+
// don't synthesize usage from ACP — `TurnResult.usage` stays undefined.
|
|
112
|
+
|
|
113
|
+
/** Map an ACP `stopReason` to an agentex TurnResult status. */
|
|
114
|
+
export function mapAcpStopReason(stopReason: string | undefined): TurnStatus {
|
|
115
|
+
switch (stopReason) {
|
|
116
|
+
case "end_turn":
|
|
117
|
+
return "completed";
|
|
118
|
+
case "cancelled":
|
|
119
|
+
return "aborted";
|
|
120
|
+
case "refusal":
|
|
121
|
+
return "failed";
|
|
122
|
+
case "max_tokens":
|
|
123
|
+
return "max_budget";
|
|
124
|
+
case "max_turn_requests":
|
|
125
|
+
return "max_turns";
|
|
126
|
+
default:
|
|
127
|
+
return "completed";
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
type TurnStatus = "completed" | "failed" | "max_turns" | "max_budget" | "aborted" | "timeout";
|