@agents-ensemble/core 0.6.4 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/conductor/conductor-agent.d.ts +50 -14
- package/dist/conductor/conductor-agent.d.ts.map +1 -1
- package/dist/conductor/conductor-agent.js +1 -96
- package/dist/conductor/conductor-agent.js.map +1 -1
- package/dist/conductor/conductor-send-reconnect.d.ts +41 -5
- package/dist/conductor/conductor-send-reconnect.d.ts.map +1 -1
- package/dist/conductor/conductor-send-reconnect.js +81 -8
- package/dist/conductor/conductor-send-reconnect.js.map +1 -1
- package/dist/conductor/conductor-session-driver.d.ts +2 -4
- package/dist/conductor/conductor-session-driver.d.ts.map +1 -1
- package/dist/conductor/conductor-session-driver.js +54 -30
- package/dist/conductor/conductor-session-driver.js.map +1 -1
- package/dist/conductor/conductor-session.d.ts +5 -1
- package/dist/conductor/conductor-session.d.ts.map +1 -1
- package/dist/conductor/conductor-session.js +116 -29
- package/dist/conductor/conductor-session.js.map +1 -1
- package/dist/conductor/conductor-tool-pi-adapter.d.ts +13 -0
- package/dist/conductor/conductor-tool-pi-adapter.d.ts.map +1 -0
- package/dist/conductor/conductor-tool-pi-adapter.js +30 -0
- package/dist/conductor/conductor-tool-pi-adapter.js.map +1 -0
- package/dist/conductor/conductor-tool-sdk-adapter.d.ts +6 -0
- package/dist/conductor/conductor-tool-sdk-adapter.d.ts.map +1 -0
- package/dist/conductor/conductor-tool-sdk-adapter.js +16 -0
- package/dist/conductor/conductor-tool-sdk-adapter.js.map +1 -0
- package/dist/conductor/conductor-tool.d.ts +35 -0
- package/dist/conductor/conductor-tool.d.ts.map +1 -0
- package/dist/conductor/conductor-tool.js +41 -0
- package/dist/conductor/conductor-tool.js.map +1 -0
- package/dist/conductor/cursor-sdk-conductor-agent.d.ts +18 -0
- package/dist/conductor/cursor-sdk-conductor-agent.d.ts.map +1 -0
- package/dist/conductor/cursor-sdk-conductor-agent.js +134 -0
- package/dist/conductor/cursor-sdk-conductor-agent.js.map +1 -0
- package/dist/conductor/index.d.ts +19 -4
- package/dist/conductor/index.d.ts.map +1 -1
- package/dist/conductor/index.js +10 -2
- package/dist/conductor/index.js.map +1 -1
- package/dist/conductor/operator-reconnect.d.ts +3 -0
- package/dist/conductor/operator-reconnect.d.ts.map +1 -0
- package/dist/conductor/operator-reconnect.js +6 -0
- package/dist/conductor/operator-reconnect.js.map +1 -0
- package/dist/conductor/pi-conductor-agent.d.ts +46 -0
- package/dist/conductor/pi-conductor-agent.d.ts.map +1 -0
- package/dist/conductor/pi-conductor-agent.js +487 -0
- package/dist/conductor/pi-conductor-agent.js.map +1 -0
- package/dist/conductor/pi-conductor-session.d.ts +20 -0
- package/dist/conductor/pi-conductor-session.d.ts.map +1 -0
- package/dist/conductor/pi-conductor-session.js +60 -0
- package/dist/conductor/pi-conductor-session.js.map +1 -0
- package/dist/conductor/pi-mcp-bridge.d.ts +65 -0
- package/dist/conductor/pi-mcp-bridge.d.ts.map +1 -0
- package/dist/conductor/pi-mcp-bridge.js +259 -0
- package/dist/conductor/pi-mcp-bridge.js.map +1 -0
- package/dist/conductor/pi-resource-loader.d.ts +145 -0
- package/dist/conductor/pi-resource-loader.d.ts.map +1 -0
- package/dist/conductor/pi-resource-loader.js +673 -0
- package/dist/conductor/pi-resource-loader.js.map +1 -0
- package/dist/conductor/session/dispatch-hold.d.ts +1 -1
- package/dist/conductor/session/dispatch-hold.d.ts.map +1 -1
- package/dist/conductor/session/dispatch-hold.js +2 -1
- package/dist/conductor/session/dispatch-hold.js.map +1 -1
- package/dist/conductor/session/events/index.d.ts +2 -2
- package/dist/conductor/session/events/index.d.ts.map +1 -1
- package/dist/conductor/session/events/index.js.map +1 -1
- package/dist/conductor/session/events/session-event.d.ts +5 -1
- package/dist/conductor/session/events/session-event.d.ts.map +1 -1
- package/dist/conductor/session/events/session-log-event-groups.d.ts +3 -3
- package/dist/conductor/session/events/session-log-event-groups.d.ts.map +1 -1
- package/dist/conductor/session/events/session-log-event-groups.js +2 -0
- package/dist/conductor/session/events/session-log-event-groups.js.map +1 -1
- package/dist/conductor/session/events/session-log-event.d.ts +7 -1
- package/dist/conductor/session/events/session-log-event.d.ts.map +1 -1
- package/dist/conductor/session/format-session-event.js +4 -0
- package/dist/conductor/session/format-session-event.js.map +1 -1
- package/dist/conductor/session/select-dispatch-batch.d.ts.map +1 -1
- package/dist/conductor/session/select-dispatch-batch.js +5 -0
- package/dist/conductor/session/select-dispatch-batch.js.map +1 -1
- package/dist/conductor/session/session-event.d.ts +1 -1
- package/dist/conductor/session/session-event.d.ts.map +1 -1
- package/dist/conductor/session/session-logger.d.ts.map +1 -1
- package/dist/conductor/session/session-logger.js +1 -0
- package/dist/conductor/session/session-logger.js.map +1 -1
- package/dist/conductor/session-policy.d.ts.map +1 -1
- package/dist/conductor/session-policy.js +6 -1
- package/dist/conductor/session-policy.js.map +1 -1
- package/dist/config/defaults.d.ts +2 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +2 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/index.d.ts +3 -3
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +2 -2
- package/dist/config/index.js.map +1 -1
- package/dist/config/parse-config.d.ts.map +1 -1
- package/dist/config/parse-config.js +29 -1
- package/dist/config/parse-config.js.map +1 -1
- package/dist/config/resolve-settings.d.ts +25 -1
- package/dist/config/resolve-settings.d.ts.map +1 -1
- package/dist/config/resolve-settings.js +38 -1
- package/dist/config/resolve-settings.js.map +1 -1
- package/dist/config/types.d.ts +11 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/dispatch/prompt-worker-tool.d.ts +2 -2
- package/dist/dispatch/prompt-worker-tool.d.ts.map +1 -1
- package/dist/dispatch/prompt-worker-tool.js +1 -0
- package/dist/dispatch/prompt-worker-tool.js.map +1 -1
- package/dist/dispatch/session-usage-tool.d.ts +2 -2
- package/dist/dispatch/session-usage-tool.d.ts.map +1 -1
- package/dist/dispatch/session-usage-tool.js +2 -0
- package/dist/dispatch/session-usage-tool.js.map +1 -1
- package/dist/dispatch/set-dispatch-hold-tool.d.ts +2 -2
- package/dist/dispatch/set-dispatch-hold-tool.d.ts.map +1 -1
- package/dist/dispatch/set-dispatch-hold-tool.js +1 -0
- package/dist/dispatch/set-dispatch-hold-tool.js.map +1 -1
- package/dist/dispatch/worker-status-tool.d.ts +2 -2
- package/dist/dispatch/worker-status-tool.d.ts.map +1 -1
- package/dist/dispatch/worker-status-tool.js +2 -0
- package/dist/dispatch/worker-status-tool.js.map +1 -1
- package/dist/dispatch/yaml-tool-result.d.ts +3 -9
- package/dist/dispatch/yaml-tool-result.d.ts.map +1 -1
- package/dist/dispatch/yaml-tool-result.js.map +1 -1
- package/dist/escalation/answer-open-question-tool.d.ts +2 -2
- package/dist/escalation/answer-open-question-tool.d.ts.map +1 -1
- package/dist/escalation/answer-open-question-tool.js +1 -0
- package/dist/escalation/answer-open-question-tool.js.map +1 -1
- package/dist/escalation/ask-human-tool.d.ts +2 -2
- package/dist/escalation/ask-human-tool.d.ts.map +1 -1
- package/dist/escalation/ask-human-tool.js +1 -0
- package/dist/escalation/ask-human-tool.js.map +1 -1
- package/dist/escalation/open-question-list-tools.d.ts +2 -2
- package/dist/escalation/open-question-list-tools.d.ts.map +1 -1
- package/dist/escalation/open-question-list-tools.js +2 -0
- package/dist/escalation/open-question-list-tools.js.map +1 -1
- package/dist/github/fetch-github-updates.d.ts +0 -6
- package/dist/github/fetch-github-updates.d.ts.map +1 -1
- package/dist/github/fetch-github-updates.js +74 -119
- package/dist/github/fetch-github-updates.js.map +1 -1
- package/dist/github/github-monitor-cursor.d.ts +24 -8
- package/dist/github/github-monitor-cursor.d.ts.map +1 -1
- package/dist/github/github-monitor-cursor.js +51 -17
- package/dist/github/github-monitor-cursor.js.map +1 -1
- package/dist/github/github-update-types.d.ts +1 -1
- package/dist/github/github-update-types.d.ts.map +1 -1
- package/dist/github/index.d.ts +1 -1
- package/dist/github/index.d.ts.map +1 -1
- package/dist/github/index.js.map +1 -1
- package/dist/github/register-github-watch-tool.d.ts +2 -2
- package/dist/github/register-github-watch-tool.d.ts.map +1 -1
- package/dist/github/register-github-watch-tool.js +1 -0
- package/dist/github/register-github-watch-tool.js.map +1 -1
- package/dist/mcp/index.d.ts +2 -3
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +1 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/load-mcp-config.d.ts +29 -5
- package/dist/mcp/load-mcp-config.d.ts.map +1 -1
- package/dist/mcp/load-mcp-config.js +9 -2
- package/dist/mcp/load-mcp-config.js.map +1 -1
- package/dist/permission/resolve-permission-tool.d.ts +2 -2
- package/dist/permission/resolve-permission-tool.d.ts.map +1 -1
- package/dist/permission/resolve-permission-tool.js +1 -0
- package/dist/permission/resolve-permission-tool.js.map +1 -1
- package/dist/profile/index.d.ts +1 -1
- package/dist/profile/index.d.ts.map +1 -1
- package/dist/profile/index.js.map +1 -1
- package/dist/profile/load-profile.d.ts.map +1 -1
- package/dist/profile/load-profile.js +19 -0
- package/dist/profile/load-profile.js.map +1 -1
- package/dist/profile/types.d.ts +7 -0
- package/dist/profile/types.d.ts.map +1 -1
- package/dist/profile/types.js.map +1 -1
- package/dist/runtime/conductor-inbox.d.ts +5 -0
- package/dist/runtime/conductor-inbox.d.ts.map +1 -1
- package/dist/runtime/conductor-inbox.js +22 -0
- package/dist/runtime/conductor-inbox.js.map +1 -1
- package/dist/runtime/worker-runtime.d.ts +1 -1
- package/dist/runtime/worker-runtime.d.ts.map +1 -1
- package/dist/runtime/worker-runtime.js +14 -7
- package/dist/runtime/worker-runtime.js.map +1 -1
- package/dist/session/session-sidecar.d.ts +4 -0
- package/dist/session/session-sidecar.d.ts.map +1 -1
- package/dist/session/session-sidecar.js +16 -0
- package/dist/session/session-sidecar.js.map +1 -1
- package/dist/testing/mock-conductor-get-usage.d.ts +2 -1
- package/dist/testing/mock-conductor-get-usage.d.ts.map +1 -1
- package/dist/testing/mock-conductor-get-usage.js +1 -10
- package/dist/testing/mock-conductor-get-usage.js.map +1 -1
- package/dist/usage/enrich-session-usage-cost.d.ts +2 -2
- package/dist/usage/enrich-session-usage-cost.d.ts.map +1 -1
- package/dist/usage/session-usage-tracker.d.ts +2 -2
- package/dist/usage/session-usage-tracker.d.ts.map +1 -1
- package/dist/usage/session-usage-tracker.js +2 -2
- package/dist/usage/session-usage-tracker.js.map +1 -1
- package/dist/usage/types.d.ts +2 -2
- package/dist/usage/types.d.ts.map +1 -1
- package/dist/worktree/worktree.d.ts.map +1 -1
- package/dist/worktree/worktree.js +33 -16
- package/dist/worktree/worktree.js.map +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { Agent, } from '@earendil-works/pi-agent-core';
|
|
3
|
+
import { getEnvApiKey, getModel, getModels, getProviders, } from '@earendil-works/pi-ai/compat';
|
|
4
|
+
import { toPiAgentTools } from './conductor-tool-pi-adapter.js';
|
|
5
|
+
import { PiConductorSession } from './pi-conductor-session.js';
|
|
6
|
+
import { expandPiResourcePrompt, formatPiSkillsForPrompt, loadPiResources, } from './pi-resource-loader.js';
|
|
7
|
+
import { createPiMcpBridge, } from './pi-mcp-bridge.js';
|
|
8
|
+
/** Resolve the Pi model/auth selection from the standard resource roots. */
|
|
9
|
+
export async function resolvePiModelConfig(options) {
|
|
10
|
+
const resources = await loadPiResources(options);
|
|
11
|
+
return resolvePiModelConfigFromResources(options, resources);
|
|
12
|
+
}
|
|
13
|
+
function resolvePiModelConfigFromResources(options, resources) {
|
|
14
|
+
const env = options.env ?? process.env;
|
|
15
|
+
const settings = resources.settings;
|
|
16
|
+
const selection = resolvePiModelSelection(options.modelId, settings, resources.models);
|
|
17
|
+
const providerConfig = resources.models.providers[selection.provider];
|
|
18
|
+
const builtInModel = getModel(selection.provider, selection.modelId);
|
|
19
|
+
const model = resolvePiModel(selection.provider, selection.modelId, providerConfig, builtInModel);
|
|
20
|
+
if (!model) {
|
|
21
|
+
throw new Error(`Pi conductor model "${selection.provider}/${selection.modelId}" was not found in pi-ai or models.json. ` +
|
|
22
|
+
'Set defaultProvider/defaultModel in Pi settings.json or pass a built-in provider/model id.');
|
|
23
|
+
}
|
|
24
|
+
const apiKey = options.apiKey ??
|
|
25
|
+
resolvePiAuthKey(resources.authLayers, selection.provider, env) ??
|
|
26
|
+
resolvePiSettingsApiKey(settings, selection.provider, env) ??
|
|
27
|
+
resolvePiModelsApiKey(providerConfig, env) ??
|
|
28
|
+
getEnvApiKey(selection.provider, toProviderEnv(env));
|
|
29
|
+
return {
|
|
30
|
+
provider: selection.provider,
|
|
31
|
+
modelId: selection.modelId,
|
|
32
|
+
model: applyPiProviderRequestConfig(model, providerConfig, apiKey),
|
|
33
|
+
...(apiKey !== undefined ? { apiKey } : {}),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** Pi implementation of the backend-neutral conductor interface. */
|
|
37
|
+
export class PiConductorAgent {
|
|
38
|
+
agent;
|
|
39
|
+
session;
|
|
40
|
+
mcpBridge;
|
|
41
|
+
resources;
|
|
42
|
+
agentId;
|
|
43
|
+
modelId;
|
|
44
|
+
onStreamText;
|
|
45
|
+
unsubscribe;
|
|
46
|
+
activeSend;
|
|
47
|
+
closed = false;
|
|
48
|
+
closePromise;
|
|
49
|
+
hasUsage = false;
|
|
50
|
+
rawCostCents = 0;
|
|
51
|
+
chargedCents = 0;
|
|
52
|
+
constructor(agent, session, mcpBridge, resources, agentId, modelId, onStreamText) {
|
|
53
|
+
this.agent = agent;
|
|
54
|
+
this.session = session;
|
|
55
|
+
this.mcpBridge = mcpBridge;
|
|
56
|
+
this.resources = resources;
|
|
57
|
+
this.agentId = agentId;
|
|
58
|
+
this.modelId = modelId;
|
|
59
|
+
this.onStreamText = onStreamText;
|
|
60
|
+
this.unsubscribe = this.agent.subscribe((event) => this.handleEvent(event));
|
|
61
|
+
}
|
|
62
|
+
static async create(options) {
|
|
63
|
+
const agentId = randomUUID();
|
|
64
|
+
const resources = await loadPiResources(options);
|
|
65
|
+
const resolved = resolvePiModelConfigFromResources(options, resources);
|
|
66
|
+
const session = await PiConductorSession.create(options.cwd, agentId);
|
|
67
|
+
const mcpBridge = await createPiMcpBridge(options.mcpServers, {
|
|
68
|
+
cwd: options.cwd,
|
|
69
|
+
});
|
|
70
|
+
try {
|
|
71
|
+
return new PiConductorAgent(createPiAgent(agentId, options, resolved, session.messages, mcpBridge, resources), session, mcpBridge, resources, agentId, resolved.modelId, options.onStreamText);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
await mcpBridge?.close();
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
static async resume(agentId, options) {
|
|
79
|
+
const resources = await loadPiResources(options);
|
|
80
|
+
const resolved = resolvePiModelConfigFromResources(options, resources);
|
|
81
|
+
const session = await PiConductorSession.resume(options.cwd, agentId);
|
|
82
|
+
const mcpBridge = await createPiMcpBridge(options.mcpServers, {
|
|
83
|
+
cwd: options.cwd,
|
|
84
|
+
});
|
|
85
|
+
try {
|
|
86
|
+
return new PiConductorAgent(createPiAgent(agentId, options, resolved, session.messages, mcpBridge, resources), session, mcpBridge, resources, agentId, resolved.modelId, options.onStreamText);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
await mcpBridge?.close();
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async send(prompt, callbacks) {
|
|
94
|
+
const runId = randomUUID();
|
|
95
|
+
if (this.closed) {
|
|
96
|
+
return {
|
|
97
|
+
runId,
|
|
98
|
+
status: 'error',
|
|
99
|
+
error: { message: 'Pi conductor agent is closed.' },
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
if (this.activeSend) {
|
|
103
|
+
return {
|
|
104
|
+
runId,
|
|
105
|
+
status: 'error',
|
|
106
|
+
error: { message: 'Pi conductor agent already has a send in progress.' },
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const state = { runId, callbacks };
|
|
110
|
+
this.activeSend = state;
|
|
111
|
+
try {
|
|
112
|
+
await this.agent.prompt(expandPiResourcePrompt(prompt, this.resources));
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
return {
|
|
116
|
+
runId,
|
|
117
|
+
status: 'error',
|
|
118
|
+
error: { message: errorMessage(error) },
|
|
119
|
+
modelId: this.modelId,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
this.activeSend = undefined;
|
|
124
|
+
}
|
|
125
|
+
const finalMessage = state.finalMessage ?? lastAssistantMessage(this.agent.state.messages);
|
|
126
|
+
if (!finalMessage) {
|
|
127
|
+
return {
|
|
128
|
+
runId,
|
|
129
|
+
status: 'finished',
|
|
130
|
+
modelId: this.modelId,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
this.recordUsage(finalMessage);
|
|
134
|
+
const status = statusFromStopReason(finalMessage.stopReason);
|
|
135
|
+
return {
|
|
136
|
+
runId,
|
|
137
|
+
status,
|
|
138
|
+
result: assistantText(finalMessage) || undefined,
|
|
139
|
+
...(finalMessage.errorMessage
|
|
140
|
+
? { error: { message: finalMessage.errorMessage } }
|
|
141
|
+
: {}),
|
|
142
|
+
usage: toConductorTokenUsage(finalMessage.usage),
|
|
143
|
+
modelId: finalMessage.model || this.modelId,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/** Pi's core agent has no reload operation; settings are loaded at create. */
|
|
147
|
+
async reload() { }
|
|
148
|
+
async getUsage() {
|
|
149
|
+
return this.hasUsage
|
|
150
|
+
? {
|
|
151
|
+
cost: {
|
|
152
|
+
rawCostCents: this.rawCostCents,
|
|
153
|
+
chargedCents: this.chargedCents,
|
|
154
|
+
},
|
|
155
|
+
}
|
|
156
|
+
: {};
|
|
157
|
+
}
|
|
158
|
+
/** Resume recompiles and reinstalls the native system prompt on each run. */
|
|
159
|
+
async setSystemPrompt(systemPrompt) {
|
|
160
|
+
this.agent.state.systemPrompt = withPiSkills(systemPrompt, this.resources);
|
|
161
|
+
}
|
|
162
|
+
async close() {
|
|
163
|
+
if (this.closePromise) {
|
|
164
|
+
return this.closePromise;
|
|
165
|
+
}
|
|
166
|
+
this.closed = true;
|
|
167
|
+
this.closePromise = (async () => {
|
|
168
|
+
try {
|
|
169
|
+
this.agent.abort();
|
|
170
|
+
await this.agent.waitForIdle();
|
|
171
|
+
await this.session.appendNewMessages(this.agent.state.messages);
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
try {
|
|
175
|
+
this.unsubscribe();
|
|
176
|
+
}
|
|
177
|
+
finally {
|
|
178
|
+
await this.mcpBridge?.close();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
})();
|
|
182
|
+
return this.closePromise;
|
|
183
|
+
}
|
|
184
|
+
async handleEvent(event) {
|
|
185
|
+
const activeSend = this.activeSend;
|
|
186
|
+
if (event.type === 'tool_execution_start') {
|
|
187
|
+
activeSend?.callbacks?.onToolCallStarted?.({
|
|
188
|
+
runId: activeSend.runId,
|
|
189
|
+
tool: event.toolName,
|
|
190
|
+
callId: event.toolCallId,
|
|
191
|
+
});
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
if (event.type === 'message_update') {
|
|
195
|
+
if (event.assistantMessageEvent.type === 'text_delta') {
|
|
196
|
+
this.onStreamText?.(event.assistantMessageEvent.delta);
|
|
197
|
+
}
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (event.type === 'agent_end' && activeSend) {
|
|
201
|
+
activeSend.finalMessage = lastAssistantMessage(event.messages);
|
|
202
|
+
}
|
|
203
|
+
if (event.type === 'agent_end') {
|
|
204
|
+
// Pi's failure/abort event can contain only the failure assistant while
|
|
205
|
+
// agent.state.messages already contains the user prompt and failure.
|
|
206
|
+
// Persist the full in-memory suffix so every run is written once in
|
|
207
|
+
// transcript order; close() uses the same serialized operation.
|
|
208
|
+
await this.session.appendNewMessages(this.agent.state.messages);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
recordUsage(message) {
|
|
212
|
+
this.hasUsage = true;
|
|
213
|
+
this.rawCostCents += message.usage.cost.total * 100;
|
|
214
|
+
this.chargedCents += message.usage.cost.total * 100;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/** Create the Pi conductor backend factory. */
|
|
218
|
+
export function createPiConductorAgentFactory() {
|
|
219
|
+
return {
|
|
220
|
+
create: (options) => PiConductorAgent.create(options),
|
|
221
|
+
resume: (agentId, options) => PiConductorAgent.resume(agentId, options),
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
function createPiAgent(agentId, options, resolved, messages, mcpBridge, resources) {
|
|
225
|
+
const tools = uniquePiTools(options.customTools ? toPiAgentTools(options.customTools) : [], mcpBridge?.tools ?? [], resources.extensionTools);
|
|
226
|
+
return new Agent({
|
|
227
|
+
initialState: {
|
|
228
|
+
systemPrompt: withPiSkills(options.systemPrompt, resources),
|
|
229
|
+
model: resolved.model,
|
|
230
|
+
// Do not add Pi's built-in coding tools. Harness tools are the complete
|
|
231
|
+
// loadout; repository work is delegated to worker ACP sessions.
|
|
232
|
+
tools,
|
|
233
|
+
messages: [...messages],
|
|
234
|
+
},
|
|
235
|
+
sessionId: agentId,
|
|
236
|
+
getApiKey: (provider) => provider === resolved.provider
|
|
237
|
+
? (resolved.apiKey ?? getEnvApiKey(provider))
|
|
238
|
+
: getEnvApiKey(provider),
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
function uniquePiTools(...groups) {
|
|
242
|
+
const tools = new Map();
|
|
243
|
+
for (const group of groups) {
|
|
244
|
+
for (const tool of group) {
|
|
245
|
+
if (!tools.has(tool.name)) {
|
|
246
|
+
tools.set(tool.name, tool);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return [...tools.values()];
|
|
251
|
+
}
|
|
252
|
+
function withPiSkills(systemPrompt, resources) {
|
|
253
|
+
return `${systemPrompt}${formatPiSkillsForPrompt(resources.skills)}`;
|
|
254
|
+
}
|
|
255
|
+
function resolvePiModel(provider, modelId, providerConfig, builtInModel) {
|
|
256
|
+
const definition = providerConfig?.models?.find((candidate) => candidate.id === modelId);
|
|
257
|
+
let model = definition && providerConfig
|
|
258
|
+
? createPiModel(provider, providerConfig, definition)
|
|
259
|
+
: builtInModel;
|
|
260
|
+
if (!model)
|
|
261
|
+
return undefined;
|
|
262
|
+
const override = providerConfig?.modelOverrides?.[modelId];
|
|
263
|
+
if (providerConfig?.baseUrl || providerConfig?.compat) {
|
|
264
|
+
model = {
|
|
265
|
+
...model,
|
|
266
|
+
...(providerConfig.baseUrl ? { baseUrl: providerConfig.baseUrl } : {}),
|
|
267
|
+
...(providerConfig.compat
|
|
268
|
+
? { compat: mergePiObjects(model.compat, providerConfig.compat) }
|
|
269
|
+
: {}),
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
return override ? applyPiModelOverride(model, override) : model;
|
|
273
|
+
}
|
|
274
|
+
function createPiModel(provider, providerConfig, definition) {
|
|
275
|
+
const api = definition.api ?? providerConfig.api;
|
|
276
|
+
const baseUrl = definition.baseUrl ?? providerConfig.baseUrl;
|
|
277
|
+
if (!api || !baseUrl) {
|
|
278
|
+
throw new Error(`Pi models.json provider "${provider}" model "${definition.id}" requires api and baseUrl.`);
|
|
279
|
+
}
|
|
280
|
+
return {
|
|
281
|
+
id: definition.id,
|
|
282
|
+
name: definition.name ?? definition.id,
|
|
283
|
+
api,
|
|
284
|
+
provider,
|
|
285
|
+
baseUrl,
|
|
286
|
+
reasoning: definition.reasoning ?? false,
|
|
287
|
+
thinkingLevelMap: definition.thinkingLevelMap,
|
|
288
|
+
input: definition.input ?? ['text'],
|
|
289
|
+
cost: normalizePiModelCost(definition.cost),
|
|
290
|
+
contextWindow: definition.contextWindow ?? 128000,
|
|
291
|
+
maxTokens: definition.maxTokens ?? 16384,
|
|
292
|
+
headers: mergePiHeaders(providerConfig.headers, definition.headers),
|
|
293
|
+
compat: mergePiObjects(providerConfig.compat, definition.compat),
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
function applyPiModelOverride(model, override) {
|
|
297
|
+
return {
|
|
298
|
+
...model,
|
|
299
|
+
...(override.name !== undefined ? { name: override.name } : {}),
|
|
300
|
+
...(override.reasoning !== undefined ? { reasoning: override.reasoning } : {}),
|
|
301
|
+
...(override.thinkingLevelMap !== undefined
|
|
302
|
+
? { thinkingLevelMap: { ...model.thinkingLevelMap, ...override.thinkingLevelMap } }
|
|
303
|
+
: {}),
|
|
304
|
+
...(override.input !== undefined ? { input: override.input } : {}),
|
|
305
|
+
...(override.cost !== undefined
|
|
306
|
+
? { cost: normalizePiModelCost({ ...model.cost, ...override.cost }) }
|
|
307
|
+
: {}),
|
|
308
|
+
...(override.contextWindow !== undefined ? { contextWindow: override.contextWindow } : {}),
|
|
309
|
+
...(override.maxTokens !== undefined ? { maxTokens: override.maxTokens } : {}),
|
|
310
|
+
...(override.headers !== undefined
|
|
311
|
+
? { headers: mergePiHeaders(model.headers, override.headers) }
|
|
312
|
+
: {}),
|
|
313
|
+
...(override.compat !== undefined
|
|
314
|
+
? { compat: mergePiObjects(model.compat, override.compat) }
|
|
315
|
+
: {}),
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
function applyPiProviderRequestConfig(model, providerConfig, apiKey) {
|
|
319
|
+
if (!providerConfig)
|
|
320
|
+
return model;
|
|
321
|
+
const headers = mergePiHeaders(model.headers, providerConfig.headers);
|
|
322
|
+
if (providerConfig.authHeader && apiKey) {
|
|
323
|
+
headers.Authorization = `Bearer ${apiKey}`;
|
|
324
|
+
}
|
|
325
|
+
return Object.keys(headers).length > 0 ? { ...model, headers } : model;
|
|
326
|
+
}
|
|
327
|
+
function normalizePiModelCost(cost) {
|
|
328
|
+
const defaults = emptyPiModelCost();
|
|
329
|
+
return {
|
|
330
|
+
input: numberValue(cost?.input, defaults.input),
|
|
331
|
+
output: numberValue(cost?.output, defaults.output),
|
|
332
|
+
cacheRead: numberValue(cost?.cacheRead, defaults.cacheRead),
|
|
333
|
+
cacheWrite: numberValue(cost?.cacheWrite, defaults.cacheWrite),
|
|
334
|
+
...(cost?.tiers ? { tiers: cost.tiers } : {}),
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
function emptyPiModelCost() {
|
|
338
|
+
return { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
|
|
339
|
+
}
|
|
340
|
+
function numberValue(value, fallback) {
|
|
341
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : fallback;
|
|
342
|
+
}
|
|
343
|
+
function mergePiHeaders(...headers) {
|
|
344
|
+
return Object.assign({}, ...headers.filter((value) => Boolean(value)));
|
|
345
|
+
}
|
|
346
|
+
function mergePiObjects(...values) {
|
|
347
|
+
const merged = {};
|
|
348
|
+
for (const value of values) {
|
|
349
|
+
if (isRecord(value))
|
|
350
|
+
Object.assign(merged, value);
|
|
351
|
+
}
|
|
352
|
+
return merged;
|
|
353
|
+
}
|
|
354
|
+
function resolvePiModelSelection(requestedModelId, settings, models) {
|
|
355
|
+
const requested = normalizeConfiguredString(requestedModelId);
|
|
356
|
+
const configured = firstString(settings.defaultModel, settings.model, settings.modelId);
|
|
357
|
+
const selected = requested ?? configured;
|
|
358
|
+
let provider = normalizeConfiguredString(settings.defaultProvider);
|
|
359
|
+
let modelId = selected;
|
|
360
|
+
if (selected?.includes('/')) {
|
|
361
|
+
const slash = selected.indexOf('/');
|
|
362
|
+
provider = selected.slice(0, slash);
|
|
363
|
+
modelId = selected.slice(slash + 1);
|
|
364
|
+
}
|
|
365
|
+
if (!modelId) {
|
|
366
|
+
throw new Error('Pi conductor model is not configured. Set defaultProvider/defaultModel in Pi settings.json or pass modelId as provider/model.');
|
|
367
|
+
}
|
|
368
|
+
if (!provider) {
|
|
369
|
+
const candidates = new Set([...getProviders(), ...Object.keys(models.providers)]);
|
|
370
|
+
const matches = [...candidates].flatMap((candidate) => {
|
|
371
|
+
const builtInModels = getModels(candidate) ?? [];
|
|
372
|
+
const customModels = models.providers[candidate]?.models ?? [];
|
|
373
|
+
return builtInModels.some((model) => model.id === modelId) ||
|
|
374
|
+
customModels.some((model) => model.id === modelId)
|
|
375
|
+
? [candidate]
|
|
376
|
+
: [];
|
|
377
|
+
});
|
|
378
|
+
if (matches.length === 1)
|
|
379
|
+
provider = matches[0];
|
|
380
|
+
}
|
|
381
|
+
if (!provider) {
|
|
382
|
+
throw new Error(`Pi conductor provider is not configured for model "${modelId}". Set defaultProvider in Pi settings.json or use provider/model.`);
|
|
383
|
+
}
|
|
384
|
+
return { provider, modelId };
|
|
385
|
+
}
|
|
386
|
+
function resolvePiAuthKey(authLayers, provider, env) {
|
|
387
|
+
for (let index = authLayers.length - 1; index >= 0; index -= 1) {
|
|
388
|
+
const value = resolvePiAuthEntry(authLayers[index]?.[provider], env);
|
|
389
|
+
if (value !== undefined)
|
|
390
|
+
return value;
|
|
391
|
+
}
|
|
392
|
+
return undefined;
|
|
393
|
+
}
|
|
394
|
+
function resolvePiAuthEntry(entry, env) {
|
|
395
|
+
if (typeof entry === 'string')
|
|
396
|
+
return expandEnvReference(entry, env);
|
|
397
|
+
if (!isRecord(entry))
|
|
398
|
+
return undefined;
|
|
399
|
+
for (const key of ['key', 'apiKey', 'token', 'accessToken', 'access']) {
|
|
400
|
+
const value = entry[key];
|
|
401
|
+
if (typeof value === 'string') {
|
|
402
|
+
return expandEnvReference(value, env);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
return undefined;
|
|
406
|
+
}
|
|
407
|
+
function resolvePiModelsApiKey(providerConfig, env) {
|
|
408
|
+
return providerConfig?.apiKey
|
|
409
|
+
? expandEnvReference(providerConfig.apiKey, env)
|
|
410
|
+
: undefined;
|
|
411
|
+
}
|
|
412
|
+
function resolvePiSettingsApiKey(settings, provider, env) {
|
|
413
|
+
if (typeof settings.apiKey === 'string') {
|
|
414
|
+
return expandEnvReference(settings.apiKey, env);
|
|
415
|
+
}
|
|
416
|
+
if (!isRecord(settings.apiKeys))
|
|
417
|
+
return undefined;
|
|
418
|
+
const value = settings.apiKeys[provider];
|
|
419
|
+
return typeof value === 'string' ? expandEnvReference(value, env) : undefined;
|
|
420
|
+
}
|
|
421
|
+
function expandEnvReference(value, env) {
|
|
422
|
+
if (value.startsWith('!')) {
|
|
423
|
+
// Pi supports command-backed credentials. Do not execute arbitrary commands
|
|
424
|
+
// from a harness config; #356/#358 can define a deliberate credential hook.
|
|
425
|
+
return undefined;
|
|
426
|
+
}
|
|
427
|
+
const variable = /^\$\{([^}]+)\}$/.exec(value) ?? /^\$([A-Za-z_][A-Za-z0-9_]*)$/.exec(value);
|
|
428
|
+
return variable ? env[variable[1]] : value;
|
|
429
|
+
}
|
|
430
|
+
function normalizeConfiguredString(value) {
|
|
431
|
+
if (typeof value !== 'string')
|
|
432
|
+
return undefined;
|
|
433
|
+
const normalized = value.trim();
|
|
434
|
+
if (!normalized || normalized === 'default' || normalized === 'auto') {
|
|
435
|
+
return undefined;
|
|
436
|
+
}
|
|
437
|
+
return normalized;
|
|
438
|
+
}
|
|
439
|
+
function firstString(...values) {
|
|
440
|
+
for (const value of values) {
|
|
441
|
+
const normalized = normalizeConfiguredString(value);
|
|
442
|
+
if (normalized)
|
|
443
|
+
return normalized;
|
|
444
|
+
}
|
|
445
|
+
return undefined;
|
|
446
|
+
}
|
|
447
|
+
function lastAssistantMessage(messages) {
|
|
448
|
+
for (let index = messages.length - 1; index >= 0; index -= 1) {
|
|
449
|
+
const message = messages[index];
|
|
450
|
+
if (message?.role === 'assistant') {
|
|
451
|
+
return message;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
return undefined;
|
|
455
|
+
}
|
|
456
|
+
function assistantText(message) {
|
|
457
|
+
return message.content
|
|
458
|
+
.filter((content) => content.type === 'text')
|
|
459
|
+
.map((content) => content.text)
|
|
460
|
+
.join('');
|
|
461
|
+
}
|
|
462
|
+
function statusFromStopReason(stopReason) {
|
|
463
|
+
if (stopReason === 'error')
|
|
464
|
+
return 'error';
|
|
465
|
+
if (stopReason === 'aborted')
|
|
466
|
+
return 'cancelled';
|
|
467
|
+
return 'finished';
|
|
468
|
+
}
|
|
469
|
+
function toConductorTokenUsage(usage) {
|
|
470
|
+
return {
|
|
471
|
+
inputTokens: usage.input,
|
|
472
|
+
outputTokens: usage.output,
|
|
473
|
+
totalTokens: usage.totalTokens,
|
|
474
|
+
cacheReadTokens: usage.cacheRead,
|
|
475
|
+
cacheWriteTokens: usage.cacheWrite,
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
function isRecord(value) {
|
|
479
|
+
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
480
|
+
}
|
|
481
|
+
function errorMessage(error) {
|
|
482
|
+
return error instanceof Error ? error.message : String(error);
|
|
483
|
+
}
|
|
484
|
+
function toProviderEnv(env) {
|
|
485
|
+
return Object.fromEntries(Object.entries(env).filter((entry) => typeof entry[1] === 'string'));
|
|
486
|
+
}
|
|
487
|
+
//# sourceMappingURL=pi-conductor-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-conductor-agent.js","sourceRoot":"","sources":["../../src/conductor/pi-conductor-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AgentMessage } from '@earendil-works/pi-agent-core/node';
|
|
2
|
+
/** Project-local Pi transcript storage used by the conductor backend. */
|
|
3
|
+
export declare const PI_SESSION_ROOT = ".ensemble/pi/sessions";
|
|
4
|
+
/**
|
|
5
|
+
* The Pi Agent Core `Agent` keeps its transcript in memory. This small adapter
|
|
6
|
+
* persists the same messages through Pi's JSONL session API so a new process
|
|
7
|
+
* can rebuild `Agent.state.messages` for `--resume`.
|
|
8
|
+
*/
|
|
9
|
+
export declare class PiConductorSession {
|
|
10
|
+
private readonly session;
|
|
11
|
+
private persistedMessages;
|
|
12
|
+
private writeQueue;
|
|
13
|
+
private constructor();
|
|
14
|
+
static create(cwd: string, sessionId: string): Promise<PiConductorSession>;
|
|
15
|
+
static resume(cwd: string, sessionId: string): Promise<PiConductorSession>;
|
|
16
|
+
get messages(): readonly AgentMessage[];
|
|
17
|
+
/** Append only the suffix not already written to the JSONL transcript. */
|
|
18
|
+
appendNewMessages(messages: readonly AgentMessage[]): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=pi-conductor-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-conductor-session.d.ts","sourceRoot":"","sources":["../../src/conductor/pi-conductor-session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,oCAAoC,CAAC;AAEhF,yEAAyE;AACzE,eAAO,MAAM,eAAe,0BAA0B,CAAC;AAEvD;;;;GAIG;AACH,qBAAa,kBAAkB;IAK3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,OAAO,CAAC,iBAAiB,CAAiB;IAC1C,OAAO,CAAC,UAAU,CAAoC;IAEtD,OAAO;WAOM,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;WAMnE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAiBhF,IAAI,QAAQ,IAAI,SAAS,YAAY,EAAE,CAEtC;IAED,0EAA0E;IACpE,iBAAiB,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAgB1E"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { JsonlSessionRepo, NodeExecutionEnv } from '@earendil-works/pi-agent-core/node';
|
|
2
|
+
/** Project-local Pi transcript storage used by the conductor backend. */
|
|
3
|
+
export const PI_SESSION_ROOT = '.ensemble/pi/sessions';
|
|
4
|
+
/**
|
|
5
|
+
* The Pi Agent Core `Agent` keeps its transcript in memory. This small adapter
|
|
6
|
+
* persists the same messages through Pi's JSONL session API so a new process
|
|
7
|
+
* can rebuild `Agent.state.messages` for `--resume`.
|
|
8
|
+
*/
|
|
9
|
+
export class PiConductorSession {
|
|
10
|
+
session;
|
|
11
|
+
persistedMessages;
|
|
12
|
+
writeQueue = Promise.resolve();
|
|
13
|
+
constructor(session, messages) {
|
|
14
|
+
this.session = session;
|
|
15
|
+
this.persistedMessages = [...messages];
|
|
16
|
+
}
|
|
17
|
+
static async create(cwd, sessionId) {
|
|
18
|
+
const repo = createSessionRepo(cwd);
|
|
19
|
+
const session = await repo.create({ cwd, id: sessionId });
|
|
20
|
+
return new PiConductorSession(session, []);
|
|
21
|
+
}
|
|
22
|
+
static async resume(cwd, sessionId) {
|
|
23
|
+
const repo = createSessionRepo(cwd);
|
|
24
|
+
const metadata = (await repo.list({ cwd })).find((candidate) => candidate.id === sessionId);
|
|
25
|
+
if (!metadata) {
|
|
26
|
+
throw new Error(`Pi session not found for resume (sessionId=${sessionId}, cwd=${cwd}, ` +
|
|
27
|
+
`sessionsRoot=${PI_SESSION_ROOT})`);
|
|
28
|
+
}
|
|
29
|
+
const session = await repo.open(metadata);
|
|
30
|
+
const context = await session.buildContext();
|
|
31
|
+
return new PiConductorSession(session, context.messages);
|
|
32
|
+
}
|
|
33
|
+
get messages() {
|
|
34
|
+
return this.persistedMessages;
|
|
35
|
+
}
|
|
36
|
+
/** Append only the suffix not already written to the JSONL transcript. */
|
|
37
|
+
async appendNewMessages(messages) {
|
|
38
|
+
const write = this.writeQueue.then(async () => {
|
|
39
|
+
const newMessages = messages.slice(this.persistedMessages.length);
|
|
40
|
+
for (const message of newMessages) {
|
|
41
|
+
await this.session.appendMessage(message);
|
|
42
|
+
}
|
|
43
|
+
if (newMessages.length > 0) {
|
|
44
|
+
this.persistedMessages = [
|
|
45
|
+
...this.persistedMessages,
|
|
46
|
+
...newMessages,
|
|
47
|
+
];
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
this.writeQueue = write.catch(() => { });
|
|
51
|
+
await write;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function createSessionRepo(cwd) {
|
|
55
|
+
return new JsonlSessionRepo({
|
|
56
|
+
fs: new NodeExecutionEnv({ cwd }),
|
|
57
|
+
sessionsRoot: PI_SESSION_ROOT,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=pi-conductor-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-conductor-session.js","sourceRoot":"","sources":["../../src/conductor/pi-conductor-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAGxF,yEAAyE;AACzE,MAAM,CAAC,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAEvD;;;;GAIG;AACH,MAAM,OAAO,kBAAkB;IAKV;IAJX,iBAAiB,CAAiB;IAClC,UAAU,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEtD,YACmB,OAAgB,EACjC,QAAwB;QADP,YAAO,GAAP,OAAO,CAAS;QAGjC,IAAI,CAAC,iBAAiB,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,SAAiB;QAChD,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1D,OAAO,IAAI,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,SAAiB;QAChD,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAC9C,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,SAAS,CAC1C,CAAC;QACF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,8CAA8C,SAAS,SAAS,GAAG,IAAI;gBACrE,gBAAgB,eAAe,GAAG,CACrC,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;QAC7C,OAAO,IAAI,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,0EAA0E;IAC1E,KAAK,CAAC,iBAAiB,CAAC,QAAiC;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAC5C,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAClE,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;gBAClC,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC5C,CAAC;YACD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC,iBAAiB,GAAG;oBACvB,GAAG,IAAI,CAAC,iBAAiB;oBACzB,GAAG,WAAW;iBACf,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACxC,MAAM,KAAK,CAAC;IACd,CAAC;CACF;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,OAAO,IAAI,gBAAgB,CAAC;QAC1B,EAAE,EAAE,IAAI,gBAAgB,CAAC,EAAE,GAAG,EAAE,CAAC;QACjC,YAAY,EAAE,eAAe;KAC9B,CAAC,CAAC;AACL,CAAC"}
|