@agent-api/cli 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -5
- package/dist/index.js +8 -6
- package/dist/runtime.d.ts +4 -0
- package/dist/runtime.js +4 -0
- package/dist/tui/ink/app.d.ts +1 -1
- package/dist/tui/ink/app.js +27 -130
- package/dist/tui/ink/components.d.ts +1 -2
- package/dist/tui/ink/components.js +1 -3
- package/package.json +9 -6
- package/dist/agent/runner.d.ts +0 -117
- package/dist/agent/runner.js +0 -486
- package/dist/agent.d.ts +0 -2
- package/dist/agent.js +0 -2
- package/dist/chat-options.d.ts +0 -37
- package/dist/chat-options.js +0 -42
- package/dist/config.d.ts +0 -66
- package/dist/config.js +0 -201
- package/dist/conversation/index.d.ts +0 -17
- package/dist/conversation/index.js +0 -54
- package/dist/profile.d.ts +0 -57
- package/dist/profile.js +0 -211
- package/dist/runtime/index.d.ts +0 -5
- package/dist/runtime/index.js +0 -152
- package/dist/tui/workbench.d.ts +0 -187
- package/dist/tui/workbench.js +0 -392
- package/dist/update.d.ts +0 -16
- package/dist/update.js +0 -74
- package/dist/workbench/auth-controller.d.ts +0 -43
- package/dist/workbench/auth-controller.js +0 -84
- package/dist/workbench/auth-gate-controller.d.ts +0 -62
- package/dist/workbench/auth-gate-controller.js +0 -231
- package/dist/workbench/command-controller.d.ts +0 -29
- package/dist/workbench/command-controller.js +0 -426
- package/dist/workbench/conversation-controller.d.ts +0 -32
- package/dist/workbench/conversation-controller.js +0 -53
- package/dist/workbench/engine.d.ts +0 -66
- package/dist/workbench/engine.js +0 -291
- package/dist/workbench/input-controller.d.ts +0 -44
- package/dist/workbench/input-controller.js +0 -71
- package/dist/workbench/isolator-installer.d.ts +0 -29
- package/dist/workbench/isolator-installer.js +0 -208
- package/dist/workbench/lifecycle-controller.d.ts +0 -30
- package/dist/workbench/lifecycle-controller.js +0 -75
- package/dist/workbench/local-controller.d.ts +0 -21
- package/dist/workbench/local-controller.js +0 -94
- package/dist/workbench/render-model.d.ts +0 -46
- package/dist/workbench/render-model.js +0 -61
- package/dist/workbench/runtime-controller.d.ts +0 -12
- package/dist/workbench/runtime-controller.js +0 -57
- package/dist/workbench/session.d.ts +0 -27
- package/dist/workbench/session.js +0 -42
- package/dist/workbench/settings-controller.d.ts +0 -80
- package/dist/workbench/settings-controller.js +0 -309
- package/dist/workbench/shell-isolation.d.ts +0 -20
- package/dist/workbench/shell-isolation.js +0 -13
- package/dist/workbench/turn-controller.d.ts +0 -25
- package/dist/workbench/turn-controller.js +0 -164
- package/dist/workbench/view-model.d.ts +0 -34
- package/dist/workbench/view-model.js +0 -121
- package/dist/workdir/index.d.ts +0 -22
- package/dist/workdir/index.js +0 -46
package/README.md
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
# Agent API CLI
|
|
2
2
|
|
|
3
|
-
First-class command line interface for Agent API. The CLI is built on `@agent-api/sdk@^1.
|
|
3
|
+
First-class command line interface for Agent API. The CLI shell is built on `@agent-api/app-engine`, which wraps `@agent-api/sdk@^1.3.0` behind a renderer-neutral application core. Commander handles command routing, and Ink renders the current terminal UI.
|
|
4
|
+
|
|
5
|
+
This repository publishes two packages:
|
|
6
|
+
|
|
7
|
+
- `@agent-api/app-engine`: reusable application core for agent apps.
|
|
8
|
+
- `@agent-api/cli`: command-line shell and Ink TUI renderer.
|
|
4
9
|
|
|
5
10
|
## Development
|
|
6
11
|
|
|
@@ -40,10 +45,11 @@ If your npm account requires two-factor auth for publish:
|
|
|
40
45
|
npm run release:local -- --otp 123456
|
|
41
46
|
```
|
|
42
47
|
|
|
43
|
-
The local release script runs `npm ci`, builds and tests
|
|
44
|
-
npm
|
|
45
|
-
smoke-tests the published bin aliases, and then publishes
|
|
46
|
-
|
|
48
|
+
The local release script runs `npm ci`, builds and tests both packages, creates
|
|
49
|
+
npm tarballs in `artifacts/`, installs the app-engine and CLI tarballs into a
|
|
50
|
+
temporary npm prefix, smoke-tests the published bin aliases, and then publishes
|
|
51
|
+
`@agent-api/app-engine` before `@agent-api/cli` with
|
|
52
|
+
`npm publish --access public`.
|
|
47
53
|
|
|
48
54
|
For a no-publish rehearsal:
|
|
49
55
|
|
package/dist/index.js
CHANGED
|
@@ -4,13 +4,15 @@ import { stat } from "node:fs/promises";
|
|
|
4
4
|
import { resolve } from "node:path";
|
|
5
5
|
import { render } from "ink";
|
|
6
6
|
import React from "react";
|
|
7
|
-
import { conversationSummary, deleteConversation, getConversation, listConversations, runAgent } from "
|
|
8
|
-
import { normalizeChatOptions } from "./chat-options.js";
|
|
7
|
+
import { activeProfile, configureAgentAppRuntime, conversationSummary, deleteConversation, deleteProfile, getConversation, listConversations, listProfiles, loadConfig, loadConversationConfiguration, loginWithAPIKey, loginWithBrowser, normalizeChatOptions, openWorkdir, profileSummary, redactSecret, resolveRuntimeProfile, runAgent, runtime, useProfile, } from "@agent-api/app-engine";
|
|
9
8
|
import { ChatApp } from "./tui/chat.js";
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
import { cliAuthor, cliName, cliVersion, legacyCliName } from "./runtime.js";
|
|
10
|
+
configureAgentAppRuntime({
|
|
11
|
+
appName: cliName,
|
|
12
|
+
appAuthor: cliAuthor,
|
|
13
|
+
appVersion: cliVersion,
|
|
14
|
+
legacyAppName: legacyCliName,
|
|
15
|
+
});
|
|
14
16
|
const program = new Command();
|
|
15
17
|
program
|
|
16
18
|
.name("agent-api")
|
package/dist/runtime.js
ADDED
package/dist/tui/ink/app.d.ts
CHANGED
package/dist/tui/ink/app.js
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
|
|
3
3
|
import { useApp, useInput, useStdout } from "ink";
|
|
4
|
-
import { defaultBaseURL } from "
|
|
5
|
-
import { createWorkbenchAuthController } from "../../workbench/auth-controller.js";
|
|
6
|
-
import { createWorkbenchAuthGateController, } from "../../workbench/auth-gate-controller.js";
|
|
7
|
-
import { createWorkbenchCommandController } from "../../workbench/command-controller.js";
|
|
8
|
-
import { buildWorkbenchRenderModel, } from "../../workbench/render-model.js";
|
|
9
|
-
import { createWorkbenchSession } from "../../workbench/session.js";
|
|
4
|
+
import { buildWorkbenchRenderModel, createAgentEngine, createWorkbenchAuthController, createWorkbenchAuthGateController, defaultBaseURL, } from "@agent-api/app-engine";
|
|
10
5
|
import { InkAuthGate, InkWorkbenchScreen } from "./components.js";
|
|
11
6
|
export function ChatApp({ options }) {
|
|
12
7
|
return _jsx(AuthenticatedChatApp, { options: options });
|
|
@@ -113,38 +108,24 @@ function WorkbenchApp({ authController, onLogin, onLogout, onDeleteProfile, onSw
|
|
|
113
108
|
const [draft, setDraft] = useState("");
|
|
114
109
|
const [spinnerFrame, setSpinnerFrame] = useState(0);
|
|
115
110
|
const [transcriptOffset, setTranscriptOffset] = useState(0);
|
|
116
|
-
const
|
|
117
|
-
if (!
|
|
118
|
-
|
|
111
|
+
const agentEngineRef = useRef(null);
|
|
112
|
+
if (!agentEngineRef.current) {
|
|
113
|
+
agentEngineRef.current = createAgentEngine({
|
|
119
114
|
authController,
|
|
120
115
|
baseOptions: options,
|
|
116
|
+
profileName,
|
|
117
|
+
onDeleteProfile,
|
|
118
|
+
onExit: app.exit,
|
|
119
|
+
onLogin,
|
|
120
|
+
onLogout,
|
|
121
|
+
onSwitchProfile,
|
|
121
122
|
});
|
|
122
123
|
}
|
|
123
|
-
const
|
|
124
|
-
const
|
|
125
|
-
const conversationController = session.conversation;
|
|
124
|
+
const agentEngine = agentEngineRef.current;
|
|
125
|
+
const session = agentEngine.session;
|
|
126
126
|
const inputController = session.input;
|
|
127
|
-
const
|
|
128
|
-
const
|
|
129
|
-
const settingsController = session.settings;
|
|
130
|
-
const turnController = session.turn;
|
|
131
|
-
const state = useSyncExternalStore(engine.subscribe, engine.snapshot, engine.snapshot);
|
|
132
|
-
const dispatch = engine.dispatch;
|
|
133
|
-
const commandController = createWorkbenchCommandController({
|
|
134
|
-
authController,
|
|
135
|
-
conversationController,
|
|
136
|
-
engine,
|
|
137
|
-
localController,
|
|
138
|
-
options,
|
|
139
|
-
profileName,
|
|
140
|
-
settingsController,
|
|
141
|
-
turnController,
|
|
142
|
-
onDeleteProfile,
|
|
143
|
-
onExit: app.exit,
|
|
144
|
-
onLogin,
|
|
145
|
-
onLogout,
|
|
146
|
-
onSwitchProfile,
|
|
147
|
-
});
|
|
127
|
+
const state = useSyncExternalStore(agentEngine.subscribe, agentEngine.snapshot, agentEngine.snapshot);
|
|
128
|
+
const dispatch = agentEngine.dispatch;
|
|
148
129
|
const renderModel = useMemo(() => buildWorkbenchRenderModel({
|
|
149
130
|
draft,
|
|
150
131
|
profileName,
|
|
@@ -171,74 +152,27 @@ function WorkbenchApp({ authController, onLogin, onLogout, onDeleteProfile, onSw
|
|
|
171
152
|
}
|
|
172
153
|
useEffect(() => {
|
|
173
154
|
let mounted = true;
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
if (mounted)
|
|
177
|
-
runLifecycleEffects(effects, () => mounted);
|
|
178
|
-
});
|
|
179
|
-
settingsController.loadInitial({
|
|
180
|
-
modelExplicit: options.modelExplicit,
|
|
181
|
-
preset: options.preset,
|
|
182
|
-
presetExplicit: options.presetExplicit,
|
|
183
|
-
})
|
|
184
|
-
.then((settings) => {
|
|
185
|
-
if (!mounted)
|
|
186
|
-
return;
|
|
187
|
-
dispatch({ type: "settings.set", settings });
|
|
188
|
-
if (settings.activity) {
|
|
189
|
-
dispatch({ type: "activity.add", level: "success", text: settings.activity });
|
|
190
|
-
}
|
|
191
|
-
if (settings.notice) {
|
|
192
|
-
dispatch({ type: "message.add", role: "system", text: settings.notice });
|
|
193
|
-
dispatch({ type: "activity.add", level: "warning", text: "Shell isolation setup is not configured" });
|
|
194
|
-
}
|
|
195
|
-
if (settings.warning) {
|
|
196
|
-
dispatch({ type: "activity.add", level: "warning", text: settings.warning });
|
|
197
|
-
}
|
|
198
|
-
})
|
|
199
|
-
.catch((error) => {
|
|
200
|
-
if (!mounted)
|
|
201
|
-
return;
|
|
202
|
-
dispatch({ type: "activity.add", level: "warning", text: `Config preferences unavailable: ${userFacingError(error)}` });
|
|
203
|
-
});
|
|
155
|
+
void agentEngine.maybeCheckForUpdate({ isMounted: () => mounted });
|
|
156
|
+
void agentEngine.loadInitialSettings({ isMounted: () => mounted });
|
|
204
157
|
return () => {
|
|
205
158
|
mounted = false;
|
|
206
159
|
};
|
|
207
|
-
}, [
|
|
160
|
+
}, [agentEngine]);
|
|
208
161
|
useEffect(() => {
|
|
209
162
|
if (!state.contextEnabled || state.workdir)
|
|
210
163
|
return;
|
|
211
164
|
let mounted = true;
|
|
212
|
-
|
|
213
|
-
localController.load(options.workdir || process.cwd())
|
|
214
|
-
.then((workdir) => {
|
|
215
|
-
if (!mounted)
|
|
216
|
-
return;
|
|
217
|
-
dispatch({
|
|
218
|
-
type: "workdir.set",
|
|
219
|
-
workdir,
|
|
220
|
-
});
|
|
221
|
-
})
|
|
222
|
-
.catch((error) => {
|
|
223
|
-
if (!mounted)
|
|
224
|
-
return;
|
|
225
|
-
dispatch({
|
|
226
|
-
type: "activity.add",
|
|
227
|
-
level: "error",
|
|
228
|
-
text: `Workdir unavailable: ${error instanceof Error ? error.message : String(error)}`,
|
|
229
|
-
});
|
|
230
|
-
});
|
|
165
|
+
void agentEngine.loadWorkdir(options.workdir || process.cwd(), { isMounted: () => mounted });
|
|
231
166
|
return () => {
|
|
232
167
|
mounted = false;
|
|
233
168
|
};
|
|
234
|
-
}, [
|
|
169
|
+
}, [agentEngine, options.workdir, state.contextEnabled, state.workdir]);
|
|
235
170
|
useEffect(() => {
|
|
236
171
|
let mounted = true;
|
|
237
172
|
const refreshIntervalMs = 60_000;
|
|
238
173
|
const refreshAuth = async () => {
|
|
239
|
-
const effects = await lifecycleController.refreshAuth(options.profile);
|
|
240
174
|
if (mounted)
|
|
241
|
-
|
|
175
|
+
await agentEngine.refreshAuth(options.profile, { isMounted: () => mounted });
|
|
242
176
|
};
|
|
243
177
|
void refreshAuth();
|
|
244
178
|
const interval = setInterval(refreshAuth, refreshIntervalMs);
|
|
@@ -246,7 +180,7 @@ function WorkbenchApp({ authController, onLogin, onLogout, onDeleteProfile, onSw
|
|
|
246
180
|
mounted = false;
|
|
247
181
|
clearInterval(interval);
|
|
248
182
|
};
|
|
249
|
-
}, [
|
|
183
|
+
}, [agentEngine, options.profile]);
|
|
250
184
|
useInput((input, key) => {
|
|
251
185
|
const result = inputController.handle(input, key, {
|
|
252
186
|
busy: state.busy,
|
|
@@ -270,10 +204,10 @@ function WorkbenchApp({ authController, onLogin, onLogout, onDeleteProfile, onSw
|
|
|
270
204
|
scrollTranscriptToBottom();
|
|
271
205
|
break;
|
|
272
206
|
case "abort":
|
|
273
|
-
void
|
|
207
|
+
void agentEngine.abortActiveTurn("Abort requested.");
|
|
274
208
|
break;
|
|
275
209
|
case "submit":
|
|
276
|
-
void submit(effect.input);
|
|
210
|
+
void agentEngine.submit(effect.input);
|
|
277
211
|
break;
|
|
278
212
|
case "ignored_busy":
|
|
279
213
|
dispatch({ type: "message.add", role: "system", text: "Agent turn is running. Use /abort or Esc to cancel it." });
|
|
@@ -283,15 +217,8 @@ function WorkbenchApp({ authController, onLogin, onLogout, onDeleteProfile, onSw
|
|
|
283
217
|
}
|
|
284
218
|
});
|
|
285
219
|
useEffect(() => {
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
promptParts: options.promptParts,
|
|
289
|
-
requiresWorkdir: state.contextEnabled,
|
|
290
|
-
workdir: state.workdir,
|
|
291
|
-
});
|
|
292
|
-
if (initialPrompt)
|
|
293
|
-
void turnController.startPrompt(initialPrompt);
|
|
294
|
-
}, [lifecycleController, options.promptParts, state.busy, state.contextEnabled, state.workdir, turnController]);
|
|
220
|
+
void agentEngine.startInitialPrompt();
|
|
221
|
+
}, [agentEngine, state.busy, state.contextEnabled, state.workdir]);
|
|
295
222
|
useEffect(() => {
|
|
296
223
|
if (!state.busy) {
|
|
297
224
|
setSpinnerFrame(0);
|
|
@@ -303,37 +230,7 @@ function WorkbenchApp({ authController, onLogin, onLogout, onDeleteProfile, onSw
|
|
|
303
230
|
return () => clearInterval(interval);
|
|
304
231
|
}, [state.busy]);
|
|
305
232
|
useEffect(() => {
|
|
306
|
-
return () =>
|
|
307
|
-
}, [
|
|
308
|
-
function runLifecycleEffects(effects, isMounted) {
|
|
309
|
-
for (const effect of effects) {
|
|
310
|
-
switch (effect.type) {
|
|
311
|
-
case "dispatch":
|
|
312
|
-
dispatch(effect.action);
|
|
313
|
-
break;
|
|
314
|
-
case "close":
|
|
315
|
-
setTimeout(() => {
|
|
316
|
-
if (isMounted())
|
|
317
|
-
app.exit();
|
|
318
|
-
}, effect.delayMs);
|
|
319
|
-
break;
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
async function submit(input) {
|
|
324
|
-
const submission = engine.submit(input);
|
|
325
|
-
if (submission.kind === "command") {
|
|
326
|
-
await commandController.run(submission.command);
|
|
327
|
-
return;
|
|
328
|
-
}
|
|
329
|
-
if (submission.kind === "prompt") {
|
|
330
|
-
await turnController.startPrompt(submission.prompt);
|
|
331
|
-
}
|
|
332
|
-
}
|
|
233
|
+
return () => agentEngine.dispose();
|
|
234
|
+
}, [agentEngine]);
|
|
333
235
|
return _jsx(InkWorkbenchScreen, { renderModel: renderModel, spinnerFrame: spinnerFrame });
|
|
334
236
|
}
|
|
335
|
-
function userFacingError(error) {
|
|
336
|
-
if (error instanceof Error)
|
|
337
|
-
return error.message;
|
|
338
|
-
return String(error);
|
|
339
|
-
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { type AuthGateState } from "
|
|
3
|
-
import { type WorkbenchRenderModel } from "../../workbench/render-model.js";
|
|
2
|
+
import { type AuthGateState, type WorkbenchRenderModel } from "@agent-api/app-engine";
|
|
4
3
|
export declare function InkWorkbenchScreen({ renderModel, spinnerFrame, }: {
|
|
5
4
|
renderModel: WorkbenchRenderModel;
|
|
6
5
|
spinnerFrame: number;
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Box, Text } from "ink";
|
|
3
|
-
import { authMethods } from "
|
|
4
|
-
import { busySpinner } from "../../workbench/render-model.js";
|
|
5
|
-
import { activityColor, } from "../workbench.js";
|
|
3
|
+
import { activityColor, authMethods, busySpinner, } from "@agent-api/app-engine";
|
|
6
4
|
export function InkWorkbenchScreen({ renderModel, spinnerFrame, }) {
|
|
7
5
|
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Header, { contextEnabled: renderModel.header.contextEnabled, conversation: renderModel.header.conversation, model: renderModel.header.model, accessMode: renderModel.header.accessMode, pendingLocalLabel: renderModel.header.pendingLocalLabel, preset: renderModel.header.preset, profile: renderModel.header.profile, renderMode: renderModel.header.renderMode, workdir: renderModel.header.workdir }), _jsxs(Box, { marginTop: 1, height: renderModel.viewportHeight, children: [_jsxs(Box, { flexDirection: "column", width: "72%", paddingRight: 1, children: [renderModel.transcript.visibleLines.map((line) => (_jsx(Text, { bold: line.bold, color: line.color, inverse: line.inverse, wrap: "truncate", children: line.text || " " }, line.id))), renderModel.transcript.visibleLines.length === 0 && _jsx(Text, { color: "gray", children: "No transcript lines." })] }), _jsxs(Box, { flexDirection: "column", width: "28%", height: renderModel.activityHeight, borderStyle: "single", borderColor: "gray", paddingX: 1, children: [_jsx(Text, { bold: true, wrap: "truncate", children: "Activity" }), renderModel.visibleActivities.map((activity) => (_jsxs(Text, { color: activityColor(activity.level), wrap: "truncate", children: [new Date(activity.timestamp).toLocaleTimeString(), " ", activity.text] }, activity.id)))] })] }), _jsxs(Box, { borderStyle: "single", borderColor: renderModel.input.busy ? "yellow" : "green", paddingX: 1, children: [renderModel.input.fullAccess && (_jsx(Text, { color: "red", bold: true, inverse: true, children: "FULL ACCESS" })), renderModel.input.fullAccess && _jsx(Text, { children: " " }), _jsxs(Text, { color: renderModel.input.busy ? "yellow" : "green", children: [renderModel.input.label, " "] }), renderModel.input.busy ? (_jsxs(Text, { wrap: "truncate", children: [_jsx(Text, { color: "yellow", children: busySpinner(spinnerFrame) }), " ", renderModel.input.waitingText] })) : (_jsxs(Text, { wrap: "truncate", children: [renderModel.input.draft, _jsx(Cursor, { visible: true })] }))] }), _jsx(Box, { paddingX: 1, children: _jsx(Text, { color: "gray", wrap: "truncate", children: renderModel.footerText }) })] }));
|
|
8
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-api/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "First-class command line interface for Agent API",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://github.com/scalebox-dev/agent-tui#readme",
|
|
@@ -12,6 +12,9 @@
|
|
|
12
12
|
"url": "https://github.com/scalebox-dev/agent-tui/issues"
|
|
13
13
|
},
|
|
14
14
|
"type": "module",
|
|
15
|
+
"workspaces": [
|
|
16
|
+
"packages/app-engine"
|
|
17
|
+
],
|
|
15
18
|
"bin": {
|
|
16
19
|
"agent-api": "dist/index.js",
|
|
17
20
|
"agentsway": "dist/index.js",
|
|
@@ -20,7 +23,8 @@
|
|
|
20
23
|
"scripts": {
|
|
21
24
|
"sync-version": "node scripts/sync-version.mjs",
|
|
22
25
|
"clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
23
|
-
"build": "npm run
|
|
26
|
+
"build:app-engine": "npm run build -w @agent-api/app-engine",
|
|
27
|
+
"build": "npm run build:app-engine && npm run clean && tsc -p tsconfig.json && node scripts/prepare-bin.mjs",
|
|
24
28
|
"dev": "npm run build && node dist/index.js",
|
|
25
29
|
"dev:link": "node scripts/dev-link.mjs",
|
|
26
30
|
"start": "node dist/index.js",
|
|
@@ -28,14 +32,13 @@
|
|
|
28
32
|
"pack:local": "npm pack --pack-destination ./artifacts",
|
|
29
33
|
"release:local": "node scripts/release-local.mjs",
|
|
30
34
|
"prepack": "npm run sync-version && npm run build",
|
|
31
|
-
"test": "npm run sync-version && npm run build && node --test test/*.test.mjs"
|
|
35
|
+
"test": "npm run sync-version && npm run build && npm run smoke -w @agent-api/app-engine && node --test test/*.test.mjs"
|
|
32
36
|
},
|
|
33
37
|
"dependencies": {
|
|
34
|
-
"@agent-api/
|
|
38
|
+
"@agent-api/app-engine": "^0.0.1",
|
|
35
39
|
"commander": "^14.0.3",
|
|
36
40
|
"ink": "^6.8.0",
|
|
37
|
-
"react": "^19.2.7"
|
|
38
|
-
"zod": "^4.4.3"
|
|
41
|
+
"react": "^19.2.7"
|
|
39
42
|
},
|
|
40
43
|
"devDependencies": {
|
|
41
44
|
"@types/node": "^24.0.0",
|
package/dist/agent/runner.d.ts
DELETED
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import { type AgentResponse, type PresetToolCatalogClient, type ResponseStreamEvent, type Tool } from "@agent-api/sdk";
|
|
2
|
-
import type { ShellIsolationPreferences } from "../workbench/shell-isolation.js";
|
|
3
|
-
export interface AgentRunOptions {
|
|
4
|
-
profile?: string;
|
|
5
|
-
promptParts: string[];
|
|
6
|
-
file?: string;
|
|
7
|
-
stdin?: boolean;
|
|
8
|
-
preset?: string;
|
|
9
|
-
presetExplicit?: boolean;
|
|
10
|
-
model?: string;
|
|
11
|
-
modelExplicit?: boolean;
|
|
12
|
-
stream?: boolean;
|
|
13
|
-
conversation?: string;
|
|
14
|
-
continueConversation?: boolean;
|
|
15
|
-
restartConversation?: boolean;
|
|
16
|
-
previousResponseId?: string;
|
|
17
|
-
workdir?: string;
|
|
18
|
-
includeLocalContext?: boolean;
|
|
19
|
-
contextQuery?: string;
|
|
20
|
-
maxContextFiles?: number;
|
|
21
|
-
maxContextBytes?: number;
|
|
22
|
-
accessMode?: WorkdirAccessMode;
|
|
23
|
-
shellIsolation?: ShellIsolationPreferences;
|
|
24
|
-
abortSignal?: AbortSignal;
|
|
25
|
-
}
|
|
26
|
-
export type WorkdirAccessMode = "off" | "approval" | "full";
|
|
27
|
-
export interface AgentTurnResult {
|
|
28
|
-
text: string;
|
|
29
|
-
responseID?: string;
|
|
30
|
-
}
|
|
31
|
-
export interface LocalToolApprovalRequest {
|
|
32
|
-
name: string;
|
|
33
|
-
action?: string;
|
|
34
|
-
arguments: Record<string, unknown>;
|
|
35
|
-
preview?: unknown;
|
|
36
|
-
callID: string;
|
|
37
|
-
responseID: string;
|
|
38
|
-
}
|
|
39
|
-
export type AgentTurnEvent = {
|
|
40
|
-
type: "text.delta";
|
|
41
|
-
delta: string;
|
|
42
|
-
} | {
|
|
43
|
-
type: "response.started";
|
|
44
|
-
responseID?: string;
|
|
45
|
-
} | {
|
|
46
|
-
type: "response.completed";
|
|
47
|
-
responseID?: string;
|
|
48
|
-
} | {
|
|
49
|
-
type: "response.failed";
|
|
50
|
-
message: string;
|
|
51
|
-
} | {
|
|
52
|
-
type: "reasoning.started";
|
|
53
|
-
} | {
|
|
54
|
-
type: "reasoning.stopped";
|
|
55
|
-
thought?: string;
|
|
56
|
-
} | {
|
|
57
|
-
type: "reasoning.search_queries";
|
|
58
|
-
queries: string[];
|
|
59
|
-
} | {
|
|
60
|
-
type: "reasoning.search_results";
|
|
61
|
-
count: number;
|
|
62
|
-
} | {
|
|
63
|
-
type: "reasoning.fetch_url_queries";
|
|
64
|
-
urls: string[];
|
|
65
|
-
} | {
|
|
66
|
-
type: "reasoning.fetch_url_results";
|
|
67
|
-
count: number;
|
|
68
|
-
} | {
|
|
69
|
-
type: "tool.completed";
|
|
70
|
-
name: string;
|
|
71
|
-
status?: string;
|
|
72
|
-
} | {
|
|
73
|
-
type: "local_tool.completed";
|
|
74
|
-
name: string;
|
|
75
|
-
action?: string;
|
|
76
|
-
requiresApproval?: boolean;
|
|
77
|
-
} | ({
|
|
78
|
-
type: "local_tool.approval_requested";
|
|
79
|
-
} & LocalToolApprovalRequest) | {
|
|
80
|
-
type: "model.requested";
|
|
81
|
-
model?: string;
|
|
82
|
-
provider?: string;
|
|
83
|
-
} | {
|
|
84
|
-
type: "model.completed";
|
|
85
|
-
model?: string;
|
|
86
|
-
provider?: string;
|
|
87
|
-
} | {
|
|
88
|
-
type: "model.failed";
|
|
89
|
-
model?: string;
|
|
90
|
-
provider?: string;
|
|
91
|
-
} | {
|
|
92
|
-
type: "step.completed";
|
|
93
|
-
stepType?: string;
|
|
94
|
-
} | {
|
|
95
|
-
type: "step.failed";
|
|
96
|
-
stepType?: string;
|
|
97
|
-
} | {
|
|
98
|
-
type: "raw";
|
|
99
|
-
eventType: string;
|
|
100
|
-
};
|
|
101
|
-
export interface ResolveAgentRequestToolsOptions {
|
|
102
|
-
baseURL?: string;
|
|
103
|
-
cacheTTLMS?: number;
|
|
104
|
-
}
|
|
105
|
-
export interface PresetSummary {
|
|
106
|
-
preset: string;
|
|
107
|
-
description?: string;
|
|
108
|
-
}
|
|
109
|
-
export declare function runAgent(options: AgentRunOptions): Promise<void>;
|
|
110
|
-
export declare function runAgentTurn(options: AgentRunOptions, onEvent?: (event: AgentTurnEvent) => void): Promise<AgentTurnResult>;
|
|
111
|
-
export declare function resumeAgentAfterLocalApproval(options: AgentRunOptions, approval: LocalToolApprovalRequest, output: string | Record<string, unknown>, onEvent?: (event: AgentTurnEvent) => void): Promise<AgentTurnResult>;
|
|
112
|
-
export declare function listAvailablePresets(profileName?: string): Promise<PresetSummary[]>;
|
|
113
|
-
export declare function isAvailablePreset(profileName: string | undefined, preset: string): Promise<boolean>;
|
|
114
|
-
export declare function agentResponseFailureMessage(response: AgentResponse): string;
|
|
115
|
-
export declare function agentTurnEventFromStreamEvent(event: ResponseStreamEvent): AgentTurnEvent | null;
|
|
116
|
-
export declare function resolveAgentRequestTools(client: PresetToolCatalogClient, preset?: string, tools?: readonly Tool[], options?: ResolveAgentRequestToolsOptions): Promise<Tool[] | undefined>;
|
|
117
|
-
export declare function clearPresetToolCatalogCache(baseURL?: string): void;
|