@multiplayer-app/agent 0.1.8 → 0.1.10
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 +106 -0
- package/dist/agent/definition.d.ts +22 -0
- package/dist/agent/definition.d.ts.map +1 -0
- package/dist/agent/definition.js +3 -0
- package/dist/agent/definition.js.map +1 -0
- package/dist/agent/definition.test.d.ts +2 -0
- package/dist/agent/definition.test.d.ts.map +1 -0
- package/dist/agent/definition.test.js +40 -0
- package/dist/agent/definition.test.js.map +1 -0
- package/dist/agent/profiles/coding.d.ts +4 -0
- package/dist/agent/profiles/coding.d.ts.map +1 -0
- package/dist/agent/profiles/coding.js +17 -0
- package/dist/agent/profiles/coding.js.map +1 -0
- package/dist/agent/profiles/index.d.ts +4 -0
- package/dist/agent/profiles/index.d.ts.map +1 -0
- package/dist/agent/profiles/index.js +9 -0
- package/dist/agent/profiles/index.js.map +1 -0
- package/dist/agent/profiles/research.d.ts +4 -0
- package/dist/agent/profiles/research.d.ts.map +1 -0
- package/dist/agent/profiles/research.js +43 -0
- package/dist/agent/profiles/research.js.map +1 -0
- package/dist/agent/turn-runner.d.ts +37 -0
- package/dist/agent/turn-runner.d.ts.map +1 -0
- package/dist/agent/turn-runner.js +94 -0
- package/dist/agent/turn-runner.js.map +1 -0
- package/dist/agent/turn-runner.test.d.ts +2 -0
- package/dist/agent/turn-runner.test.d.ts.map +1 -0
- package/dist/agent/turn-runner.test.js +181 -0
- package/dist/agent/turn-runner.test.js.map +1 -0
- package/dist/index.d.ts +11 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -10
- package/dist/index.js.map +1 -1
- package/dist/models/attribution.d.ts.map +1 -0
- package/dist/models/attribution.js.map +1 -0
- package/dist/{model.d.ts → models/resolve-model.d.ts} +2 -2
- package/dist/models/resolve-model.d.ts.map +1 -0
- package/dist/{model.js → models/resolve-model.js} +1 -1
- package/dist/models/resolve-model.js.map +1 -0
- package/dist/models/usage.d.ts +7 -0
- package/dist/models/usage.d.ts.map +1 -0
- package/dist/models/usage.js +13 -0
- package/dist/models/usage.js.map +1 -0
- package/dist/{git-sync.d.ts → persistence/git-sync.d.ts} +1 -1
- package/dist/persistence/git-sync.d.ts.map +1 -0
- package/dist/persistence/git-sync.js.map +1 -0
- package/dist/persistence/git-sync.test.d.ts.map +1 -0
- package/dist/{git-sync.test.js → persistence/git-sync.test.js} +2 -2
- package/dist/persistence/git-sync.test.js.map +1 -0
- package/dist/{session-storage-sync.d.ts → persistence/snapshot-sync.d.ts} +2 -2
- package/dist/persistence/snapshot-sync.d.ts.map +1 -0
- package/dist/{session-storage-sync.js → persistence/snapshot-sync.js} +1 -1
- package/dist/persistence/snapshot-sync.js.map +1 -0
- package/dist/persistence/snapshot-sync.test.d.ts +2 -0
- package/dist/persistence/snapshot-sync.test.d.ts.map +1 -0
- package/dist/{session-storage-sync.test.js → persistence/snapshot-sync.test.js} +3 -3
- package/dist/persistence/snapshot-sync.test.js.map +1 -0
- package/dist/persistence/workspace.d.ts +17 -0
- package/dist/persistence/workspace.d.ts.map +1 -0
- package/dist/persistence/workspace.js +26 -0
- package/dist/persistence/workspace.js.map +1 -0
- package/dist/persistence/workspace.test.d.ts +2 -0
- package/dist/persistence/workspace.test.d.ts.map +1 -0
- package/dist/persistence/workspace.test.js +38 -0
- package/dist/persistence/workspace.test.js.map +1 -0
- package/dist/research/extraction-tool.d.ts +6 -0
- package/dist/research/extraction-tool.d.ts.map +1 -0
- package/dist/research/extraction-tool.js +67 -0
- package/dist/research/extraction-tool.js.map +1 -0
- package/dist/research/extraction-tool.test.d.ts +2 -0
- package/dist/research/extraction-tool.test.d.ts.map +1 -0
- package/dist/research/extraction-tool.test.js +100 -0
- package/dist/research/extraction-tool.test.js.map +1 -0
- package/dist/research/filingramp/attachment-tools.d.ts +4 -0
- package/dist/research/filingramp/attachment-tools.d.ts.map +1 -0
- package/dist/research/filingramp/attachment-tools.js +99 -0
- package/dist/research/filingramp/attachment-tools.js.map +1 -0
- package/dist/research/filingramp/document-search-tool.d.ts +4 -0
- package/dist/research/filingramp/document-search-tool.d.ts.map +1 -0
- package/dist/research/filingramp/document-search-tool.js +173 -0
- package/dist/research/filingramp/document-search-tool.js.map +1 -0
- package/dist/research/filingramp/filing-detail-tool.d.ts +4 -0
- package/dist/research/filingramp/filing-detail-tool.d.ts.map +1 -0
- package/dist/research/filingramp/filing-detail-tool.js +114 -0
- package/dist/research/filingramp/filing-detail-tool.js.map +1 -0
- package/dist/research/filingramp/filing-search-tools.d.ts +4 -0
- package/dist/research/filingramp/filing-search-tools.d.ts.map +1 -0
- package/dist/research/filingramp/filing-search-tools.js +207 -0
- package/dist/research/filingramp/filing-search-tools.js.map +1 -0
- package/dist/research/filingramp/shared.d.ts +48 -0
- package/dist/research/filingramp/shared.d.ts.map +1 -0
- package/dist/research/filingramp/shared.js +58 -0
- package/dist/research/filingramp/shared.js.map +1 -0
- package/dist/research/filingramp-client.d.ts +1 -1
- package/dist/research/filingramp-client.d.ts.map +1 -1
- package/dist/research/filingramp-tools.d.ts +3 -8
- package/dist/research/filingramp-tools.d.ts.map +1 -1
- package/dist/research/filingramp-tools.js +14 -565
- package/dist/research/filingramp-tools.js.map +1 -1
- package/dist/research/filingramp-tools.test.js +45 -2
- package/dist/research/filingramp-tools.test.js.map +1 -1
- package/dist/research/prompt.d.ts +1 -1
- package/dist/research/prompt.d.ts.map +1 -1
- package/dist/research/scope.d.ts +1 -1
- package/dist/research/scope.d.ts.map +1 -1
- package/dist/runtime/cli.d.ts.map +1 -0
- package/dist/{cli.js → runtime/cli.js} +3 -3
- package/dist/runtime/cli.js.map +1 -0
- package/dist/{config.d.ts → runtime/config.d.ts} +1 -1
- package/dist/runtime/config.d.ts.map +1 -0
- package/dist/{config.js → runtime/config.js} +1 -1
- package/dist/runtime/config.js.map +1 -0
- package/dist/{runtime.d.ts → runtime/index.d.ts} +2 -2
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/{runtime.js → runtime/index.js} +7 -7
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/lambda-microvm.d.ts +3 -0
- package/dist/runtime/lambda-microvm.d.ts.map +1 -0
- package/dist/{lambda-microvm-entrypoint.js → runtime/lambda-microvm.js} +4 -4
- package/dist/runtime/lambda-microvm.js.map +1 -0
- package/dist/runtime/lifecycle.test.d.ts.map +1 -0
- package/dist/{lifecycle.test.js → runtime/lifecycle.test.js} +5 -5
- package/dist/runtime/lifecycle.test.js.map +1 -0
- package/dist/session/checkpoint-timer.test.d.ts.map +1 -0
- package/dist/{checkpoint-timer.test.js → session/checkpoint-timer.test.js} +8 -8
- package/dist/session/checkpoint-timer.test.js.map +1 -0
- package/dist/session/conversation.d.ts +15 -0
- package/dist/session/conversation.d.ts.map +1 -0
- package/dist/session/conversation.js +61 -0
- package/dist/session/conversation.js.map +1 -0
- package/dist/session/conversation.test.d.ts +2 -0
- package/dist/session/conversation.test.d.ts.map +1 -0
- package/dist/session/conversation.test.js +53 -0
- package/dist/session/conversation.test.js.map +1 -0
- package/dist/session/idle-checkpoint.test.d.ts.map +1 -0
- package/dist/{idle-checkpoint.test.js → session/idle-checkpoint.test.js} +8 -4
- package/dist/session/idle-checkpoint.test.js.map +1 -0
- package/dist/session/index.d.ts +7 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +16 -0
- package/dist/session/index.js.map +1 -0
- package/dist/{session.d.ts → session/runtime.d.ts} +20 -16
- package/dist/session/runtime.d.ts.map +1 -0
- package/dist/session/runtime.js +251 -0
- package/dist/session/runtime.js.map +1 -0
- package/dist/session/runtime.test.d.ts +2 -0
- package/dist/session/runtime.test.d.ts.map +1 -0
- package/dist/session/runtime.test.js +201 -0
- package/dist/session/runtime.test.js.map +1 -0
- package/dist/session/tool-context.d.ts +12 -0
- package/dist/session/tool-context.d.ts.map +1 -0
- package/dist/session/tool-context.js +3 -0
- package/dist/session/tool-context.js.map +1 -0
- package/dist/session/tools.d.ts +6 -0
- package/dist/session/tools.d.ts.map +1 -0
- package/dist/session/tools.js +97 -0
- package/dist/session/tools.js.map +1 -0
- package/dist/session/tools.test.d.ts +2 -0
- package/dist/session/tools.test.d.ts.map +1 -0
- package/dist/session/tools.test.js +55 -0
- package/dist/session/tools.test.js.map +1 -0
- package/dist/task/loop.d.ts +6 -0
- package/dist/task/loop.d.ts.map +1 -0
- package/dist/{loop.js → task/loop.js} +6 -6
- package/dist/task/loop.js.map +1 -0
- package/dist/transport/link.d.ts.map +1 -0
- package/dist/transport/link.js.map +1 -0
- package/dist/transport/protocol.d.ts.map +1 -0
- package/dist/transport/protocol.js.map +1 -0
- package/dist/transport/protocol.test.d.ts.map +1 -0
- package/dist/transport/protocol.test.js.map +1 -0
- package/dist/{report.d.ts → transport/reporter.d.ts} +1 -1
- package/dist/transport/reporter.d.ts.map +1 -0
- package/dist/{report.js → transport/reporter.js} +1 -1
- package/dist/transport/reporter.js.map +1 -0
- package/package.json +11 -11
- package/dist/attribution.d.ts.map +0 -1
- package/dist/attribution.js.map +0 -1
- package/dist/checkpoint-timer.test.d.ts.map +0 -1
- package/dist/checkpoint-timer.test.js.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/git-sync.d.ts.map +0 -1
- package/dist/git-sync.js.map +0 -1
- package/dist/git-sync.test.d.ts.map +0 -1
- package/dist/git-sync.test.js.map +0 -1
- package/dist/idle-checkpoint.test.d.ts.map +0 -1
- package/dist/idle-checkpoint.test.js.map +0 -1
- package/dist/lambda-microvm-entrypoint.d.ts +0 -3
- package/dist/lambda-microvm-entrypoint.d.ts.map +0 -1
- package/dist/lambda-microvm-entrypoint.js.map +0 -1
- package/dist/lifecycle.test.d.ts.map +0 -1
- package/dist/lifecycle.test.js.map +0 -1
- package/dist/link.d.ts.map +0 -1
- package/dist/link.js.map +0 -1
- package/dist/loop.d.ts +0 -6
- package/dist/loop.d.ts.map +0 -1
- package/dist/loop.js.map +0 -1
- package/dist/model.d.ts.map +0 -1
- package/dist/model.js.map +0 -1
- package/dist/protocol.d.ts.map +0 -1
- package/dist/protocol.js.map +0 -1
- package/dist/protocol.test.d.ts.map +0 -1
- package/dist/protocol.test.js.map +0 -1
- package/dist/report.d.ts.map +0 -1
- package/dist/report.js.map +0 -1
- package/dist/runtime.d.ts.map +0 -1
- package/dist/runtime.js.map +0 -1
- package/dist/session-storage-sync.d.ts.map +0 -1
- package/dist/session-storage-sync.js.map +0 -1
- package/dist/session-storage-sync.test.d.ts +0 -2
- package/dist/session-storage-sync.test.d.ts.map +0 -1
- package/dist/session-storage-sync.test.js.map +0 -1
- package/dist/session.d.ts.map +0 -1
- package/dist/session.js +0 -512
- package/dist/session.js.map +0 -1
- /package/dist/{attribution.d.ts → models/attribution.d.ts} +0 -0
- /package/dist/{attribution.js → models/attribution.js} +0 -0
- /package/dist/{git-sync.js → persistence/git-sync.js} +0 -0
- /package/dist/{git-sync.test.d.ts → persistence/git-sync.test.d.ts} +0 -0
- /package/dist/{cli.d.ts → runtime/cli.d.ts} +0 -0
- /package/dist/{lifecycle.test.d.ts → runtime/lifecycle.test.d.ts} +0 -0
- /package/dist/{checkpoint-timer.test.d.ts → session/checkpoint-timer.test.d.ts} +0 -0
- /package/dist/{idle-checkpoint.test.d.ts → session/idle-checkpoint.test.d.ts} +0 -0
- /package/dist/{link.d.ts → transport/link.d.ts} +0 -0
- /package/dist/{link.js → transport/link.js} +0 -0
- /package/dist/{protocol.d.ts → transport/protocol.d.ts} +0 -0
- /package/dist/{protocol.js → transport/protocol.js} +0 -0
- /package/dist/{protocol.test.d.ts → transport/protocol.test.d.ts} +0 -0
- /package/dist/{protocol.test.js → transport/protocol.test.js} +0 -0
package/README.md
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Agent library
|
|
2
|
+
|
|
3
|
+
This package runs inside the sandbox VM. Start with `src/runtime/index.ts`: it loads environment
|
|
4
|
+
configuration, chooses a mode, and connects the agent to the gateway.
|
|
5
|
+
|
|
6
|
+
## Where to make changes
|
|
7
|
+
|
|
8
|
+
| Area | Files | Responsibility |
|
|
9
|
+
| --- | --- | --- |
|
|
10
|
+
| Startup | `src/runtime/cli.ts`, `src/runtime/index.ts`, `src/runtime/lambda-microvm.ts` | Process startup, shutdown, Lambda suspend/terminate hooks |
|
|
11
|
+
| Configuration and wire contract | `src/runtime/config.ts`, `src/transport/protocol.ts` | Environment variables, commands, events, secret keys |
|
|
12
|
+
| One-shot tasks | `src/task/loop.ts`, `src/transport/reporter.ts` | Run `AGENT_TASK`, report results, exit |
|
|
13
|
+
| Agent definitions | `src/agent/definition.ts`, `src/agent/profiles/` | Coding/research prompts, model selection, workspace directories, tool composition |
|
|
14
|
+
| Turn execution | `src/agent/turn-runner.ts` | Execute one model/tool loop, report events and usage, return a completed/aborted/failed outcome |
|
|
15
|
+
| Chat sessions | `src/session/runtime.ts` | Own conversation, budget, queue, checkpoints, and shutdown |
|
|
16
|
+
| Compatibility entry point | `src/session/index.ts` | Preserve `SessionAgent`, `runSessionAgent`, and `limitConversation` imports |
|
|
17
|
+
| Conversation storage | `src/session/conversation.ts` | Context trimming and atomic conversation-file writes |
|
|
18
|
+
| Session tools | `src/session/tools.ts`, `src/session/tool-context.ts` | Register tools, report progress, ask questions, publish artifacts |
|
|
19
|
+
| Models and usage | `src/models/resolve-model.ts`, `src/models/usage.ts` | Resolve a definition's model and normalize token usage |
|
|
20
|
+
| Workspace persistence | `src/persistence/workspace.ts`, `src/persistence/git-sync.ts`, `src/persistence/snapshot-sync.ts` | Common restore/checkpoint interface backed by project Git or standalone session snapshots |
|
|
21
|
+
| Gateway connection | `src/transport/link.ts` | Send sequenced events and acknowledge commands |
|
|
22
|
+
| Local and MCP tools | `src/tools/`, `src/mcp/` | Filesystem, shell, external tool discovery and execution |
|
|
23
|
+
| Research tools | `src/research/filingramp-tools.ts`, `src/research/filingramp/` | Register FilingRamp tools and implement searches, filing details, downloads |
|
|
24
|
+
| Research contracts | `src/research/filingramp-contract.ts`, `src/research/scope.ts` | Normalize API-specific filters and apply the session scope |
|
|
25
|
+
| Research extraction | `src/research/extraction-tool.ts`, `src/research/prompt.ts` | Bulk model extraction and research instructions |
|
|
26
|
+
|
|
27
|
+
The package exports in `src/index.ts`, `./protocol`, and `./attribution` are the
|
|
28
|
+
public integration points. `SessionAgent` is an alias for `SessionRuntime`, so existing
|
|
29
|
+
constructors and lifecycle calls still work. New consumers can use `AgentDefinition`,
|
|
30
|
+
`TurnRunner`, and `WorkspacePersistence` directly.
|
|
31
|
+
|
|
32
|
+
## Ownership boundaries
|
|
33
|
+
|
|
34
|
+
`AgentDefinition` describes a profile: its model, instructions, workspace directories,
|
|
35
|
+
step limit, and tool factory. The research definition retains its FilingRamp client and
|
|
36
|
+
scope lookup cache across turns. It creates turn-specific progress, clarification, and
|
|
37
|
+
extraction tools for each execution.
|
|
38
|
+
|
|
39
|
+
`TurnRunner.run()` receives messages, instructions, an abort signal, an event sink, and
|
|
40
|
+
budget callbacks. It returns a typed outcome and messages to append. It does not modify
|
|
41
|
+
the supplied history, create timers, access the gateway connection, or checkpoint files.
|
|
42
|
+
|
|
43
|
+
`SessionRuntime` owns mutable session state. It passes context to the runner, appends the
|
|
44
|
+
returned messages, and decides when completion can be announced. Its constructor accepts
|
|
45
|
+
optional definition, runner, and persistence dependencies so these boundaries can be tested
|
|
46
|
+
without a model provider or storage server.
|
|
47
|
+
|
|
48
|
+
`WorkspacePersistence` adapts the existing Git/snapshot sync classes. Its checkpoint result
|
|
49
|
+
distinguishes a Git commit from a snapshot hash; neither leaks into the other's wire contract.
|
|
50
|
+
A successful no-op is still durable. A failed restore or upload rejects the operation.
|
|
51
|
+
|
|
52
|
+
## Session flow and invariants
|
|
53
|
+
|
|
54
|
+
1. Restore the workspace, then load `.builder/conversation.json`, build tools, and
|
|
55
|
+
announce readiness. A failed restore must fail startup, not start an empty chat.
|
|
56
|
+
2. Run one turn at a time. Incoming messages queue while a turn runs or checkpoints.
|
|
57
|
+
Tool callbacks capture their owning turn's identity and abort signal, so a delayed
|
|
58
|
+
callback cannot become an event for the next turn. `SessionRuntime` owns the token budget.
|
|
59
|
+
3. Save the conversation before checkpointing the workspace. Completed turns checkpoint
|
|
60
|
+
before emitting `done`; interrupted turns also attempt a checkpoint.
|
|
61
|
+
4. Serialize checkpoints. Periodic work runs five minutes after the last successful
|
|
62
|
+
durable checkpoint and schedules its next timer only after the current attempt
|
|
63
|
+
finishes. Failed storage writes must remain retryable.
|
|
64
|
+
5. Confirm idle only after a durable checkpoint and a second activity check. Shutdown
|
|
65
|
+
aborts the active turn, clears queued work, waits for the turn, and checkpoints.
|
|
66
|
+
Lambda suspend/terminate hooks await startup and checkpoint completion before returning.
|
|
67
|
+
|
|
68
|
+
A checkpoint recovers saved conversation, token budget, and workspace files. Queued commands
|
|
69
|
+
and an in-flight model/tool step are process-local; this is not an execution journal that
|
|
70
|
+
replays interrupted tool calls. Client event replay is a separate platform concern handled
|
|
71
|
+
outside this runtime. The refactor does not change the persisted conversation format.
|
|
72
|
+
|
|
73
|
+
Standalone sessions use the authenticated storage service to save workspace snapshots
|
|
74
|
+
under `accounts/<accountId>/sessions/<sessionId>/`; they do not create `.git`.
|
|
75
|
+
Project sessions use Git under `accounts/<accountId>/projects/<projectId>/`.
|
|
76
|
+
`publish_results` separately sends selected text files to the platform for display;
|
|
77
|
+
it does not replace workspace checkpoints.
|
|
78
|
+
|
|
79
|
+
## Adding a research tool
|
|
80
|
+
|
|
81
|
+
Register it in `filingramp-tools.ts` and implement it in the appropriate module under
|
|
82
|
+
`research/filingramp/`. Keep model-facing names, descriptions, and schemas beside the
|
|
83
|
+
implementation. Reuse the filter normalization in `filingramp-contract.ts` and scope
|
|
84
|
+
handling in `scope.ts`; filings and document indexes accept different vocabularies.
|
|
85
|
+
Return small projections and save large results or document text to workspace files.
|
|
86
|
+
Propagate request failures instead of presenting them as zero results.
|
|
87
|
+
|
|
88
|
+
Session tools receive an explicit `SessionToolContext` with workspace access, an abort signal,
|
|
89
|
+
and callbacks for progress, clarification, files, and usage. They have no direct access to the
|
|
90
|
+
session queue or gateway. Report extraction usage through `recordUsage` so the same session
|
|
91
|
+
budget covers both the main model and extraction. Add a profile in `src/agent/profiles/` and select
|
|
92
|
+
it in that directory's factory; the session runtime needs no profile-specific branches.
|
|
93
|
+
|
|
94
|
+
## Local checks
|
|
95
|
+
|
|
96
|
+
From the repository root:
|
|
97
|
+
|
|
98
|
+
```sh
|
|
99
|
+
pnpm --filter @multiplayer-app/agent test
|
|
100
|
+
pnpm --filter @multiplayer-app/agent lint
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
The test command compiles the package and runs the Node test suite, including local
|
|
104
|
+
Git recovery, snapshot recovery, checkpoint timing, queue/shutdown ordering, turn isolation,
|
|
105
|
+
budget continuation, research contracts, and tool behavior.
|
|
106
|
+
Tests use temporary workspaces and mocked service/model responses; they need no API keys.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Tool } from 'ai';
|
|
2
|
+
import type { OpenRouterApp } from '../models/attribution';
|
|
3
|
+
import type { AgentProfile, ModelProviderConfig } from '../runtime/config';
|
|
4
|
+
import type { SessionToolContext } from '../session/tool-context';
|
|
5
|
+
export interface AgentModel {
|
|
6
|
+
id: string;
|
|
7
|
+
provider: ModelProviderConfig;
|
|
8
|
+
attribution: OpenRouterApp;
|
|
9
|
+
}
|
|
10
|
+
/** Profile-specific behavior. Definitions have no queue, conversation, or checkpoint state. */
|
|
11
|
+
export interface AgentDefinition {
|
|
12
|
+
profile: AgentProfile;
|
|
13
|
+
model: AgentModel;
|
|
14
|
+
maxSteps: number;
|
|
15
|
+
workspaceDirectories: readonly string[];
|
|
16
|
+
instructions(context: {
|
|
17
|
+
restored: boolean;
|
|
18
|
+
tokenBudget?: number;
|
|
19
|
+
}): string;
|
|
20
|
+
createTools(context: SessionToolContext): Record<string, Tool>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=definition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/agent/definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAC9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAEjE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,mBAAmB,CAAA;IAC7B,WAAW,EAAE,aAAa,CAAA;CAC3B;AAED,+FAA+F;AAC/F,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,YAAY,CAAA;IACrB,KAAK,EAAE,UAAU,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAA;IACvC,YAAY,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAA;IAC1E,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;CAC/D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/agent/definition.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition.test.d.ts","sourceRoot":"","sources":["../../src/agent/definition.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,40 @@
|
|
|
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
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
7
|
+
const node_test_1 = require("node:test");
|
|
8
|
+
const profiles_1 = require("./profiles");
|
|
9
|
+
(0, node_test_1.it)('keeps profile instructions, workspace setup, models, and tools together', () => {
|
|
10
|
+
var _a;
|
|
11
|
+
const config = {
|
|
12
|
+
sessionId: 'test', mode: 'session', profile: 'coding', workspaceDir: '/unused',
|
|
13
|
+
model: 'main-model', extractionModel: 'extraction-model', provider: {}, mcpConnections: [],
|
|
14
|
+
filingRamp: { baseUrl: 'https://example.test', authToken: 'test', industryData: false },
|
|
15
|
+
researchScope: { states: ['TX'] },
|
|
16
|
+
};
|
|
17
|
+
const context = {
|
|
18
|
+
workspaceDir: '/unused', abortSignal: new AbortController().signal,
|
|
19
|
+
reportProgress() { }, requestClarification() { }, publishFiles() { }, recordUsage() { },
|
|
20
|
+
};
|
|
21
|
+
const coding = (0, profiles_1.createAgentDefinition)(config, context.workspaceDir);
|
|
22
|
+
strict_1.default.equal(coding.profile, 'coding');
|
|
23
|
+
strict_1.default.equal(coding.model.id, 'main-model');
|
|
24
|
+
strict_1.default.deepEqual(coding.workspaceDirectories, []);
|
|
25
|
+
strict_1.default.match(coding.instructions({ restored: false }), /coding agent/);
|
|
26
|
+
strict_1.default.equal(coding.createTools(context).search_filings, undefined);
|
|
27
|
+
strict_1.default.equal(coding.createTools(context).extract_from_texts, undefined);
|
|
28
|
+
const research = (0, profiles_1.createAgentDefinition)({ ...config, profile: 'research' }, context.workspaceDir);
|
|
29
|
+
strict_1.default.deepEqual(research.workspaceDirectories, ['research', 'data', 'data/text']);
|
|
30
|
+
strict_1.default.match(research.instructions({ restored: false }), /fresh session/);
|
|
31
|
+
strict_1.default.match(research.instructions({ restored: true, tokenBudget: 1000 }), /restored from a previous run/);
|
|
32
|
+
strict_1.default.match(research.instructions({ restored: true, tokenBudget: 1000 }), /1,000 tokens/);
|
|
33
|
+
strict_1.default.match(research.instructions({ restored: false }), /TX/);
|
|
34
|
+
const tools = research.createTools(context);
|
|
35
|
+
for (const name of ['search_filings', 'count_filings', 'summarize_filings', 'get_filing', 'search_documents', 'download_attachment', 'search_objections', 'read_text', 'extract_from_texts']) {
|
|
36
|
+
strict_1.default.equal(typeof ((_a = tools[name]) === null || _a === void 0 ? void 0 : _a.execute), 'function', name);
|
|
37
|
+
}
|
|
38
|
+
strict_1.default.equal(research.createTools(context).search_documents, tools.search_documents, 'scope lookup cache survives between turns');
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=definition.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition.test.js","sourceRoot":"","sources":["../../src/agent/definition.test.ts"],"names":[],"mappings":";;;;;AAAA,gEAAuC;AACvC,yCAA8B;AAE9B,yCAAkD;AAGlD,IAAA,cAAE,EAAC,yEAAyE,EAAE,GAAG,EAAE;;IACjF,MAAM,MAAM,GAAuB;QACjC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS;QAC9E,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE;QAC1F,UAAU,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE;QACvF,aAAa,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;KAClC,CAAA;IACD,MAAM,OAAO,GAAuB;QAClC,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM;QAClE,cAAc,KAAI,CAAC,EAAE,oBAAoB,KAAI,CAAC,EAAE,YAAY,KAAI,CAAC,EAAE,WAAW,KAAI,CAAC;KACpF,CAAA;IACD,MAAM,MAAM,GAAG,IAAA,gCAAqB,EAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;IAClE,gBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IACtC,gBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,YAAY,CAAC,CAAA;IAC3C,gBAAM,CAAC,SAAS,CAAC,MAAM,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAA;IACjD,gBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,cAAc,CAAC,CAAA;IACtE,gBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,SAAS,CAAC,CAAA;IACnE,gBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAA;IAEvE,MAAM,QAAQ,GAAG,IAAA,gCAAqB,EAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;IAChG,gBAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;IAClF,gBAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,eAAe,CAAC,CAAA;IACzE,gBAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,8BAA8B,CAAC,CAAA;IAC1G,gBAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,cAAc,CAAC,CAAA;IAC1F,gBAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;IAC9D,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;IAC3C,KAAK,MAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,eAAe,EAAE,mBAAmB,EAAE,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,WAAW,EAAE,oBAAoB,CAAC,EAAE,CAAC;QAC7L,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAA,MAAA,KAAK,CAAC,IAAI,CAAC,0CAAE,OAAO,CAAA,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;IAC7D,CAAC;IACD,gBAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EAAE,2CAA2C,CAAC,CAAA;AACnI,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coding.d.ts","sourceRoot":"","sources":["../../../src/agent/profiles/coding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAEpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAK9D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,GAAG,eAAe,CAS7E"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createCodingAgent = createCodingAgent;
|
|
4
|
+
const attribution_1 = require("../../models/attribution");
|
|
5
|
+
const tools_1 = require("../../session/tools");
|
|
6
|
+
const SYSTEM_PROMPT = `You are a coding agent running inside an isolated session workspace VM with a persistent disk. You have direct tools to read/write files and run shell commands in the workspace, plus (if any MCP servers are configured) search_tools/get_tool_details/call_mcp_tool to use them. Work efficiently, verify with cheap commands (build, lint), report progress with report_progress, publish deliverables with publish_results, and finish each turn with a concise summary.`;
|
|
7
|
+
function createCodingAgent(config) {
|
|
8
|
+
return {
|
|
9
|
+
profile: 'coding',
|
|
10
|
+
model: { id: config.model, provider: config.provider, attribution: attribution_1.OPENROUTER_APPS.SESSION_AGENT },
|
|
11
|
+
maxSteps: 80,
|
|
12
|
+
workspaceDirectories: [],
|
|
13
|
+
instructions: () => SYSTEM_PROMPT,
|
|
14
|
+
createTools: (context) => (0, tools_1.createSessionTools)(context, config.mcpConnections),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=coding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coding.js","sourceRoot":"","sources":["../../../src/agent/profiles/coding.ts"],"names":[],"mappings":";;AAOA,8CASC;AAfD,0DAA0D;AAE1D,+CAAwD;AAExD,MAAM,aAAa,GAAG,+cAA+c,CAAA;AAEre,SAAgB,iBAAiB,CAAC,MAA0B;IAC1D,OAAO;QACL,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,6BAAe,CAAC,aAAa,EAAE;QAClG,QAAQ,EAAE,EAAE;QACZ,oBAAoB,EAAE,EAAE;QACxB,YAAY,EAAE,GAAG,EAAE,CAAC,aAAa;QACjC,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAA,0BAAkB,EAAC,OAAO,EAAE,MAAM,CAAC,cAAc,CAAC;KAC7E,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/profiles/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAI9D,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,GAAG,eAAe,CAEvG"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createAgentDefinition = createAgentDefinition;
|
|
4
|
+
const coding_1 = require("./coding");
|
|
5
|
+
const research_1 = require("./research");
|
|
6
|
+
function createAgentDefinition(config, workspaceDir) {
|
|
7
|
+
return config.profile === 'research' ? (0, research_1.createResearchAgent)(config, workspaceDir) : (0, coding_1.createCodingAgent)(config);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/profiles/index.ts"],"names":[],"mappings":";;AAKA,sDAEC;AALD,qCAA4C;AAC5C,yCAAgD;AAEhD,SAAgB,qBAAqB,CAAC,MAA0B,EAAE,YAAoB;IACpF,OAAO,MAAM,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,IAAA,8BAAmB,EAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAA,0BAAiB,EAAC,MAAM,CAAC,CAAA;AAC9G,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AgentDefinition } from '../definition';
|
|
2
|
+
import type { AgentRuntimeConfig } from '../../runtime/config';
|
|
3
|
+
export declare function createResearchAgent(config: AgentRuntimeConfig, workspaceDir: string): AgentDefinition;
|
|
4
|
+
//# sourceMappingURL=research.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../../src/agent/profiles/research.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAEpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAO9D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,GAAG,eAAe,CA8BrG"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createResearchAgent = createResearchAgent;
|
|
4
|
+
const attribution_1 = require("../../models/attribution");
|
|
5
|
+
const extraction_tool_1 = require("../../research/extraction-tool");
|
|
6
|
+
const filingramp_client_1 = require("../../research/filingramp-client");
|
|
7
|
+
const filingramp_tools_1 = require("../../research/filingramp-tools");
|
|
8
|
+
const prompt_1 = require("../../research/prompt");
|
|
9
|
+
const tools_1 = require("../../session/tools");
|
|
10
|
+
function createResearchAgent(config, workspaceDir) {
|
|
11
|
+
// Keep authentication and resolved scope labels across turns. These tools do not own turn state.
|
|
12
|
+
const filingTools = config.filingRamp
|
|
13
|
+
? (0, filingramp_tools_1.createFilingRampTools)({ client: new filingramp_client_1.FilingRampClient(config.filingRamp), workspaceDir, scope: config.researchScope })
|
|
14
|
+
: {};
|
|
15
|
+
if (!config.filingRamp) {
|
|
16
|
+
console.warn('[session] research profile without FilingRamp credentials — filing tools disabled');
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
profile: 'research',
|
|
20
|
+
model: { id: config.model, provider: config.provider, attribution: attribution_1.OPENROUTER_APPS.DEEP_RESEARCH },
|
|
21
|
+
maxSteps: 80,
|
|
22
|
+
workspaceDirectories: prompt_1.RESEARCH_WORKSPACE_DIRS,
|
|
23
|
+
instructions: ({ restored, tokenBudget }) => {
|
|
24
|
+
var _a;
|
|
25
|
+
return (0, prompt_1.buildResearchSystemPrompt)({
|
|
26
|
+
scope: config.researchScope,
|
|
27
|
+
industryData: Boolean((_a = config.filingRamp) === null || _a === void 0 ? void 0 : _a.industryData),
|
|
28
|
+
tokenBudget,
|
|
29
|
+
restored,
|
|
30
|
+
});
|
|
31
|
+
},
|
|
32
|
+
createTools: (context) => ({
|
|
33
|
+
...(0, tools_1.createSessionTools)(context, config.mcpConnections),
|
|
34
|
+
...filingTools,
|
|
35
|
+
extract_from_texts: (0, extraction_tool_1.createExtractionTool)(context, {
|
|
36
|
+
id: config.extractionModel,
|
|
37
|
+
provider: config.provider,
|
|
38
|
+
attribution: attribution_1.OPENROUTER_APPS.DEEP_RESEARCH,
|
|
39
|
+
}),
|
|
40
|
+
}),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=research.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research.js","sourceRoot":"","sources":["../../../src/agent/profiles/research.ts"],"names":[],"mappings":";;AASA,kDA8BC;AAtCD,0DAA0D;AAE1D,oEAAqE;AACrE,wEAAmE;AACnE,sEAAuE;AACvE,kDAA0F;AAC1F,+CAAwD;AAExD,SAAgB,mBAAmB,CAAC,MAA0B,EAAE,YAAoB;IAClF,iGAAiG;IACjG,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU;QACnC,CAAC,CAAC,IAAA,wCAAqB,EAAC,EAAE,MAAM,EAAE,IAAI,oCAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC;QACvH,CAAC,CAAC,EAAE,CAAA;IACN,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,mFAAmF,CAAC,CAAA;IACnG,CAAC;IAED,OAAO;QACL,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,6BAAe,CAAC,aAAa,EAAE;QAClG,QAAQ,EAAE,EAAE;QACZ,oBAAoB,EAAE,gCAAuB;QAC7C,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE;;YAAC,OAAA,IAAA,kCAAyB,EAAC;gBACrE,KAAK,EAAE,MAAM,CAAC,aAAa;gBAC3B,YAAY,EAAE,OAAO,CAAC,MAAA,MAAM,CAAC,UAAU,0CAAE,YAAY,CAAC;gBACtD,WAAW;gBACX,QAAQ;aACT,CAAC,CAAA;SAAA;QACF,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACzB,GAAG,IAAA,0BAAkB,EAAC,OAAO,EAAE,MAAM,CAAC,cAAc,CAAC;YACrD,GAAG,WAAW;YACd,kBAAkB,EAAE,IAAA,sCAAoB,EAAC,OAAO,EAAE;gBAChD,EAAE,EAAE,MAAM,CAAC,eAAe;gBAC1B,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,WAAW,EAAE,6BAAe,CAAC,aAAa;aAC3C,CAAC;SACH,CAAC;KACH,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type ModelMessage } from 'ai';
|
|
2
|
+
import type { AgentDefinition } from './definition';
|
|
3
|
+
import type { OutboundEvent } from '../transport/link';
|
|
4
|
+
import { type TokenUsage } from '../models/usage';
|
|
5
|
+
export interface TurnInput {
|
|
6
|
+
messageId: string;
|
|
7
|
+
messages: ModelMessage[];
|
|
8
|
+
instructions: string;
|
|
9
|
+
workspaceDir: string;
|
|
10
|
+
abortSignal: AbortSignal;
|
|
11
|
+
budgetExceeded(): boolean;
|
|
12
|
+
recordUsage(usage: TokenUsage): void;
|
|
13
|
+
emit(event: OutboundEvent): void;
|
|
14
|
+
}
|
|
15
|
+
interface TurnOutput {
|
|
16
|
+
/** Messages to append to history, including a safe text-only fallback for an interrupted turn. */
|
|
17
|
+
messages: ModelMessage[];
|
|
18
|
+
partialText: string;
|
|
19
|
+
askedUser: boolean;
|
|
20
|
+
}
|
|
21
|
+
export type TurnResult = TurnOutput & ({
|
|
22
|
+
status: 'completed';
|
|
23
|
+
text: string;
|
|
24
|
+
} | {
|
|
25
|
+
status: 'aborted';
|
|
26
|
+
} | {
|
|
27
|
+
status: 'failed';
|
|
28
|
+
error: string;
|
|
29
|
+
});
|
|
30
|
+
/** Executes one turn. It neither mutates conversation history nor checkpoints or schedules work. */
|
|
31
|
+
export declare class TurnRunner {
|
|
32
|
+
private readonly definition;
|
|
33
|
+
constructor(definition: AgentDefinition);
|
|
34
|
+
run(input: TurnInput): Promise<TurnResult>;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=turn-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-runner.d.ts","sourceRoot":"","sources":["../../src/agent/turn-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,IAAI,CAAA;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAGtD,OAAO,EAAW,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE1D,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,WAAW,CAAA;IACxB,cAAc,IAAI,OAAO,CAAA;IACzB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAA;IACpC,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAA;CACjC;AAED,UAAU,UAAU;IAClB,kGAAkG;IAClG,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,CAClC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CACtC,CAAA;AAED,oGAAoG;AACpG,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,eAAe;IAElD,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;CAgFjD"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TurnRunner = void 0;
|
|
4
|
+
const ai_1 = require("ai");
|
|
5
|
+
const resolve_model_1 = require("../models/resolve-model");
|
|
6
|
+
const usage_1 = require("../models/usage");
|
|
7
|
+
/** Executes one turn. It neither mutates conversation history nor checkpoints or schedules work. */
|
|
8
|
+
class TurnRunner {
|
|
9
|
+
constructor(definition) {
|
|
10
|
+
this.definition = definition;
|
|
11
|
+
}
|
|
12
|
+
async run(input) {
|
|
13
|
+
var _a, _b;
|
|
14
|
+
const { messageId, abortSignal, emit } = input;
|
|
15
|
+
let partialText = '';
|
|
16
|
+
let askedUser = false;
|
|
17
|
+
let responseMessages;
|
|
18
|
+
const recordUsage = (usage, model) => {
|
|
19
|
+
input.recordUsage(usage);
|
|
20
|
+
emit({ type: 'usage', messageId, usage: { ...usage, model } });
|
|
21
|
+
};
|
|
22
|
+
const context = {
|
|
23
|
+
workspaceDir: input.workspaceDir,
|
|
24
|
+
abortSignal,
|
|
25
|
+
recordUsage,
|
|
26
|
+
reportProgress: (steps, toolCallId) => emit({ type: 'progress', messageId, toolCallId, steps }),
|
|
27
|
+
publishFiles: (files) => emit({ type: 'files', messageId, files }),
|
|
28
|
+
requestClarification: (question, toolCallId) => {
|
|
29
|
+
askedUser = true;
|
|
30
|
+
emit({ type: 'question', messageId, toolCallId, question });
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
try {
|
|
34
|
+
abortSignal.throwIfAborted();
|
|
35
|
+
const { model, maxSteps } = this.definition;
|
|
36
|
+
const result = (0, ai_1.streamText)({
|
|
37
|
+
model: (0, resolve_model_1.resolveLanguageModel)(model.provider, model.id, model.attribution),
|
|
38
|
+
system: input.instructions,
|
|
39
|
+
messages: input.messages,
|
|
40
|
+
tools: this.definition.createTools(context),
|
|
41
|
+
abortSignal,
|
|
42
|
+
stopWhen: [(0, ai_1.stepCountIs)(maxSteps), () => askedUser || input.budgetExceeded()],
|
|
43
|
+
});
|
|
44
|
+
for await (const part of result.fullStream) {
|
|
45
|
+
switch (part.type) {
|
|
46
|
+
case 'text-delta':
|
|
47
|
+
partialText += part.text;
|
|
48
|
+
emit({ type: 'text_delta', messageId, text: part.text });
|
|
49
|
+
break;
|
|
50
|
+
case 'reasoning-delta':
|
|
51
|
+
emit({ type: 'reasoning_delta', messageId, text: part.text });
|
|
52
|
+
break;
|
|
53
|
+
case 'tool-call':
|
|
54
|
+
emit({ type: 'tool_call_start', messageId, toolCallId: part.toolCallId, toolName: part.toolName, input: part.input });
|
|
55
|
+
break;
|
|
56
|
+
case 'tool-result':
|
|
57
|
+
emit({ type: 'tool_call_result', messageId, toolCallId: part.toolCallId, output: part.output });
|
|
58
|
+
break;
|
|
59
|
+
case 'tool-error':
|
|
60
|
+
emit({
|
|
61
|
+
type: 'tool_call_result', messageId, toolCallId: part.toolCallId,
|
|
62
|
+
error: part.error instanceof Error ? part.error.message : String(part.error),
|
|
63
|
+
});
|
|
64
|
+
break;
|
|
65
|
+
case 'finish-step': {
|
|
66
|
+
const usage = (0, usage_1.usageOf)(part);
|
|
67
|
+
if (usage)
|
|
68
|
+
recordUsage(usage, (_b = (_a = part.response) === null || _a === void 0 ? void 0 : _a.modelId) !== null && _b !== void 0 ? _b : model.id);
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
case 'error':
|
|
72
|
+
throw part.error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
abortSignal.throwIfAborted();
|
|
76
|
+
responseMessages = (await result.response).messages;
|
|
77
|
+
const text = await result.text;
|
|
78
|
+
return { status: 'completed', messages: responseMessages, text, partialText, askedUser };
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
const aborted = abortSignal.aborted;
|
|
82
|
+
// A partial stream may end between a tool call and its result. Persist text only in that case.
|
|
83
|
+
const messages = responseMessages !== null && responseMessages !== void 0 ? responseMessages : [{
|
|
84
|
+
role: 'assistant', content: partialText || (aborted ? '(stopped by the user)' : '(turn failed)'),
|
|
85
|
+
}];
|
|
86
|
+
const output = { messages, partialText, askedUser };
|
|
87
|
+
return aborted
|
|
88
|
+
? { ...output, status: 'aborted' }
|
|
89
|
+
: { ...output, status: 'failed', error: error instanceof Error ? error.message : String(error) };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.TurnRunner = TurnRunner;
|
|
94
|
+
//# sourceMappingURL=turn-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-runner.js","sourceRoot":"","sources":["../../src/agent/turn-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-runner.test.d.ts","sourceRoot":"","sources":["../../src/agent/turn-runner.test.ts"],"names":[],"mappings":""}
|