@projectarachne/core 0.1.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/execution/runWorkflow.d.ts +28 -0
- package/dist/execution/runWorkflow.d.ts.map +1 -0
- package/dist/execution/runWorkflow.js +350 -0
- package/dist/execution/runWorkflow.js.map +1 -0
- package/dist/executors/terminalExecutor.d.ts +82 -0
- package/dist/executors/terminalExecutor.d.ts.map +1 -0
- package/dist/executors/terminalExecutor.js +331 -0
- package/dist/executors/terminalExecutor.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/index.d.ts +3 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +3 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/workflow-yaml.d.ts +839 -0
- package/dist/schemas/workflow-yaml.d.ts.map +1 -0
- package/dist/schemas/workflow-yaml.js +60 -0
- package/dist/schemas/workflow-yaml.js.map +1 -0
- package/dist/schemas/workflow.d.ts +698 -0
- package/dist/schemas/workflow.d.ts.map +1 -0
- package/dist/schemas/workflow.js +85 -0
- package/dist/schemas/workflow.js.map +1 -0
- package/dist/storage/sqlite.d.ts +65 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +177 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/yaml/index.d.ts +3 -0
- package/dist/yaml/index.d.ts.map +1 -0
- package/dist/yaml/index.js +2 -0
- package/dist/yaml/index.js.map +1 -0
- package/dist/yaml/parseWorkflowYaml.d.ts +6 -0
- package/dist/yaml/parseWorkflowYaml.d.ts.map +1 -0
- package/dist/yaml/parseWorkflowYaml.js +41 -0
- package/dist/yaml/parseWorkflowYaml.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
// packages/core/src/executors/terminalExecutor.ts
|
|
2
|
+
// Purpose: Execute prompts via terminal-based agents (codex, claude) in headless mode.
|
|
3
|
+
// This replaces API-based execution with local subprocess execution.
|
|
4
|
+
import { execSync } from 'child_process';
|
|
5
|
+
import { tmpdir } from 'os';
|
|
6
|
+
import { writeFileSync, unlinkSync } from 'fs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
const DEFAULT_TIMEOUT_MS = 120000; // 2 minutes
|
|
9
|
+
/**
|
|
10
|
+
* Model name mappings - short names to actual model identifiers
|
|
11
|
+
*/
|
|
12
|
+
const CLAUDE_MODELS = {
|
|
13
|
+
haiku: 'claude-3-5-haiku-latest',
|
|
14
|
+
sonnet: 'claude-sonnet-4-20250514',
|
|
15
|
+
opus: 'claude-opus-4-5',
|
|
16
|
+
};
|
|
17
|
+
const OPENAI_MODELS = {
|
|
18
|
+
'gpt-4.1': 'gpt-4.1',
|
|
19
|
+
'gpt-4.1-mini': 'gpt-4.1-mini',
|
|
20
|
+
'gpt-4.1-nano': 'gpt-4.1-nano',
|
|
21
|
+
'gpt-4o': 'gpt-4o',
|
|
22
|
+
'gpt-4o-mini': 'gpt-4o-mini',
|
|
23
|
+
'o3': 'o3',
|
|
24
|
+
'o3-mini': 'o3-mini',
|
|
25
|
+
'o1': 'o1',
|
|
26
|
+
'o1-mini': 'o1-mini',
|
|
27
|
+
'o1-pro': 'o1-pro',
|
|
28
|
+
};
|
|
29
|
+
const CODEX_REASONING_EFFORTS = {
|
|
30
|
+
'gpt-5.2-codex': 'xhigh',
|
|
31
|
+
'gpt-5.1-codex-max': 'xhigh',
|
|
32
|
+
'gpt-5.2': 'xhigh',
|
|
33
|
+
'gpt-5.1-codex-mini': 'high',
|
|
34
|
+
'gpt-5.1': 'high',
|
|
35
|
+
'gpt-5.1-codex': 'high',
|
|
36
|
+
'gpt-5-codex': 'high',
|
|
37
|
+
'gpt-5-codex-mini': 'high',
|
|
38
|
+
'gpt-5': 'high',
|
|
39
|
+
};
|
|
40
|
+
function getCodexReasoningEffort(model) {
|
|
41
|
+
if (!model)
|
|
42
|
+
return null;
|
|
43
|
+
return CODEX_REASONING_EFFORTS[model] ?? null;
|
|
44
|
+
}
|
|
45
|
+
const GEMINI_MODELS = {
|
|
46
|
+
'gemini-2.5-pro': 'gemini-2.5-pro',
|
|
47
|
+
'gemini-2.5-flash': 'gemini-2.5-flash',
|
|
48
|
+
'gemini-2.0-flash': 'gemini-2.0-flash',
|
|
49
|
+
'gemini-2.0-flash-lite': 'gemini-2.0-flash-lite',
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Agent configurations
|
|
53
|
+
* Each agent defines how to spawn the process and parse the output
|
|
54
|
+
*/
|
|
55
|
+
const AGENT_CONFIGS = {
|
|
56
|
+
claude: {
|
|
57
|
+
command: 'claude',
|
|
58
|
+
models: CLAUDE_MODELS,
|
|
59
|
+
defaultModel: 'sonnet',
|
|
60
|
+
// -p = print mode (non-interactive), --model for specific model
|
|
61
|
+
buildArgs: (opts) => {
|
|
62
|
+
const args = ['-p'];
|
|
63
|
+
if (opts.model) {
|
|
64
|
+
const fullModel = CLAUDE_MODELS[opts.model] || opts.model;
|
|
65
|
+
args.push('--model', fullModel);
|
|
66
|
+
}
|
|
67
|
+
return args;
|
|
68
|
+
},
|
|
69
|
+
parseOutput: (stdout) => stdout.trim(),
|
|
70
|
+
inputMethod: 'arg',
|
|
71
|
+
},
|
|
72
|
+
// "openai" uses the codex CLI tool
|
|
73
|
+
openai: {
|
|
74
|
+
command: 'codex',
|
|
75
|
+
models: OPENAI_MODELS,
|
|
76
|
+
defaultModel: 'gpt-4.1',
|
|
77
|
+
buildArgs: (opts) => {
|
|
78
|
+
const args = ['exec', '--skip-git-repo-check'];
|
|
79
|
+
const fullModel = opts.model ? (OPENAI_MODELS[opts.model] || opts.model) : null;
|
|
80
|
+
if (fullModel)
|
|
81
|
+
args.push('-m', fullModel);
|
|
82
|
+
const effort = getCodexReasoningEffort(fullModel ?? undefined);
|
|
83
|
+
if (effort)
|
|
84
|
+
args.push('-c', `model_reasoning_effort=${effort}`);
|
|
85
|
+
return args;
|
|
86
|
+
},
|
|
87
|
+
parseOutput: (stdout) => stdout.trim(),
|
|
88
|
+
inputMethod: 'stdin',
|
|
89
|
+
},
|
|
90
|
+
// Legacy alias for backwards compatibility
|
|
91
|
+
codex: {
|
|
92
|
+
command: 'codex',
|
|
93
|
+
models: OPENAI_MODELS,
|
|
94
|
+
defaultModel: 'gpt-4.1',
|
|
95
|
+
buildArgs: (opts) => {
|
|
96
|
+
const args = ['exec', '--skip-git-repo-check'];
|
|
97
|
+
const fullModel = opts.model ? (OPENAI_MODELS[opts.model] || opts.model) : null;
|
|
98
|
+
if (fullModel)
|
|
99
|
+
args.push('-m', fullModel);
|
|
100
|
+
const effort = getCodexReasoningEffort(fullModel ?? undefined);
|
|
101
|
+
if (effort)
|
|
102
|
+
args.push('-c', `model_reasoning_effort=${effort}`);
|
|
103
|
+
return args;
|
|
104
|
+
},
|
|
105
|
+
parseOutput: (stdout) => stdout.trim(),
|
|
106
|
+
inputMethod: 'stdin',
|
|
107
|
+
},
|
|
108
|
+
// Gemini CLI
|
|
109
|
+
gemini: {
|
|
110
|
+
command: 'gemini',
|
|
111
|
+
models: GEMINI_MODELS,
|
|
112
|
+
defaultModel: 'gemini-2.5-flash',
|
|
113
|
+
buildArgs: (opts) => {
|
|
114
|
+
const args = [];
|
|
115
|
+
if (opts.model) {
|
|
116
|
+
const fullModel = GEMINI_MODELS[opts.model] || opts.model;
|
|
117
|
+
args.push('--model', fullModel);
|
|
118
|
+
}
|
|
119
|
+
return args;
|
|
120
|
+
},
|
|
121
|
+
parseOutput: (stdout) => stdout.trim(),
|
|
122
|
+
inputMethod: 'arg',
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* Check which agents are available on this system
|
|
127
|
+
* @returns {string[]} Array of available agent names
|
|
128
|
+
*/
|
|
129
|
+
export function getAvailableAgents() {
|
|
130
|
+
const available = [];
|
|
131
|
+
for (const [name, config] of Object.entries(AGENT_CONFIGS)) {
|
|
132
|
+
try {
|
|
133
|
+
execSync(`which ${config.command}`, { stdio: 'ignore' });
|
|
134
|
+
available.push(name);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// Agent not installed
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return available;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Get the default agent (prefers claude, falls back to codex)
|
|
144
|
+
* @returns {string|null} Default agent name or null if none available
|
|
145
|
+
*/
|
|
146
|
+
export function getDefaultAgent() {
|
|
147
|
+
const available = getAvailableAgents();
|
|
148
|
+
if (available.includes('claude'))
|
|
149
|
+
return 'claude';
|
|
150
|
+
if (available.includes('codex'))
|
|
151
|
+
return 'codex';
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Execute a prompt using a terminal-based agent
|
|
156
|
+
*
|
|
157
|
+
* Uses synchronous execution for reliability - async spawn has issues with
|
|
158
|
+
* certain terminal agents that expect TTY behavior.
|
|
159
|
+
*/
|
|
160
|
+
export async function executePrompt({ prompt, agent = 'claude', model, timeout = DEFAULT_TIMEOUT_MS, workdir, onChunk, }) {
|
|
161
|
+
const config = AGENT_CONFIGS[agent];
|
|
162
|
+
if (!config) {
|
|
163
|
+
throw new Error(`Unknown agent: ${agent}. Available: ${Object.keys(AGENT_CONFIGS).join(', ')}`);
|
|
164
|
+
}
|
|
165
|
+
// Check if agent is available
|
|
166
|
+
try {
|
|
167
|
+
execSync(`which ${config.command}`, { stdio: 'ignore' });
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
throw new Error(`Agent "${agent}" is not installed. Please install ${config.command} first.`);
|
|
171
|
+
}
|
|
172
|
+
const args = config.buildArgs({ model });
|
|
173
|
+
// Build the command
|
|
174
|
+
let command;
|
|
175
|
+
const execOptions = {
|
|
176
|
+
timeout,
|
|
177
|
+
encoding: 'utf-8',
|
|
178
|
+
// Run from /tmp to avoid picking up project-specific .claude/CLAUDE.md files
|
|
179
|
+
// that can interfere with prompt execution
|
|
180
|
+
cwd: '/tmp',
|
|
181
|
+
env: { ...process.env },
|
|
182
|
+
maxBuffer: 10 * 1024 * 1024, // 10MB buffer for large outputs
|
|
183
|
+
};
|
|
184
|
+
if (config.inputMethod === 'arg') {
|
|
185
|
+
// Claude: prompt passed as argument
|
|
186
|
+
// Escape the prompt for shell safety
|
|
187
|
+
const escapedPrompt = prompt.replace(/'/g, "'\\''");
|
|
188
|
+
command = `${config.command} ${args.join(' ')} '${escapedPrompt}'`;
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
// Codex: prompt piped to stdin
|
|
192
|
+
// Write prompt to temp file and pipe it
|
|
193
|
+
const tempFile = join(tmpdir(), `arachne-prompt-${Date.now()}.txt`);
|
|
194
|
+
writeFileSync(tempFile, prompt, 'utf-8');
|
|
195
|
+
command = `cat '${tempFile}' | ${config.command} ${args.join(' ')}`;
|
|
196
|
+
// Clean up temp file after execution (in finally block)
|
|
197
|
+
execOptions._tempFile = tempFile;
|
|
198
|
+
}
|
|
199
|
+
return new Promise((resolve, reject) => {
|
|
200
|
+
try {
|
|
201
|
+
const stdout = execSync(command, execOptions);
|
|
202
|
+
// Clean up temp file if used
|
|
203
|
+
if (execOptions._tempFile) {
|
|
204
|
+
try {
|
|
205
|
+
unlinkSync(execOptions._tempFile);
|
|
206
|
+
}
|
|
207
|
+
catch { }
|
|
208
|
+
}
|
|
209
|
+
// Parse the output based on agent type
|
|
210
|
+
let output;
|
|
211
|
+
try {
|
|
212
|
+
output = config.parseOutput(stdout);
|
|
213
|
+
}
|
|
214
|
+
catch (parseErr) {
|
|
215
|
+
const message = parseErr instanceof Error ? parseErr.message : String(parseErr);
|
|
216
|
+
reject(new Error(`Failed to parse ${agent} output: ${message}`));
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
// Emit the full output as a single chunk for streaming callbacks
|
|
220
|
+
if (typeof onChunk === 'function') {
|
|
221
|
+
onChunk(output);
|
|
222
|
+
}
|
|
223
|
+
resolve({
|
|
224
|
+
ok: true,
|
|
225
|
+
output,
|
|
226
|
+
agent,
|
|
227
|
+
exitCode: 0,
|
|
228
|
+
stderr: '',
|
|
229
|
+
rawOutput: stdout,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
// Clean up temp file if used
|
|
234
|
+
if (execOptions._tempFile) {
|
|
235
|
+
try {
|
|
236
|
+
unlinkSync(execOptions._tempFile);
|
|
237
|
+
}
|
|
238
|
+
catch { }
|
|
239
|
+
}
|
|
240
|
+
const error = err;
|
|
241
|
+
if (error?.killed) {
|
|
242
|
+
reject(new Error(`Agent "${agent}" timed out after ${timeout}ms`));
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
const stderr = error?.stderr ? error.stderr.toString() : '';
|
|
246
|
+
const message = error?.message ?? 'Unknown error';
|
|
247
|
+
reject(new Error(`Agent "${agent}" failed: ${message}${stderr ? ` - ${stderr}` : ''}`));
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Format messages array into a single prompt string
|
|
254
|
+
* Used when converting from chat format to single prompt
|
|
255
|
+
*/
|
|
256
|
+
export function formatMessagesAsPrompt(messages, { system } = {}) {
|
|
257
|
+
let prompt = '';
|
|
258
|
+
if (system) {
|
|
259
|
+
prompt += `${system}\n\n`;
|
|
260
|
+
}
|
|
261
|
+
if (typeof messages === 'string') {
|
|
262
|
+
prompt += messages;
|
|
263
|
+
}
|
|
264
|
+
else if (Array.isArray(messages)) {
|
|
265
|
+
for (const msg of messages) {
|
|
266
|
+
if (msg.role === 'system') {
|
|
267
|
+
prompt = `${msg.content}\n\n${prompt}`;
|
|
268
|
+
}
|
|
269
|
+
else if (msg.role === 'user') {
|
|
270
|
+
prompt += `${msg.content}\n`;
|
|
271
|
+
}
|
|
272
|
+
else if (msg.role === 'assistant') {
|
|
273
|
+
prompt += `Assistant: ${msg.content}\n`;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return prompt.trim();
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Chat-complete compatible interface for terminal execution
|
|
281
|
+
* This matches the signature of modelRouter.chatComplete for easy integration
|
|
282
|
+
*/
|
|
283
|
+
export async function terminalChatComplete({ model, messages, system, temperature, // ignored for terminal execution
|
|
284
|
+
max_tokens, // ignored for terminal execution
|
|
285
|
+
stream = false, // TODO: implement streaming
|
|
286
|
+
providerOptions = {}, }) {
|
|
287
|
+
// Determine agent from model string
|
|
288
|
+
// Format: "terminal:agent" or just "agent" (defaults to claude)
|
|
289
|
+
let agent = 'claude';
|
|
290
|
+
let agentModel = null;
|
|
291
|
+
if (model) {
|
|
292
|
+
if (model.startsWith('terminal:')) {
|
|
293
|
+
agent = model.slice('terminal:'.length);
|
|
294
|
+
}
|
|
295
|
+
else if (model === 'codex' || model === 'claude') {
|
|
296
|
+
agent = model;
|
|
297
|
+
}
|
|
298
|
+
else if (model.includes(':')) {
|
|
299
|
+
// Could be "claude:sonnet" or similar
|
|
300
|
+
const [agentPart, modelPart] = model.split(':');
|
|
301
|
+
if (AGENT_CONFIGS[agentPart]) {
|
|
302
|
+
agent = agentPart;
|
|
303
|
+
agentModel = modelPart;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
const prompt = formatMessagesAsPrompt(messages, { system });
|
|
308
|
+
const result = await executePrompt({
|
|
309
|
+
prompt,
|
|
310
|
+
agent,
|
|
311
|
+
model: agentModel,
|
|
312
|
+
timeout: providerOptions.timeout || DEFAULT_TIMEOUT_MS,
|
|
313
|
+
workdir: providerOptions.workdir,
|
|
314
|
+
});
|
|
315
|
+
return {
|
|
316
|
+
ok: true,
|
|
317
|
+
provider: 'terminal',
|
|
318
|
+
model: agent,
|
|
319
|
+
output: result.output,
|
|
320
|
+
usage: null, // Terminal doesn't provide token usage
|
|
321
|
+
raw: result,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
export default {
|
|
325
|
+
executePrompt,
|
|
326
|
+
terminalChatComplete,
|
|
327
|
+
getAvailableAgents,
|
|
328
|
+
getDefaultAgent,
|
|
329
|
+
formatMessagesAsPrompt,
|
|
330
|
+
};
|
|
331
|
+
//# sourceMappingURL=terminalExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminalExecutor.js","sourceRoot":"","sources":["../../src/executors/terminalExecutor.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const CORE_PLACEHOLDER = "@projectarachne/core";
|
|
2
|
+
export declare function getCorePlaceholder(): string;
|
|
3
|
+
export { executePrompt, terminalChatComplete, getAvailableAgents, getDefaultAgent, formatMessagesAsPrompt, } from './executors/terminalExecutor.js';
|
|
4
|
+
export { ChainConfigSchema, OutputConfigSchema, LoopConfigSchema, StepSchema, EdgeSchema, WorkflowRunSchema, InterpolatedStringSchema, WorkflowYamlVariableValueSchema, WorkflowYamlStepSchema, WorkflowYamlSchema, } from './schemas/index.js';
|
|
5
|
+
export { loadWorkflowYaml, parseWorkflowYaml } from './yaml/index.js';
|
|
6
|
+
export type { WorkflowYaml } from './yaml/index.js';
|
|
7
|
+
export { runWorkflow } from './execution/runWorkflow.js';
|
|
8
|
+
export { SqliteStorage, createSqliteStorage, resolveDefaultSqlitePath, DEFAULT_SQLITE_FILENAME, } from './storage/sqlite.js';
|
|
9
|
+
export type { RunStatus, StepStatus, RunRecord, StepRecord, TemplateRecord, CreateRunInput, CompleteRunInput, SaveTemplateInput, } from './storage/sqlite.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,yBAAyB,CAAC;AAEvD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,sBAAsB,GACvB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,wBAAwB,EACxB,+BAA+B,EAC/B,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,SAAS,EACT,UAAU,EACV,SAAS,EACT,UAAU,EACV,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const CORE_PLACEHOLDER = "@projectarachne/core";
|
|
2
|
+
export function getCorePlaceholder() {
|
|
3
|
+
return CORE_PLACEHOLDER;
|
|
4
|
+
}
|
|
5
|
+
export { executePrompt, terminalChatComplete, getAvailableAgents, getDefaultAgent, formatMessagesAsPrompt, } from './executors/terminalExecutor.js';
|
|
6
|
+
export { ChainConfigSchema, OutputConfigSchema, LoopConfigSchema, StepSchema, EdgeSchema, WorkflowRunSchema, InterpolatedStringSchema, WorkflowYamlVariableValueSchema, WorkflowYamlStepSchema, WorkflowYamlSchema, } from './schemas/index.js';
|
|
7
|
+
export { loadWorkflowYaml, parseWorkflowYaml } from './yaml/index.js';
|
|
8
|
+
export { runWorkflow } from './execution/runWorkflow.js';
|
|
9
|
+
export { SqliteStorage, createSqliteStorage, resolveDefaultSqlitePath, DEFAULT_SQLITE_FILENAME, } from './storage/sqlite.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,sBAAsB,CAAC;AAEvD,MAAM,UAAU,kBAAkB;IAChC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,sBAAsB,GACvB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,wBAAwB,EACxB,+BAA+B,EAC/B,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { ChainConfigSchema, OutputConfigSchema, LoopConfigSchema, StepSchema, EdgeSchema, WorkflowRunSchema, } from './workflow.js';
|
|
2
|
+
export { InterpolatedStringSchema, WorkflowYamlVariableValueSchema, WorkflowYamlStepSchema, WorkflowYamlSchema, } from './workflow-yaml.js';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,wBAAwB,EACxB,+BAA+B,EAC/B,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { ChainConfigSchema, OutputConfigSchema, LoopConfigSchema, StepSchema, EdgeSchema, WorkflowRunSchema, } from './workflow.js';
|
|
2
|
+
export { InterpolatedStringSchema, WorkflowYamlVariableValueSchema, WorkflowYamlStepSchema, WorkflowYamlSchema, } from './workflow-yaml.js';
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,wBAAwB,EACxB,+BAA+B,EAC/B,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC"}
|