@multiplayer-app/agent 0.1.9 → 0.1.11
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/model-failure.d.ts +10 -0
- package/dist/agent/model-failure.d.ts.map +1 -0
- package/dist/agent/model-failure.js +50 -0
- package/dist/agent/model-failure.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 +53 -0
- package/dist/agent/profiles/research.js.map +1 -0
- package/dist/agent/progress-reminder.test.d.ts +2 -0
- package/dist/agent/progress-reminder.test.d.ts.map +1 -0
- package/dist/agent/progress-reminder.test.js +20 -0
- package/dist/agent/progress-reminder.test.js.map +1 -0
- package/dist/agent/turn-runner.d.ts +54 -0
- package/dist/agent/turn-runner.d.ts.map +1 -0
- package/dist/agent/turn-runner.js +147 -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/context-pruning.d.ts +13 -0
- package/dist/context-pruning.d.ts.map +1 -0
- package/dist/context-pruning.js +61 -0
- package/dist/context-pruning.js.map +1 -0
- package/dist/context-pruning.test.d.ts +2 -0
- package/dist/context-pruning.test.d.ts.map +1 -0
- package/dist/context-pruning.test.js +48 -0
- package/dist/context-pruning.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} +4 -2
- package/dist/models/resolve-model.js.map +1 -0
- package/dist/models/usage.d.ts +11 -0
- package/dist/models/usage.d.ts.map +1 -0
- package/dist/models/usage.js +19 -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/extract-texts.d.ts +41 -0
- package/dist/research/extract-texts.d.ts.map +1 -0
- package/dist/research/extract-texts.js +239 -0
- package/dist/research/extract-texts.js.map +1 -0
- package/dist/research/extract-texts.test.d.ts +2 -0
- package/dist/research/extract-texts.test.d.ts.map +1 -0
- package/dist/research/extract-texts.test.js +120 -0
- package/dist/research/extract-texts.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 +41 -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 +102 -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 +198 -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 +231 -0
- package/dist/research/filingramp/document-search-tool.js.map +1 -0
- package/dist/research/filingramp/filing-detail-tool.d.ts +8 -0
- package/dist/research/filingramp/filing-detail-tool.d.ts.map +1 -0
- package/dist/research/filingramp/filing-detail-tool.js +161 -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 +64 -0
- package/dist/research/filingramp/shared.d.ts.map +1 -0
- package/dist/research/filingramp/shared.js +130 -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-contract.d.ts.map +1 -1
- package/dist/research/filingramp-contract.js +8 -2
- package/dist/research/filingramp-contract.js.map +1 -1
- package/dist/research/filingramp-tools.d.ts +4 -8
- package/dist/research/filingramp-tools.d.ts.map +1 -1
- package/dist/research/filingramp-tools.js +19 -597
- package/dist/research/filingramp-tools.js.map +1 -1
- package/dist/research/filingramp-tools.test.js +138 -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/prompt.js +16 -7
- package/dist/research/prompt.js.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/runtime.d.ts +58 -0
- package/dist/session/runtime.d.ts.map +1 -0
- package/dist/session/runtime.js +292 -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/tool-call-repair.d.ts +11 -0
- package/dist/tool-call-repair.d.ts.map +1 -0
- package/dist/tool-call-repair.js +91 -0
- package/dist/tool-call-repair.js.map +1 -0
- package/dist/tool-call-repair.test.d.ts +2 -0
- package/dist/tool-call-repair.test.d.ts.map +1 -0
- package/dist/tool-call-repair.test.js +50 -0
- package/dist/tool-call-repair.test.js.map +1 -0
- package/dist/tools/exec-tools.d.ts +1 -0
- package/dist/tools/exec-tools.d.ts.map +1 -1
- package/dist/tools/exec-tools.js +23 -3
- package/dist/tools/exec-tools.js.map +1 -1
- package/dist/transport/link.d.ts.map +1 -0
- package/dist/transport/link.js.map +1 -0
- package/dist/{protocol.d.ts → transport/protocol.d.ts} +4 -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 +0 -46
- 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.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":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** The failure as the provider reported it, for the log: the message plus the response body it hides. */
|
|
2
|
+
export declare function describeModelFailure(error: unknown): string;
|
|
3
|
+
/**
|
|
4
|
+
* What the user reads when a model call fails for good: the cause in one sentence and what to
|
|
5
|
+
* do about it. The provider's own text goes to the log instead, since it carries API key ids,
|
|
6
|
+
* spend figures and request internals that an end user cannot act on and should not see.
|
|
7
|
+
* Undefined for failures that are not the provider's (storage, workspace), whose message stands.
|
|
8
|
+
*/
|
|
9
|
+
export declare function userFacingModelFailure(error: unknown): string | undefined;
|
|
10
|
+
//# sourceMappingURL=model-failure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-failure.d.ts","sourceRoot":"","sources":["../../src/agent/model-failure.ts"],"names":[],"mappings":"AAEA,yGAAyG;AACzG,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAM3D;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAwBzE"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.describeModelFailure = describeModelFailure;
|
|
4
|
+
exports.userFacingModelFailure = userFacingModelFailure;
|
|
5
|
+
const ai_1 = require("ai");
|
|
6
|
+
/** The failure as the provider reported it, for the log: the message plus the response body it hides. */
|
|
7
|
+
function describeModelFailure(error) {
|
|
8
|
+
const cause = unwrap(error);
|
|
9
|
+
const message = cause instanceof Error ? cause.message : String(cause);
|
|
10
|
+
const body = cause === null || cause === void 0 ? void 0 : cause.responseBody;
|
|
11
|
+
if (typeof body !== 'string' || !body.trim() || message.includes(body.trim()))
|
|
12
|
+
return message;
|
|
13
|
+
return `${message} body=${body.trim().slice(0, 600)}`;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* What the user reads when a model call fails for good: the cause in one sentence and what to
|
|
17
|
+
* do about it. The provider's own text goes to the log instead, since it carries API key ids,
|
|
18
|
+
* spend figures and request internals that an end user cannot act on and should not see.
|
|
19
|
+
* Undefined for failures that are not the provider's (storage, workspace), whose message stands.
|
|
20
|
+
*/
|
|
21
|
+
function userFacingModelFailure(error) {
|
|
22
|
+
const cause = unwrap(error);
|
|
23
|
+
const statusCode = cause === null || cause === void 0 ? void 0 : cause.statusCode;
|
|
24
|
+
const status = typeof statusCode === 'number' ? statusCode : undefined;
|
|
25
|
+
const text = describeModelFailure(cause).toLowerCase();
|
|
26
|
+
if (status === 402 || /key limit|spending limit|insufficient credits|insufficient_quota|quota|billing/.test(text)) {
|
|
27
|
+
return 'The AI provider has reached the spending limit for this workspace. Ask an administrator to raise it, then send the request again.';
|
|
28
|
+
}
|
|
29
|
+
if (status === 401 || status === 403 || /invalid api key|unauthorized|forbidden|authentication/.test(text)) {
|
|
30
|
+
return "The AI provider rejected this workspace's API key. Ask an administrator to check the provider settings.";
|
|
31
|
+
}
|
|
32
|
+
if (/context length|context window|too many tokens|maximum context|prompt is too long|input is too long/.test(text)) {
|
|
33
|
+
return 'The conversation is too long for the selected model. Start a new session or choose a model with a larger context window.';
|
|
34
|
+
}
|
|
35
|
+
if (status === 404 || /model .*not found|no endpoints found|not a valid model/.test(text)) {
|
|
36
|
+
return 'The selected model is not available from the AI provider. Choose another model and try again.';
|
|
37
|
+
}
|
|
38
|
+
if (status === 429 || /rate.?limit|too many requests|overloaded/.test(text)) {
|
|
39
|
+
return 'The AI provider is busy right now. Try again in a moment.';
|
|
40
|
+
}
|
|
41
|
+
if ((status !== undefined && status >= 500) || /econnreset|etimedout|fetch failed|socket hang up|timed out/.test(text)) {
|
|
42
|
+
return 'The AI provider did not respond. Try again in a moment.';
|
|
43
|
+
}
|
|
44
|
+
return ai_1.APICallError.isInstance(cause) || status !== undefined ? 'The AI provider returned an error. Try again in a moment.' : undefined;
|
|
45
|
+
}
|
|
46
|
+
/** The ai SDK wraps the last provider error in a RetryError once its own retries run out. */
|
|
47
|
+
function unwrap(error) {
|
|
48
|
+
return ai_1.RetryError.isInstance(error) ? error.lastError : error;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=model-failure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-failure.js","sourceRoot":"","sources":["../../src/agent/model-failure.ts"],"names":[],"mappings":";;AAGA,oDAMC;AAQD,wDAwBC;AAzCD,2BAA6C;AAE7C,yGAAyG;AACzG,SAAgB,oBAAoB,CAAC,KAAc;IACjD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC3B,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACtE,MAAM,IAAI,GAAI,KAA2C,aAA3C,KAAK,uBAAL,KAAK,CAAwC,YAAY,CAAA;IACvE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAAE,OAAO,OAAO,CAAA;IAC7F,OAAO,GAAG,OAAO,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAA;AACvD,CAAC;AAED;;;;;GAKG;AACH,SAAgB,sBAAsB,CAAC,KAAc;IACnD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC3B,MAAM,UAAU,GAAI,KAAyC,aAAzC,KAAK,uBAAL,KAAK,CAAsC,UAAU,CAAA;IACzE,MAAM,MAAM,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAA;IACtE,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;IACtD,IAAI,MAAM,KAAK,GAAG,IAAI,gFAAgF,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClH,OAAO,mIAAmI,CAAA;IAC5I,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,uDAAuD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3G,OAAO,yGAAyG,CAAA;IAClH,CAAC;IACD,IAAI,oGAAoG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpH,OAAO,0HAA0H,CAAA;IACnI,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,IAAI,wDAAwD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1F,OAAO,+FAA+F,CAAA;IACxG,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,IAAI,0CAA0C,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5E,OAAO,2DAA2D,CAAA;IACpE,CAAC;IACD,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,IAAI,GAAG,CAAC,IAAI,4DAA4D,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACvH,OAAO,yDAAyD,CAAA;IAClE,CAAC;IACD,OAAO,iBAAY,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,2DAA2D,CAAC,CAAC,CAAC,SAAS,CAAA;AACzI,CAAC;AAED,6FAA6F;AAC7F,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,eAAU,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAA;AAC/D,CAAC"}
|
|
@@ -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;AAQ9D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,GAAG,eAAe,CAyCrG"}
|
|
@@ -0,0 +1,53 @@
|
|
|
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
|
+
// bulk progress goes to whichever turn is running, through the slot createTools fills each turn.
|
|
13
|
+
let reportProgress;
|
|
14
|
+
const filingTools = config.filingRamp
|
|
15
|
+
? (0, filingramp_tools_1.createFilingRampTools)({
|
|
16
|
+
client: new filingramp_client_1.FilingRampClient(config.filingRamp),
|
|
17
|
+
workspaceDir,
|
|
18
|
+
scope: config.researchScope,
|
|
19
|
+
onProgress: (toolCallId, done, total, label) => reportProgress === null || reportProgress === void 0 ? void 0 : reportProgress([{ key: 'bulk', label, status: done < total ? 'active' : 'done', detail: `${done}/${total}` }], toolCallId),
|
|
20
|
+
})
|
|
21
|
+
: {};
|
|
22
|
+
if (!config.filingRamp) {
|
|
23
|
+
console.warn('[session] research profile without FilingRamp credentials — filing tools disabled');
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
profile: 'research',
|
|
27
|
+
model: { id: config.model, provider: config.provider, attribution: attribution_1.OPENROUTER_APPS.DEEP_RESEARCH },
|
|
28
|
+
maxSteps: 80,
|
|
29
|
+
workspaceDirectories: prompt_1.RESEARCH_WORKSPACE_DIRS,
|
|
30
|
+
instructions: ({ restored, tokenBudget }) => {
|
|
31
|
+
var _a;
|
|
32
|
+
return (0, prompt_1.buildResearchSystemPrompt)({
|
|
33
|
+
scope: config.researchScope,
|
|
34
|
+
industryData: Boolean((_a = config.filingRamp) === null || _a === void 0 ? void 0 : _a.industryData),
|
|
35
|
+
tokenBudget,
|
|
36
|
+
restored,
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
createTools: (context) => {
|
|
40
|
+
reportProgress = (steps, toolCallId) => context.reportProgress(steps, toolCallId);
|
|
41
|
+
return {
|
|
42
|
+
...(0, tools_1.createSessionTools)(context, config.mcpConnections),
|
|
43
|
+
...filingTools,
|
|
44
|
+
extract_from_texts: (0, extraction_tool_1.createExtractionTool)(context, {
|
|
45
|
+
id: config.extractionModel,
|
|
46
|
+
provider: config.provider,
|
|
47
|
+
attribution: attribution_1.OPENROUTER_APPS.DEEP_RESEARCH,
|
|
48
|
+
}),
|
|
49
|
+
};
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=research.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research.js","sourceRoot":"","sources":["../../../src/agent/profiles/research.ts"],"names":[],"mappings":";;AAUA,kDAyCC;AAlDD,0DAA0D;AAE1D,oEAAqE;AACrE,wEAAmE;AACnE,sEAAuE;AACvE,kDAA0F;AAC1F,+CAAwD;AAGxD,SAAgB,mBAAmB,CAAC,MAA0B,EAAE,YAAoB;IAClF,iGAAiG;IACjG,iGAAiG;IACjG,IAAI,cAAgE,CAAA;IACpE,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU;QACnC,CAAC,CAAC,IAAA,wCAAqB,EAAC;YACpB,MAAM,EAAE,IAAI,oCAAgB,CAAC,MAAM,CAAC,UAAU,CAAC;YAC/C,YAAY;YACZ,KAAK,EAAE,MAAM,CAAC,aAAa;YAC3B,UAAU,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAC7C,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAG,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC,EAAE,UAAU,CAAC;SAC/H,CAAC;QACJ,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;YACvB,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;YACjF,OAAO;gBACL,GAAG,IAAA,0BAAkB,EAAC,OAAO,EAAE,MAAM,CAAC,cAAc,CAAC;gBACrD,GAAG,WAAW;gBACd,kBAAkB,EAAE,IAAA,sCAAoB,EAAC,OAAO,EAAE;oBAChD,EAAE,EAAE,MAAM,CAAC,eAAe;oBAC1B,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,WAAW,EAAE,6BAAe,CAAC,aAAa;iBAC3C,CAAC;aACH,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-reminder.test.d.ts","sourceRoot":"","sources":["../../src/agent/progress-reminder.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
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 turn_runner_1 = require("./turn-runner");
|
|
9
|
+
const step = (...names) => ({ toolCalls: names.map((toolName) => ({ toolName })) });
|
|
10
|
+
(0, node_test_1.describe)('stepsSinceProgress', () => {
|
|
11
|
+
(0, node_test_1.it)('counts steps after the last report_progress call', () => {
|
|
12
|
+
strict_1.default.equal((0, turn_runner_1.stepsSinceProgress)([step('report_progress'), step('get_filing'), step('run_command')]), 2);
|
|
13
|
+
strict_1.default.equal((0, turn_runner_1.stepsSinceProgress)([step('get_filing'), step('report_progress', 'run_command')]), 0);
|
|
14
|
+
});
|
|
15
|
+
(0, node_test_1.it)('counts every step when the agent never reported', () => {
|
|
16
|
+
strict_1.default.equal((0, turn_runner_1.stepsSinceProgress)([step('get_filing'), step('run_command')]), 2);
|
|
17
|
+
strict_1.default.equal((0, turn_runner_1.stepsSinceProgress)([]), 0);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=progress-reminder.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-reminder.test.js","sourceRoot":"","sources":["../../src/agent/progress-reminder.test.ts"],"names":[],"mappings":";;;;;AAAA,gEAAuC;AACvC,yCAAwC;AACxC,+CAAkD;AAElD,MAAM,IAAI,GAAG,CAAC,GAAG,KAAe,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;AAE7F,IAAA,oBAAQ,EAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAA,cAAE,EAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,gBAAM,CAAC,KAAK,CAAC,IAAA,gCAAkB,EAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACvG,gBAAM,CAAC,KAAK,CAAC,IAAA,gCAAkB,EAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACnG,CAAC,CAAC,CAAA;IAEF,IAAA,cAAE,EAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,gBAAM,CAAC,KAAK,CAAC,IAAA,gCAAkB,EAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAC9E,gBAAM,CAAC,KAAK,CAAC,IAAA,gCAAkB,EAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,54 @@
|
|
|
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
|
+
/** Steps since the agent last called report_progress in this turn (all of them when it never did). */
|
|
6
|
+
export declare function stepsSinceProgress(steps: Array<{
|
|
7
|
+
toolCalls: Array<{
|
|
8
|
+
toolName: string;
|
|
9
|
+
}>;
|
|
10
|
+
}>): number;
|
|
11
|
+
export interface TurnInput {
|
|
12
|
+
messageId: string;
|
|
13
|
+
messages: ModelMessage[];
|
|
14
|
+
instructions: string;
|
|
15
|
+
workspaceDir: string;
|
|
16
|
+
abortSignal: AbortSignal;
|
|
17
|
+
budgetExceeded(): boolean;
|
|
18
|
+
/** Past the share of the budget where a research turn stops and saves what it has. */
|
|
19
|
+
nearBudget?(): boolean;
|
|
20
|
+
/** The user chose "wrap up" at the budget pause: this turn only saves what there is. */
|
|
21
|
+
wrapUpOnly?: boolean;
|
|
22
|
+
recordUsage(usage: TokenUsage): void;
|
|
23
|
+
emit(event: OutboundEvent): void;
|
|
24
|
+
}
|
|
25
|
+
interface TurnOutput {
|
|
26
|
+
/** Messages to append to history, including a safe text-only fallback for an interrupted turn. */
|
|
27
|
+
messages: ModelMessage[];
|
|
28
|
+
partialText: string;
|
|
29
|
+
askedUser: boolean;
|
|
30
|
+
/** The turn ran the budget wrap-up. */
|
|
31
|
+
wrappedUp?: boolean;
|
|
32
|
+
/** The wrap-up wrote or published files, so the pause notice may say the work is saved. */
|
|
33
|
+
saved?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export type TurnResult = TurnOutput & ({
|
|
36
|
+
status: 'completed';
|
|
37
|
+
text: string;
|
|
38
|
+
} | {
|
|
39
|
+
status: 'aborted';
|
|
40
|
+
}
|
|
41
|
+
/** `error` is the failure as the provider reported it (for the log); `userMessage` is what the user reads. */
|
|
42
|
+
| {
|
|
43
|
+
status: 'failed';
|
|
44
|
+
error: string;
|
|
45
|
+
userMessage: string;
|
|
46
|
+
});
|
|
47
|
+
/** Executes one turn. It neither mutates conversation history nor checkpoints or schedules work. */
|
|
48
|
+
export declare class TurnRunner {
|
|
49
|
+
private readonly definition;
|
|
50
|
+
constructor(definition: AgentDefinition);
|
|
51
|
+
run(input: TurnInput): Promise<TurnResult>;
|
|
52
|
+
}
|
|
53
|
+
export {};
|
|
54
|
+
//# 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,EAAiC,MAAM,IAAI,CAAA;AAC9F,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;AAkB1D,sGAAsG;AACtG,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,SAAS,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,GAAG,MAAM,CAKnG;AAED,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,sFAAsF;IACtF,UAAU,CAAC,IAAI,OAAO,CAAA;IACtB,wFAAwF;IACxF,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,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;IAClB,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,2FAA2F;IAC3F,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;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;AACvB,8GAA8G;GAC5G;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAC3D,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;CA6GjD"}
|