@uncaged/workflow-agent-builtin 0.5.0-alpha.5
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 +141 -0
- package/dist/agent.d.ts +3 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +89 -0
- package/dist/agent.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -0
- package/dist/detail.d.ts +13 -0
- package/dist/detail.d.ts.map +1 -0
- package/dist/detail.js +32 -0
- package/dist/detail.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/index.d.ts +3 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +2 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/llm.d.ts +5 -0
- package/dist/llm/llm.d.ts.map +1 -0
- package/dist/llm/llm.js +119 -0
- package/dist/llm/llm.js.map +1 -0
- package/dist/llm/types.d.ts +33 -0
- package/dist/llm/types.d.ts.map +1 -0
- package/dist/llm/types.js +2 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/loop.d.ts +38 -0
- package/dist/loop.d.ts.map +1 -0
- package/dist/loop.js +156 -0
- package/dist/loop.js.map +1 -0
- package/dist/prompt.d.ts +11 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +93 -0
- package/dist/prompt.js.map +1 -0
- package/dist/schemas.d.ts +4 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +42 -0
- package/dist/schemas.js.map +1 -0
- package/dist/session.d.ts +10 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +45 -0
- package/dist/session.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +33 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/path.d.ts +3 -0
- package/dist/tools/path.d.ts.map +1 -0
- package/dist/tools/path.js +6 -0
- package/dist/tools/path.js.map +1 -0
- package/dist/tools/read-file.d.ts +3 -0
- package/dist/tools/read-file.d.ts.map +1 -0
- package/dist/tools/read-file.js +39 -0
- package/dist/tools/read-file.js.map +1 -0
- package/dist/tools/run-command.d.ts +3 -0
- package/dist/tools/run-command.d.ts.map +1 -0
- package/dist/tools/run-command.js +81 -0
- package/dist/tools/run-command.js.map +1 -0
- package/dist/tools/types.d.ts +12 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/write-file.d.ts +3 -0
- package/dist/tools/write-file.d.ts.map +1 -0
- package/dist/tools/write-file.js +35 -0
- package/dist/tools/write-file.js.map +1 -0
- package/dist/types.d.ts +42 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +45 -0
- package/src/agent.ts +158 -0
- package/src/cli.ts +6 -0
- package/src/detail.ts +49 -0
- package/src/index.ts +16 -0
- package/src/llm/index.ts +7 -0
- package/src/llm/llm.ts +139 -0
- package/src/llm/types.ts +29 -0
- package/src/loop.ts +303 -0
- package/src/prompt.ts +115 -0
- package/src/schemas.ts +45 -0
- package/src/session.ts +59 -0
- package/src/tools/index.ts +44 -0
- package/src/tools/path.ts +6 -0
- package/src/tools/read-file.ts +41 -0
- package/src/tools/run-command.ts +95 -0
- package/src/tools/types.ts +13 -0
- package/src/tools/write-file.ts +36 -0
- package/src/types.ts +49 -0
package/README.md
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# @uncaged/workflow-agent-builtin
|
|
2
|
+
|
|
3
|
+
`uwf-builtin` agent — built-in LLM agent with file read/write and shell tools.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Layer 3 agent implementation. Runs an OpenAI-compatible chat completion loop with built-in tools (`read_file`, `write_file`, `run_command`). Uses the configured provider/model from `config.yaml`. Produces frontmatter markdown output and stores turn-by-turn session detail in CAS.
|
|
8
|
+
|
|
9
|
+
Useful when you want a self-contained agent without an external CLI like Hermes or Claude Code.
|
|
10
|
+
|
|
11
|
+
**Dependencies:** `@uncaged/json-cas`, `@uncaged/workflow-util-agent`, `@uncaged/workflow-util`
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
Included as the `uwf-builtin` binary when you install `@uncaged/workflow-agent-builtin`:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
bun add -g @uncaged/workflow-agent-builtin
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## CLI Usage
|
|
22
|
+
|
|
23
|
+
Invoked by `uwf thread step`:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
uwf-builtin <thread-id> <role>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Configure as default agent:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
uwf setup --agent builtin
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Override per step:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
uwf thread step <thread-id> --agent uwf-builtin
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Environment variables set by the engine:
|
|
42
|
+
|
|
43
|
+
| Variable | Purpose |
|
|
44
|
+
|----------|---------|
|
|
45
|
+
| `UWF_EDGE_PROMPT` | Moderator edge instruction for this step |
|
|
46
|
+
|
|
47
|
+
## API
|
|
48
|
+
|
|
49
|
+
All exports come from `src/index.ts`.
|
|
50
|
+
|
|
51
|
+
### Agent factory
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
function createBuiltinAgent(): () => Promise<void>
|
|
55
|
+
function buildBuiltinMessages(ctx: AgentContext): ChatMessage[]
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### LLM loop
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
const BUILTIN_MAX_TURNS = 30;
|
|
62
|
+
const BUILTIN_CONTINUE_MAX_TURNS = 5;
|
|
63
|
+
|
|
64
|
+
function runBuiltinLoop(/* options: RunBuiltinLoopOptions */): Promise<RunBuiltinLoopResult>
|
|
65
|
+
function chatCompletionWithTools(
|
|
66
|
+
provider: ResolvedLlmProvider,
|
|
67
|
+
messages: ChatMessage[],
|
|
68
|
+
tools: OpenAiToolDefinition[],
|
|
69
|
+
): Promise<LlmAssistantResponse>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
`RunBuiltinLoopOptions` and `RunBuiltinLoopResult` are internal to `loop.ts` and not re-exported from `index.ts`.
|
|
73
|
+
|
|
74
|
+
### Tools
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
function getBuiltinTools(): readonly BuiltinTool[]
|
|
78
|
+
function executeBuiltinTool(
|
|
79
|
+
name: string,
|
|
80
|
+
args: Record<string, unknown>,
|
|
81
|
+
ctx: ToolContext,
|
|
82
|
+
): Promise<string>
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Session and detail
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
function initSessionDir(storageRoot: string): Promise<void>
|
|
89
|
+
function appendSessionTurn(storageRoot: string, sessionId: string, turn: BuiltinTurnPayload): Promise<void>
|
|
90
|
+
function readSessionTurns(storageRoot: string, sessionId: string): Promise<BuiltinTurnPayload[]>
|
|
91
|
+
function removeSession(storageRoot: string, sessionId: string): Promise<void>
|
|
92
|
+
function registerBuiltinSchemas(store: Store): Promise<BuiltinSchemaHashes>
|
|
93
|
+
function storeBuiltinDetail(store: Store, payload: BuiltinDetailPayload): Promise<string>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Types
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
type ChatMessage = /* system | user | assistant | tool */;
|
|
100
|
+
type LlmAssistantResponse = { content: string | null; toolCalls: LlmToolCall[] | null };
|
|
101
|
+
type LlmToolCall = { id: string; name: string; arguments: string };
|
|
102
|
+
type BuiltinTool = { name: string; description: string; parameters: Record<string, unknown> };
|
|
103
|
+
type ToolContext = { cwd: string; storageRoot: string };
|
|
104
|
+
type BuiltinDetailPayload = { /* session turns, model, timestamps */ };
|
|
105
|
+
type BuiltinLoopTurn = { /* single loop iteration record */ };
|
|
106
|
+
type BuiltinToolCallRecord = { /* tool call audit */ };
|
|
107
|
+
type BuiltinToolResultRecord = { /* tool result audit */ };
|
|
108
|
+
type BuiltinTurnPayload = { /* persisted turn */ };
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Internal Structure
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
src/
|
|
115
|
+
├── index.ts
|
|
116
|
+
├── cli.ts Binary entrypoint
|
|
117
|
+
├── agent.ts createBuiltinAgent
|
|
118
|
+
├── loop.ts Multi-turn LLM + tool loop
|
|
119
|
+
├── prompt.ts buildBuiltinMessages
|
|
120
|
+
├── session.ts Session directory persistence
|
|
121
|
+
├── detail.ts CAS detail node storage
|
|
122
|
+
├── schemas.ts Builtin CAS schemas
|
|
123
|
+
├── types.ts Detail and turn payload types
|
|
124
|
+
├── llm/
|
|
125
|
+
│ ├── index.ts
|
|
126
|
+
│ ├── llm.ts chatCompletionWithTools
|
|
127
|
+
│ └── types.ts ChatMessage, LlmToolCall, etc.
|
|
128
|
+
└── tools/
|
|
129
|
+
├── index.ts getBuiltinTools, executeBuiltinTool
|
|
130
|
+
├── read-file.ts
|
|
131
|
+
├── write-file.ts
|
|
132
|
+
├── run-command.ts
|
|
133
|
+
├── path.ts
|
|
134
|
+
└── types.ts
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Configuration
|
|
138
|
+
|
|
139
|
+
Requires a configured OpenAI-compatible provider and model in `~/.uncaged/workflow/config.yaml` (via `uwf setup`). API keys are loaded from `~/.uncaged/workflow/.env`.
|
|
140
|
+
|
|
141
|
+
Tools run with the current working directory as `ToolContext.cwd` (typically the directory where `uwf thread step` was invoked).
|
package/dist/agent.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAsJA,kEAAkE;AAClE,wBAAgB,kBAAkB,IAAI,MAAM,OAAO,CAAC,IAAI,CAAC,CAMxD"}
|
package/dist/agent.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { createLogger, generateUlid } from "@uncaged/workflow-util";
|
|
2
|
+
import { createAgent, loadWorkflowConfig, resolveModel, resolveStorageRoot, } from "@uncaged/workflow-util-agent";
|
|
3
|
+
import { storeBuiltinDetail } from "./detail.js";
|
|
4
|
+
import { BUILTIN_CONTINUE_MAX_TURNS, BUILTIN_MAX_TURNS, runBuiltinLoop } from "./loop.js";
|
|
5
|
+
import { buildBuiltinMessages } from "./prompt.js";
|
|
6
|
+
import { initSessionDir } from "./session.js";
|
|
7
|
+
const log = createLogger({ sink: { kind: "stderr" } });
|
|
8
|
+
const FRONTMATTER_FENCE = "---";
|
|
9
|
+
/**
|
|
10
|
+
* Strip any text before the first `---` fence.
|
|
11
|
+
* LLMs sometimes emit preamble text before the frontmatter block.
|
|
12
|
+
*/
|
|
13
|
+
function stripPreamble(text) {
|
|
14
|
+
if (text.startsWith(FRONTMATTER_FENCE)) {
|
|
15
|
+
return text;
|
|
16
|
+
}
|
|
17
|
+
const idx = text.indexOf(`\n${FRONTMATTER_FENCE}\n`);
|
|
18
|
+
if (idx !== -1) {
|
|
19
|
+
log("6GWRP3QX", `stripped ${idx + 1} chars of preamble before frontmatter`);
|
|
20
|
+
return text.slice(idx + 1);
|
|
21
|
+
}
|
|
22
|
+
return text;
|
|
23
|
+
}
|
|
24
|
+
const sessions = new Map();
|
|
25
|
+
function getSession(sessionId) {
|
|
26
|
+
const session = sessions.get(sessionId);
|
|
27
|
+
if (session === undefined) {
|
|
28
|
+
throw new Error(`builtin session not found: ${sessionId}`);
|
|
29
|
+
}
|
|
30
|
+
return session;
|
|
31
|
+
}
|
|
32
|
+
function buildToolContext(storageRoot) {
|
|
33
|
+
return {
|
|
34
|
+
cwd: process.cwd(),
|
|
35
|
+
storageRoot,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async function runBuiltinWithMessages(storageRoot, provider, messages, session, store, maxTurns, noTools) {
|
|
39
|
+
const loopResult = await runBuiltinLoop({
|
|
40
|
+
provider,
|
|
41
|
+
messages,
|
|
42
|
+
toolCtx: buildToolContext(storageRoot),
|
|
43
|
+
maxTurns,
|
|
44
|
+
storageRoot,
|
|
45
|
+
sessionId: session.sessionId,
|
|
46
|
+
noTools,
|
|
47
|
+
});
|
|
48
|
+
session.messages = loopResult.messages;
|
|
49
|
+
if (loopResult.turnCount === 0) {
|
|
50
|
+
log("5RWTK9NB", "no turns produced, returning empty output");
|
|
51
|
+
return { output: "", detailHash: "", sessionId: session.sessionId };
|
|
52
|
+
}
|
|
53
|
+
// Read jsonl → persist turns to CAS → store detail
|
|
54
|
+
const { detailHash } = await storeBuiltinDetail(store, storageRoot, session.sessionId, session.model, session.startedAtMs);
|
|
55
|
+
return { output: stripPreamble(loopResult.finalText), detailHash, sessionId: session.sessionId };
|
|
56
|
+
}
|
|
57
|
+
async function runBuiltin(ctx) {
|
|
58
|
+
const storageRoot = resolveStorageRoot();
|
|
59
|
+
const config = await loadWorkflowConfig(storageRoot);
|
|
60
|
+
const provider = resolveModel(config, config.defaultModel);
|
|
61
|
+
const sessionId = generateUlid(Date.now());
|
|
62
|
+
await initSessionDir(storageRoot);
|
|
63
|
+
const messages = buildBuiltinMessages(ctx);
|
|
64
|
+
const session = {
|
|
65
|
+
sessionId,
|
|
66
|
+
model: provider.model,
|
|
67
|
+
startedAtMs: Date.now(),
|
|
68
|
+
messages,
|
|
69
|
+
};
|
|
70
|
+
sessions.set(sessionId, session);
|
|
71
|
+
return runBuiltinWithMessages(storageRoot, provider, messages, session, ctx.store, BUILTIN_MAX_TURNS, false);
|
|
72
|
+
}
|
|
73
|
+
async function continueBuiltin(sessionId, message, store) {
|
|
74
|
+
const session = getSession(sessionId);
|
|
75
|
+
const storageRoot = resolveStorageRoot();
|
|
76
|
+
const config = await loadWorkflowConfig(storageRoot);
|
|
77
|
+
const provider = resolveModel(config, config.defaultModel);
|
|
78
|
+
const messages = [...session.messages, { role: "user", content: message }];
|
|
79
|
+
return runBuiltinWithMessages(storageRoot, provider, messages, session, store, BUILTIN_CONTINUE_MAX_TURNS, true);
|
|
80
|
+
}
|
|
81
|
+
/** Agent CLI factory: built-in LLM loop with file/shell tools. */
|
|
82
|
+
export function createBuiltinAgent() {
|
|
83
|
+
return createAgent({
|
|
84
|
+
name: "builtin",
|
|
85
|
+
run: runBuiltin,
|
|
86
|
+
continue: continueBuiltin,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;AAClC,KAAK,IAAI,EAAE,CAAC"}
|
package/dist/detail.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Store } from "@uncaged/json-cas";
|
|
2
|
+
type BuiltinSchemaHashes = {
|
|
3
|
+
turn: string;
|
|
4
|
+
detail: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function registerBuiltinSchemas(store: Store): Promise<BuiltinSchemaHashes>;
|
|
7
|
+
/** Read session jsonl, persist each turn to CAS, return detail hash. */
|
|
8
|
+
export declare function storeBuiltinDetail(store: Store, storageRoot: string, sessionId: string, model: string, startedAtMs: number, nowMs?: number): Promise<{
|
|
9
|
+
detailHash: string;
|
|
10
|
+
turnCount: number;
|
|
11
|
+
}>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=detail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detail.d.ts","sourceRoot":"","sources":["../src/detail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAMrE,KAAK,mBAAmB,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAOvF;AAED,wEAAwE;AACxE,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,KAAK,GAAE,MAAmB,GACzB,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAoBpD"}
|
package/dist/detail.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { bootstrap, putSchema } from "@uncaged/json-cas";
|
|
2
|
+
import { BUILTIN_DETAIL_SCHEMA, BUILTIN_TURN_SCHEMA } from "./schemas.js";
|
|
3
|
+
import { readSessionTurns } from "./session.js";
|
|
4
|
+
export async function registerBuiltinSchemas(store) {
|
|
5
|
+
await bootstrap(store);
|
|
6
|
+
const [turn, detail] = await Promise.all([
|
|
7
|
+
putSchema(store, BUILTIN_TURN_SCHEMA),
|
|
8
|
+
putSchema(store, BUILTIN_DETAIL_SCHEMA),
|
|
9
|
+
]);
|
|
10
|
+
return { turn, detail };
|
|
11
|
+
}
|
|
12
|
+
/** Read session jsonl, persist each turn to CAS, return detail hash. */
|
|
13
|
+
export async function storeBuiltinDetail(store, storageRoot, sessionId, model, startedAtMs, nowMs = Date.now()) {
|
|
14
|
+
const schemas = await registerBuiltinSchemas(store);
|
|
15
|
+
const turns = await readSessionTurns(storageRoot, sessionId);
|
|
16
|
+
const turnHashes = [];
|
|
17
|
+
for (const turn of turns) {
|
|
18
|
+
const hash = await store.put(schemas.turn, turn);
|
|
19
|
+
turnHashes.push(hash);
|
|
20
|
+
}
|
|
21
|
+
const duration = Math.max(0, nowMs - startedAtMs);
|
|
22
|
+
const detail = {
|
|
23
|
+
sessionId,
|
|
24
|
+
model,
|
|
25
|
+
duration,
|
|
26
|
+
turnCount: turnHashes.length,
|
|
27
|
+
turns: turnHashes,
|
|
28
|
+
};
|
|
29
|
+
const detailHash = await store.put(schemas.detail, detail);
|
|
30
|
+
return { detailHash, turnCount: turnHashes.length };
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=detail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detail.js","sourceRoot":"","sources":["../src/detail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAc,MAAM,mBAAmB,CAAC;AAErE,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAQhD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAAY;IACvD,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;IACvB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACvC,SAAS,CAAC,KAAK,EAAE,mBAAmB,CAAC;QACrC,SAAS,CAAC,KAAK,EAAE,qBAAqB,CAAC;KACxC,CAAC,CAAC;IACH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAY,EACZ,WAAmB,EACnB,SAAiB,EACjB,KAAa,EACb,WAAmB,EACnB,QAAgB,IAAI,CAAC,GAAG,EAAE;IAE1B,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAE7D,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,WAAW,CAAC,CAAC;IAClD,MAAM,MAAM,GAAyB;QACnC,SAAS;QACT,KAAK;QACL,QAAQ;QACR,SAAS,EAAE,UAAU,CAAC,MAAM;QAC5B,KAAK,EAAE,UAAU;KAClB,CAAC;IACF,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;AACtD,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { createBuiltinAgent } from "./agent.js";
|
|
2
|
+
export { registerBuiltinSchemas, storeBuiltinDetail } from "./detail.js";
|
|
3
|
+
export type { ChatMessage, LlmAssistantResponse, LlmToolCall } from "./llm/index.js";
|
|
4
|
+
export { chatCompletionWithTools } from "./llm/index.js";
|
|
5
|
+
export { BUILTIN_CONTINUE_MAX_TURNS, BUILTIN_MAX_TURNS, runBuiltinLoop } from "./loop.js";
|
|
6
|
+
export { buildBuiltinMessages } from "./prompt.js";
|
|
7
|
+
export { appendSessionTurn, initSessionDir, readSessionTurns, removeSession } from "./session.js";
|
|
8
|
+
export type { BuiltinTool, ToolContext } from "./tools/index.js";
|
|
9
|
+
export { executeBuiltinTool, getBuiltinTools } from "./tools/index.js";
|
|
10
|
+
export type { BuiltinDetailPayload, BuiltinLoopTurn, BuiltinToolCallRecord, BuiltinToolResultRecord, BuiltinTurnPayload, } from "./types.js";
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACzE,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC1F,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClG,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACvE,YAAY,EACV,oBAAoB,EACpB,eAAe,EACf,qBAAqB,EACrB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { createBuiltinAgent } from "./agent.js";
|
|
2
|
+
export { registerBuiltinSchemas, storeBuiltinDetail } from "./detail.js";
|
|
3
|
+
export { chatCompletionWithTools } from "./llm/index.js";
|
|
4
|
+
export { BUILTIN_CONTINUE_MAX_TURNS, BUILTIN_MAX_TURNS, runBuiltinLoop } from "./loop.js";
|
|
5
|
+
export { buildBuiltinMessages } from "./prompt.js";
|
|
6
|
+
export { appendSessionTurn, initSessionDir, readSessionTurns, removeSession } from "./session.js";
|
|
7
|
+
export { executeBuiltinTool, getBuiltinTools } from "./tools/index.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC1F,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElG,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AACnD,YAAY,EACV,WAAW,EACX,oBAAoB,EACpB,WAAW,EACX,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ResolvedLlmProvider } from "@uncaged/workflow-util-agent";
|
|
2
|
+
import type { ChatMessage, LlmAssistantResponse, OpenAiToolDefinition } from "./types.js";
|
|
3
|
+
/** OpenAI-compatible chat completion with tool calling (non-streaming). */
|
|
4
|
+
export declare function chatCompletionWithTools(provider: ResolvedLlmProvider, messages: ChatMessage[], tools: OpenAiToolDefinition[] | null): Promise<LlmAssistantResponse>;
|
|
5
|
+
//# sourceMappingURL=llm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/llm/llm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAExE,OAAO,KAAK,EACV,WAAW,EACX,oBAAoB,EAEpB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAuFpB,2EAA2E;AAC3E,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,mBAAmB,EAC7B,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,EAAE,oBAAoB,EAAE,GAAG,IAAI,GACnC,OAAO,CAAC,oBAAoB,CAAC,CAuC/B"}
|
package/dist/llm/llm.js
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
function isRecord(value) {
|
|
2
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
3
|
+
}
|
|
4
|
+
function chatUrl(baseUrl) {
|
|
5
|
+
const trimmed = baseUrl.replace(/\/+$/, "");
|
|
6
|
+
return `${trimmed}/chat/completions`;
|
|
7
|
+
}
|
|
8
|
+
function parseToolCalls(raw) {
|
|
9
|
+
if (!Array.isArray(raw) || raw.length === 0) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
const calls = [];
|
|
13
|
+
for (const entry of raw) {
|
|
14
|
+
if (!isRecord(entry)) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
const id = entry.id;
|
|
18
|
+
const fn = entry.function;
|
|
19
|
+
if (typeof id !== "string" || !isRecord(fn)) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const name = fn.name;
|
|
23
|
+
const args = fn.arguments;
|
|
24
|
+
if (typeof name !== "string" || typeof args !== "string") {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
calls.push({ id, name, arguments: args });
|
|
28
|
+
}
|
|
29
|
+
return calls.length > 0 ? calls : null;
|
|
30
|
+
}
|
|
31
|
+
function parseAssistantMessage(parsed) {
|
|
32
|
+
if (!isRecord(parsed)) {
|
|
33
|
+
throw new Error("LLM response is not an object");
|
|
34
|
+
}
|
|
35
|
+
const choices = parsed.choices;
|
|
36
|
+
if (!Array.isArray(choices) || choices.length === 0) {
|
|
37
|
+
throw new Error("LLM response has no choices");
|
|
38
|
+
}
|
|
39
|
+
const c0 = choices[0];
|
|
40
|
+
if (!isRecord(c0)) {
|
|
41
|
+
throw new Error("LLM choice is not an object");
|
|
42
|
+
}
|
|
43
|
+
const messageObj = c0.message;
|
|
44
|
+
if (!isRecord(messageObj)) {
|
|
45
|
+
throw new Error("LLM message is not an object");
|
|
46
|
+
}
|
|
47
|
+
const contentRaw = messageObj.content;
|
|
48
|
+
const content = typeof contentRaw === "string"
|
|
49
|
+
? contentRaw
|
|
50
|
+
: contentRaw === null || contentRaw === undefined
|
|
51
|
+
? null
|
|
52
|
+
: null;
|
|
53
|
+
const toolCalls = parseToolCalls(messageObj.tool_calls);
|
|
54
|
+
return { content, toolCalls };
|
|
55
|
+
}
|
|
56
|
+
function serializeMessage(message) {
|
|
57
|
+
if (message.role === "tool") {
|
|
58
|
+
return {
|
|
59
|
+
role: "tool",
|
|
60
|
+
tool_call_id: message.tool_call_id,
|
|
61
|
+
content: message.content,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
if (message.role === "assistant") {
|
|
65
|
+
const base = {
|
|
66
|
+
role: "assistant",
|
|
67
|
+
content: message.content,
|
|
68
|
+
};
|
|
69
|
+
if (message.tool_calls !== null && message.tool_calls.length > 0) {
|
|
70
|
+
base.tool_calls = message.tool_calls.map((call) => ({
|
|
71
|
+
id: call.id,
|
|
72
|
+
type: "function",
|
|
73
|
+
function: { name: call.name, arguments: call.arguments },
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
return base;
|
|
77
|
+
}
|
|
78
|
+
return { role: message.role, content: message.content };
|
|
79
|
+
}
|
|
80
|
+
/** OpenAI-compatible chat completion with tool calling (non-streaming). */
|
|
81
|
+
export async function chatCompletionWithTools(provider, messages, tools) {
|
|
82
|
+
const body = {
|
|
83
|
+
model: provider.model,
|
|
84
|
+
messages: messages.map(serializeMessage),
|
|
85
|
+
};
|
|
86
|
+
if (tools !== null && tools.length > 0) {
|
|
87
|
+
body.tools = tools;
|
|
88
|
+
body.tool_choice = "auto";
|
|
89
|
+
}
|
|
90
|
+
let response;
|
|
91
|
+
try {
|
|
92
|
+
response = await fetch(chatUrl(provider.baseUrl), {
|
|
93
|
+
method: "POST",
|
|
94
|
+
headers: {
|
|
95
|
+
Authorization: `Bearer ${provider.apiKey}`,
|
|
96
|
+
"Content-Type": "application/json",
|
|
97
|
+
},
|
|
98
|
+
body: JSON.stringify(body),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch (cause) {
|
|
102
|
+
const message = cause instanceof Error ? cause.message : String(cause);
|
|
103
|
+
throw new Error(`LLM network error: ${message}`);
|
|
104
|
+
}
|
|
105
|
+
const responseText = await response.text();
|
|
106
|
+
if (!response.ok) {
|
|
107
|
+
throw new Error(`LLM HTTP ${response.status}: ${responseText.slice(0, 2000)}`);
|
|
108
|
+
}
|
|
109
|
+
let parsed;
|
|
110
|
+
try {
|
|
111
|
+
parsed = JSON.parse(responseText);
|
|
112
|
+
}
|
|
113
|
+
catch (cause) {
|
|
114
|
+
const message = cause instanceof Error ? cause.message : String(cause);
|
|
115
|
+
throw new Error(`LLM invalid JSON response: ${message}`);
|
|
116
|
+
}
|
|
117
|
+
return parseAssistantMessage(parsed);
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=llm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/llm/llm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type LlmToolCall = {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
arguments: string;
|
|
5
|
+
};
|
|
6
|
+
export type LlmAssistantResponse = {
|
|
7
|
+
content: string | null;
|
|
8
|
+
toolCalls: LlmToolCall[] | null;
|
|
9
|
+
};
|
|
10
|
+
export type ChatMessage = {
|
|
11
|
+
role: "system";
|
|
12
|
+
content: string;
|
|
13
|
+
} | {
|
|
14
|
+
role: "user";
|
|
15
|
+
content: string;
|
|
16
|
+
} | {
|
|
17
|
+
role: "assistant";
|
|
18
|
+
content: string | null;
|
|
19
|
+
tool_calls: LlmToolCall[] | null;
|
|
20
|
+
} | {
|
|
21
|
+
role: "tool";
|
|
22
|
+
tool_call_id: string;
|
|
23
|
+
content: string;
|
|
24
|
+
};
|
|
25
|
+
export type OpenAiToolDefinition = {
|
|
26
|
+
type: "function";
|
|
27
|
+
function: {
|
|
28
|
+
name: string;
|
|
29
|
+
description: string;
|
|
30
|
+
parameters: Record<string, unknown>;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/llm/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjC;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;CAClC,GACD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACrC,CAAC;CACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/llm/types.ts"],"names":[],"mappings":""}
|
package/dist/loop.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ResolvedLlmProvider } from "@uncaged/workflow-util-agent";
|
|
2
|
+
import { type ChatMessage, type LlmToolCall } from "./llm/index.js";
|
|
3
|
+
import { type ToolContext } from "./tools/index.js";
|
|
4
|
+
export declare const BUILTIN_MAX_TURNS = 30;
|
|
5
|
+
export declare const BUILTIN_CONTINUE_MAX_TURNS = 5;
|
|
6
|
+
export type RunBuiltinLoopOptions = {
|
|
7
|
+
provider: ResolvedLlmProvider;
|
|
8
|
+
messages: ChatMessage[];
|
|
9
|
+
toolCtx: ToolContext;
|
|
10
|
+
maxTurns: number;
|
|
11
|
+
storageRoot: string;
|
|
12
|
+
sessionId: string;
|
|
13
|
+
/** When true, do not provide tools — force LLM to emit text only. */
|
|
14
|
+
noTools: boolean;
|
|
15
|
+
};
|
|
16
|
+
export type RunBuiltinLoopResult = {
|
|
17
|
+
finalText: string;
|
|
18
|
+
messages: ChatMessage[];
|
|
19
|
+
turnCount: number;
|
|
20
|
+
};
|
|
21
|
+
export declare function executeTurnTools(calls: Array<{
|
|
22
|
+
id: string;
|
|
23
|
+
name: string;
|
|
24
|
+
arguments: string;
|
|
25
|
+
}>, toolCtx: ToolContext, messages: ChatMessage[], storageRoot: string, sessionId: string): Promise<number>;
|
|
26
|
+
export type ShouldNudgeOptions = {
|
|
27
|
+
noTools: boolean;
|
|
28
|
+
text: string;
|
|
29
|
+
turn: number;
|
|
30
|
+
maxTurns: number;
|
|
31
|
+
};
|
|
32
|
+
export declare function shouldInjectDeadlineWarning(turn: number, maxTurns: number, alreadyWarned: boolean, noTools: boolean): boolean;
|
|
33
|
+
export declare function shouldProcessToolCalls(toolCalls: LlmToolCall[] | null, noTools: boolean): boolean;
|
|
34
|
+
export declare function extractFinalText(messages: ChatMessage[]): string;
|
|
35
|
+
export declare function shouldNudge({ noTools, text, turn, maxTurns }: ShouldNudgeOptions): boolean;
|
|
36
|
+
/** Agent run loop: LLM ↔ tools until no tool_calls or maxTurns. */
|
|
37
|
+
export declare function runBuiltinLoop(options: RunBuiltinLoopOptions): Promise<RunBuiltinLoopResult>;
|
|
38
|
+
//# sourceMappingURL=loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../src/loop.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAExE,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,WAAW,EAEjB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAK1B,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAiBF,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,EAC7D,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,WAAW,EAAE,EACvB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAKF,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,OAAO,EACtB,OAAO,EAAE,OAAO,GACf,OAAO,CAKT;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAEjG;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAahE;AAgFD,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAE1F;AAmED,mEAAmE;AACnE,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAkC/B"}
|