@relayflows/core 0.0.1 → 1.0.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/agent-handle.d.ts +27 -0
- package/dist/agent-handle.d.ts.map +1 -0
- package/dist/agent-handle.js +32 -0
- package/dist/agent-handle.js.map +1 -0
- package/dist/api-executor.d.ts +16 -0
- package/dist/api-executor.d.ts.map +1 -0
- package/dist/api-executor.js +94 -0
- package/dist/api-executor.js.map +1 -0
- package/dist/barrier.d.ts +72 -0
- package/dist/barrier.d.ts.map +1 -0
- package/dist/barrier.js +162 -0
- package/dist/barrier.js.map +1 -0
- package/dist/budget-tracker.d.ts +75 -0
- package/dist/budget-tracker.d.ts.map +1 -0
- package/dist/budget-tracker.js +184 -0
- package/dist/budget-tracker.js.map +1 -0
- package/dist/builder.d.ts +229 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +430 -0
- package/dist/builder.js.map +1 -0
- package/dist/builtin-templates/bug-fix.yaml +139 -0
- package/dist/builtin-templates/code-review.yaml +137 -0
- package/dist/builtin-templates/competitive.yaml +107 -0
- package/dist/builtin-templates/documentation.yaml +128 -0
- package/dist/builtin-templates/feature-dev.yaml +146 -0
- package/dist/builtin-templates/refactor.yaml +145 -0
- package/dist/builtin-templates/review-loop.yaml +227 -0
- package/dist/builtin-templates/security-audit.yaml +139 -0
- package/dist/channel-messenger.d.ts +28 -0
- package/dist/channel-messenger.d.ts.map +1 -0
- package/dist/channel-messenger.js +275 -0
- package/dist/channel-messenger.js.map +1 -0
- package/dist/cli-registry.d.ts +77 -0
- package/dist/cli-registry.d.ts.map +1 -0
- package/dist/cli-registry.js +268 -0
- package/dist/cli-registry.js.map +1 -0
- package/dist/cli-session-collector.d.ts +39 -0
- package/dist/cli-session-collector.d.ts.map +1 -0
- package/dist/cli-session-collector.js +23 -0
- package/dist/cli-session-collector.js.map +1 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +395 -0
- package/dist/cli.js.map +1 -0
- package/dist/cloud-runner.d.ts +15 -0
- package/dist/cloud-runner.d.ts.map +1 -0
- package/dist/cloud-runner.js +41 -0
- package/dist/cloud-runner.js.map +1 -0
- package/dist/cloud-schedules.d.ts +3 -0
- package/dist/cloud-schedules.d.ts.map +1 -0
- package/dist/cloud-schedules.js +2 -0
- package/dist/cloud-schedules.js.map +1 -0
- package/dist/collectors/claude.d.ts +6 -0
- package/dist/collectors/claude.d.ts.map +1 -0
- package/dist/collectors/claude.js +330 -0
- package/dist/collectors/claude.js.map +1 -0
- package/dist/collectors/codex.d.ts +18 -0
- package/dist/collectors/codex.d.ts.map +1 -0
- package/dist/collectors/codex.js +265 -0
- package/dist/collectors/codex.js.map +1 -0
- package/dist/collectors/opencode.d.ts +6 -0
- package/dist/collectors/opencode.d.ts.map +1 -0
- package/dist/collectors/opencode.js +204 -0
- package/dist/collectors/opencode.js.map +1 -0
- package/dist/coordinator.d.ts +73 -0
- package/dist/coordinator.d.ts.map +1 -0
- package/dist/coordinator.js +647 -0
- package/dist/coordinator.js.map +1 -0
- package/dist/custom-steps.d.ts +73 -0
- package/dist/custom-steps.d.ts.map +1 -0
- package/dist/custom-steps.js +321 -0
- package/dist/custom-steps.js.map +1 -0
- package/dist/default-logger.d.ts +9 -0
- package/dist/default-logger.d.ts.map +1 -0
- package/dist/default-logger.js +104 -0
- package/dist/default-logger.js.map +1 -0
- package/dist/dry-run-format.d.ts +6 -0
- package/dist/dry-run-format.d.ts.map +1 -0
- package/dist/dry-run-format.js +76 -0
- package/dist/dry-run-format.js.map +1 -0
- package/dist/file-db.d.ts +85 -0
- package/dist/file-db.d.ts.map +1 -0
- package/dist/file-db.js +215 -0
- package/dist/file-db.js.map +1 -0
- package/dist/index.d.ts +37 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -3
- package/dist/index.js.map +1 -0
- package/dist/integrations/browser.d.ts +99 -0
- package/dist/integrations/browser.d.ts.map +1 -0
- package/dist/integrations/browser.js +419 -0
- package/dist/integrations/browser.js.map +1 -0
- package/dist/integrations/github.d.ts +79 -0
- package/dist/integrations/github.d.ts.map +1 -0
- package/dist/integrations/github.js +459 -0
- package/dist/integrations/github.js.map +1 -0
- package/dist/integrations/slack.d.ts +80 -0
- package/dist/integrations/slack.d.ts.map +1 -0
- package/dist/integrations/slack.js +355 -0
- package/dist/integrations/slack.js.map +1 -0
- package/dist/listr-renderer.d.ts +26 -0
- package/dist/listr-renderer.d.ts.map +1 -0
- package/dist/listr-renderer.js +230 -0
- package/dist/listr-renderer.js.map +1 -0
- package/dist/memory-db.d.ts +17 -0
- package/dist/memory-db.d.ts.map +1 -0
- package/dist/memory-db.js +33 -0
- package/dist/memory-db.js.map +1 -0
- package/dist/process-backend-executor.d.ts +18 -0
- package/dist/process-backend-executor.d.ts.map +1 -0
- package/dist/process-backend-executor.js +74 -0
- package/dist/process-backend-executor.js.map +1 -0
- package/dist/process-spawner.d.ts +35 -0
- package/dist/process-spawner.d.ts.map +1 -0
- package/dist/process-spawner.js +173 -0
- package/dist/process-spawner.js.map +1 -0
- package/dist/provisioner.d.ts +64 -0
- package/dist/provisioner.d.ts.map +1 -0
- package/dist/provisioner.js +269 -0
- package/dist/provisioner.js.map +1 -0
- package/dist/proxy-env.d.ts +52 -0
- package/dist/proxy-env.d.ts.map +1 -0
- package/dist/proxy-env.js +92 -0
- package/dist/proxy-env.js.map +1 -0
- package/dist/run-script.d.ts +82 -0
- package/dist/run-script.d.ts.map +1 -0
- package/dist/run-script.js +527 -0
- package/dist/run-script.js.map +1 -0
- package/dist/run-summary-table.d.ts +5 -0
- package/dist/run-summary-table.d.ts.map +1 -0
- package/dist/run-summary-table.js +132 -0
- package/dist/run-summary-table.js.map +1 -0
- package/dist/run.d.ts +45 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +37 -0
- package/dist/run.js.map +1 -0
- package/dist/runner.d.ts +528 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +6269 -0
- package/dist/runner.js.map +1 -0
- package/dist/schema.d.ts +275 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +27 -0
- package/dist/schema.js.map +1 -0
- package/dist/schema.json +940 -0
- package/dist/sibling-links.d.ts +100 -0
- package/dist/sibling-links.d.ts.map +1 -0
- package/dist/sibling-links.js +205 -0
- package/dist/sibling-links.js.map +1 -0
- package/dist/state.d.ts +77 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +140 -0
- package/dist/state.js.map +1 -0
- package/dist/step-executor.d.ts +95 -0
- package/dist/step-executor.d.ts.map +1 -0
- package/dist/step-executor.js +393 -0
- package/dist/step-executor.js.map +1 -0
- package/dist/template-resolver.d.ts +33 -0
- package/dist/template-resolver.d.ts.map +1 -0
- package/dist/template-resolver.js +144 -0
- package/dist/template-resolver.js.map +1 -0
- package/dist/templates.d.ts +47 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +405 -0
- package/dist/templates.js.map +1 -0
- package/dist/trajectory.d.ts +87 -0
- package/dist/trajectory.d.ts.map +1 -0
- package/dist/trajectory.js +412 -0
- package/dist/trajectory.js.map +1 -0
- package/dist/types.d.ts +471 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +37 -0
- package/dist/types.js.map +1 -0
- package/dist/validator.d.ts +11 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +186 -0
- package/dist/validator.js.map +1 -0
- package/dist/verification.d.ts +53 -0
- package/dist/verification.d.ts.map +1 -0
- package/dist/verification.js +238 -0
- package/dist/verification.js.map +1 -0
- package/package.json +12 -8
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin adapter over the harness-driver's `SpawnedAgentHandle`.
|
|
3
|
+
*
|
|
4
|
+
* The driver (`@agent-relay/harness-driver` ≥ 8.2) owns the real lifecycle
|
|
5
|
+
* logic — event subscription, replay-correct exit/idle resolution, exit
|
|
6
|
+
* code/signal capture. This wrapper only maps its structured results
|
|
7
|
+
* (`{ reason, code, signal }` / `{ reason, idleSecs }`) back to the simple
|
|
8
|
+
* string contract the workflow runner has always used (`'exited'` / `'timeout'`
|
|
9
|
+
* / `'idle'`), so `runner.ts` keeps consuming handles unchanged.
|
|
10
|
+
*/
|
|
11
|
+
import type { SpawnedAgentHandle } from '@agent-relay/harness-driver';
|
|
12
|
+
export declare class WorkflowAgentHandle {
|
|
13
|
+
private readonly inner;
|
|
14
|
+
constructor(inner: SpawnedAgentHandle);
|
|
15
|
+
get name(): string;
|
|
16
|
+
get runtime(): SpawnedAgentHandle['runtime'];
|
|
17
|
+
get exitCode(): number | undefined;
|
|
18
|
+
get exitSignal(): string | undefined;
|
|
19
|
+
/** Resolves `'exited'` when the agent exits, or `'timeout'` after `timeoutMs`. */
|
|
20
|
+
waitForExit(timeoutMs?: number): Promise<'exited' | 'timeout'>;
|
|
21
|
+
/** Resolves `'idle'` on the next idle signal, `'exited'` if it exits first, or `'timeout'`. */
|
|
22
|
+
waitForIdle(timeoutMs?: number): Promise<'idle' | 'exited' | 'timeout'>;
|
|
23
|
+
release(reason?: string): Promise<{
|
|
24
|
+
name: string;
|
|
25
|
+
}>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=agent-handle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-handle.d.ts","sourceRoot":"","sources":["../src/agent-handle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,kBAAkB;IAEtD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,OAAO,IAAI,kBAAkB,CAAC,SAAS,CAAC,CAE3C;IAED,IAAI,QAAQ,IAAI,MAAM,GAAG,SAAS,CAEjC;IAED,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAEnC;IAED,kFAAkF;IAC5E,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAKpE,+FAA+F;IACzF,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IAK7E,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAGpD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export class WorkflowAgentHandle {
|
|
2
|
+
inner;
|
|
3
|
+
constructor(inner) {
|
|
4
|
+
this.inner = inner;
|
|
5
|
+
}
|
|
6
|
+
get name() {
|
|
7
|
+
return this.inner.name;
|
|
8
|
+
}
|
|
9
|
+
get runtime() {
|
|
10
|
+
return this.inner.runtime;
|
|
11
|
+
}
|
|
12
|
+
get exitCode() {
|
|
13
|
+
return this.inner.exitCode;
|
|
14
|
+
}
|
|
15
|
+
get exitSignal() {
|
|
16
|
+
return this.inner.exitSignal;
|
|
17
|
+
}
|
|
18
|
+
/** Resolves `'exited'` when the agent exits, or `'timeout'` after `timeoutMs`. */
|
|
19
|
+
async waitForExit(timeoutMs) {
|
|
20
|
+
const { reason } = await this.inner.waitForExit(timeoutMs);
|
|
21
|
+
return reason;
|
|
22
|
+
}
|
|
23
|
+
/** Resolves `'idle'` on the next idle signal, `'exited'` if it exits first, or `'timeout'`. */
|
|
24
|
+
async waitForIdle(timeoutMs) {
|
|
25
|
+
const { reason } = await this.inner.waitForIdle(timeoutMs);
|
|
26
|
+
return reason;
|
|
27
|
+
}
|
|
28
|
+
release(reason) {
|
|
29
|
+
return this.inner.release(reason);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=agent-handle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-handle.js","sourceRoot":"","sources":["../src/agent-handle.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,mBAAmB;IACD;IAA7B,YAA6B,KAAyB;QAAzB,UAAK,GAAL,KAAK,CAAoB;IAAG,CAAC;IAE1D,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;IAC5B,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC7B,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;IAC/B,CAAC;IAED,kFAAkF;IAClF,KAAK,CAAC,WAAW,CAAC,SAAkB;QAClC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC3D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,+FAA+F;IAC/F,KAAK,CAAC,WAAW,CAAC,SAAkB;QAClC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC3D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,MAAe;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Executor — calls LLM provider APIs directly via fetch().
|
|
3
|
+
* Used when agent cli is 'api'. No sandbox, no CLI, no PTY.
|
|
4
|
+
*/
|
|
5
|
+
type Provider = 'anthropic' | 'openai' | 'google';
|
|
6
|
+
declare function detectProvider(model: string): Provider;
|
|
7
|
+
declare function getApiKey(provider: Provider, envSecrets?: Record<string, string>): string;
|
|
8
|
+
export interface ApiExecutorOptions {
|
|
9
|
+
envSecrets?: Record<string, string>;
|
|
10
|
+
defaultModel?: string;
|
|
11
|
+
defaultMaxTokens?: number;
|
|
12
|
+
skills?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function executeApiStep(model: string, task: string, options?: ApiExecutorOptions): Promise<string>;
|
|
15
|
+
export { detectProvider, getApiKey };
|
|
16
|
+
//# sourceMappingURL=api-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-executor.d.ts","sourceRoot":"","sources":["../src/api-executor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,KAAK,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAElD,iBAAS,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAK/C;AAED,iBAAS,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAWlF;AAkED,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAOnH;AAED,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Executor — calls LLM provider APIs directly via fetch().
|
|
3
|
+
* Used when agent cli is 'api'. No sandbox, no CLI, no PTY.
|
|
4
|
+
*/
|
|
5
|
+
function detectProvider(model) {
|
|
6
|
+
if (model.startsWith('claude'))
|
|
7
|
+
return 'anthropic';
|
|
8
|
+
if (model.startsWith('gpt') || model.startsWith('o1') || model.startsWith('o3') || model.startsWith('o4'))
|
|
9
|
+
return 'openai';
|
|
10
|
+
if (model.startsWith('gemini'))
|
|
11
|
+
return 'google';
|
|
12
|
+
return 'anthropic';
|
|
13
|
+
}
|
|
14
|
+
function getApiKey(provider, envSecrets) {
|
|
15
|
+
const envMap = {
|
|
16
|
+
anthropic: ['ANTHROPIC_API_KEY'],
|
|
17
|
+
openai: ['OPENAI_API_KEY'],
|
|
18
|
+
google: ['GOOGLE_API_KEY', 'GEMINI_API_KEY'],
|
|
19
|
+
};
|
|
20
|
+
for (const key of envMap[provider]) {
|
|
21
|
+
const value = envSecrets?.[key] ?? process.env[key];
|
|
22
|
+
if (value)
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
throw new Error(`No API key for "${provider}". Set ${envMap[provider].join(' or ')}.`);
|
|
26
|
+
}
|
|
27
|
+
async function callAnthropic(apiKey, model, task, maxTokens, systemPrompt) {
|
|
28
|
+
const res = await fetch('https://api.anthropic.com/v1/messages', {
|
|
29
|
+
method: 'POST',
|
|
30
|
+
headers: { 'content-type': 'application/json', 'x-api-key': apiKey, 'anthropic-version': '2023-06-01' },
|
|
31
|
+
body: JSON.stringify({
|
|
32
|
+
model, max_tokens: maxTokens,
|
|
33
|
+
...(systemPrompt ? { system: systemPrompt } : {}),
|
|
34
|
+
messages: [{ role: 'user', content: task }],
|
|
35
|
+
}),
|
|
36
|
+
});
|
|
37
|
+
if (!res.ok)
|
|
38
|
+
throw new Error(`Anthropic API error (${res.status}): ${await res.text()}`);
|
|
39
|
+
const data = await res.json();
|
|
40
|
+
return {
|
|
41
|
+
content: data.content.filter(c => c.type === 'text').map(c => c.text ?? '').join(''),
|
|
42
|
+
model: data.model,
|
|
43
|
+
usage: data.usage ? { inputTokens: data.usage.input_tokens, outputTokens: data.usage.output_tokens } : undefined,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
async function callOpenAI(apiKey, model, task, maxTokens, systemPrompt) {
|
|
47
|
+
const messages = [];
|
|
48
|
+
if (systemPrompt)
|
|
49
|
+
messages.push({ role: 'system', content: systemPrompt });
|
|
50
|
+
messages.push({ role: 'user', content: task });
|
|
51
|
+
const res = await fetch('https://api.openai.com/v1/chat/completions', {
|
|
52
|
+
method: 'POST',
|
|
53
|
+
headers: { 'content-type': 'application/json', 'authorization': `Bearer ${apiKey}` },
|
|
54
|
+
body: JSON.stringify({ model, max_tokens: maxTokens, messages }),
|
|
55
|
+
});
|
|
56
|
+
if (!res.ok)
|
|
57
|
+
throw new Error(`OpenAI API error (${res.status}): ${await res.text()}`);
|
|
58
|
+
const data = await res.json();
|
|
59
|
+
return {
|
|
60
|
+
content: data.choices[0]?.message?.content ?? '',
|
|
61
|
+
model: data.model,
|
|
62
|
+
usage: data.usage ? { inputTokens: data.usage.prompt_tokens, outputTokens: data.usage.completion_tokens } : undefined,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
async function callGoogle(apiKey, model, task, maxTokens, systemPrompt) {
|
|
66
|
+
const res = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent`, {
|
|
67
|
+
method: 'POST',
|
|
68
|
+
headers: { 'content-type': 'application/json', 'x-goog-api-key': apiKey },
|
|
69
|
+
body: JSON.stringify({
|
|
70
|
+
...(systemPrompt ? { systemInstruction: { parts: [{ text: systemPrompt }] } } : {}),
|
|
71
|
+
contents: [{ parts: [{ text: task }] }],
|
|
72
|
+
generationConfig: { maxOutputTokens: maxTokens },
|
|
73
|
+
}),
|
|
74
|
+
});
|
|
75
|
+
if (!res.ok)
|
|
76
|
+
throw new Error(`Google API error (${res.status}): ${await res.text()}`);
|
|
77
|
+
const data = await res.json();
|
|
78
|
+
return {
|
|
79
|
+
content: data.candidates[0]?.content?.parts?.map(p => p.text).join('') ?? '',
|
|
80
|
+
model,
|
|
81
|
+
usage: data.usageMetadata ? { inputTokens: data.usageMetadata.promptTokenCount, outputTokens: data.usageMetadata.candidatesTokenCount } : undefined,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
const PROVIDER_CALLERS = { anthropic: callAnthropic, openai: callOpenAI, google: callGoogle };
|
|
85
|
+
export async function executeApiStep(model, task, options = {}) {
|
|
86
|
+
const resolvedModel = model || options.defaultModel || 'claude-sonnet-4-20250514';
|
|
87
|
+
const maxTokens = options.defaultMaxTokens ?? 4096;
|
|
88
|
+
const provider = detectProvider(resolvedModel);
|
|
89
|
+
const apiKey = getApiKey(provider, options.envSecrets);
|
|
90
|
+
const response = await PROVIDER_CALLERS[provider](apiKey, resolvedModel, task, maxTokens, options.skills);
|
|
91
|
+
return response.content;
|
|
92
|
+
}
|
|
93
|
+
export { detectProvider, getApiKey };
|
|
94
|
+
//# sourceMappingURL=api-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-executor.js","sourceRoot":"","sources":["../src/api-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Barrier Manager — synchronization barriers with all/any/majority semantics.
|
|
3
|
+
*
|
|
4
|
+
* Barriers gate downstream workflow steps until a set of upstream agents
|
|
5
|
+
* or steps have resolved. Supports three resolution modes:
|
|
6
|
+
*
|
|
7
|
+
* - **all** — every agent in `waitFor` must resolve (default)
|
|
8
|
+
* - **any** — at least one agent resolves
|
|
9
|
+
* - **majority** — more than half of `waitFor` must resolve
|
|
10
|
+
*/
|
|
11
|
+
import { EventEmitter } from 'node:events';
|
|
12
|
+
import type { DbClient } from './coordinator.js';
|
|
13
|
+
export type BarrierMode = 'all' | 'any' | 'majority';
|
|
14
|
+
export interface BarrierDefinition {
|
|
15
|
+
name: string;
|
|
16
|
+
waitFor: string[];
|
|
17
|
+
mode?: BarrierMode;
|
|
18
|
+
timeoutMs?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface BarrierRow {
|
|
21
|
+
id: string;
|
|
22
|
+
runId: string;
|
|
23
|
+
barrierName: string;
|
|
24
|
+
waitFor: string[];
|
|
25
|
+
resolved: string[];
|
|
26
|
+
isSatisfied: boolean;
|
|
27
|
+
timeoutMs: number | null;
|
|
28
|
+
createdAt: string;
|
|
29
|
+
updatedAt: string;
|
|
30
|
+
}
|
|
31
|
+
export interface BarrierManagerEvents {
|
|
32
|
+
'barrier:created': (barrier: BarrierRow) => void;
|
|
33
|
+
'barrier:resolved': (barrierName: string, agent: string) => void;
|
|
34
|
+
'barrier:satisfied': (barrier: BarrierRow) => void;
|
|
35
|
+
'barrier:timeout': (barrier: BarrierRow) => void;
|
|
36
|
+
}
|
|
37
|
+
export declare class BarrierManager extends EventEmitter {
|
|
38
|
+
private db;
|
|
39
|
+
/** In-memory mode tracking (not persisted — set once at creation). */
|
|
40
|
+
private modes;
|
|
41
|
+
private timeoutTimers;
|
|
42
|
+
constructor(db: DbClient);
|
|
43
|
+
/**
|
|
44
|
+
* Create a barrier for a workflow run.
|
|
45
|
+
*/
|
|
46
|
+
createBarrier(runId: string, definition: BarrierDefinition): Promise<BarrierRow>;
|
|
47
|
+
/**
|
|
48
|
+
* Bulk-create barriers from a list of definitions (e.g. from coordination config).
|
|
49
|
+
*/
|
|
50
|
+
createBarriers(runId: string, definitions: BarrierDefinition[]): Promise<BarrierRow[]>;
|
|
51
|
+
/**
|
|
52
|
+
* Mark an agent/step as resolved for a barrier. Returns whether the
|
|
53
|
+
* barrier is now fully satisfied.
|
|
54
|
+
*/
|
|
55
|
+
resolve(runId: string, barrierName: string, agent: string): Promise<{
|
|
56
|
+
satisfied: boolean;
|
|
57
|
+
barrier: BarrierRow;
|
|
58
|
+
}>;
|
|
59
|
+
getBarrier(runId: string, barrierName: string): Promise<BarrierRow | null>;
|
|
60
|
+
getBarriers(runId: string): Promise<BarrierRow[]>;
|
|
61
|
+
getUnsatisfiedBarriers(runId: string): Promise<BarrierRow[]>;
|
|
62
|
+
/**
|
|
63
|
+
* Check if a named barrier is satisfied (useful for gating downstream work).
|
|
64
|
+
*/
|
|
65
|
+
isSatisfied(runId: string, barrierName: string): Promise<boolean>;
|
|
66
|
+
cleanup(): void;
|
|
67
|
+
private checkSatisfied;
|
|
68
|
+
private markSatisfied;
|
|
69
|
+
private scheduleTimeout;
|
|
70
|
+
private clearTimeout;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=barrier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"barrier.d.ts","sourceRoot":"","sources":["../src/barrier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;AAErD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IACjD,kBAAkB,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjE,mBAAmB,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IACnD,iBAAiB,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;CAClD;AAID,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,EAAE,CAAW;IACrB,sEAAsE;IACtE,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,aAAa,CAAoD;gBAE7D,EAAE,EAAE,QAAQ;IAOxB;;OAEG;IACG,aAAa,CACjB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,iBAAiB,GAC5B,OAAO,CAAC,UAAU,CAAC;IA+BtB;;OAEG;IACG,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,iBAAiB,EAAE,GAC/B,OAAO,CAAC,UAAU,EAAE,CAAC;IAUxB;;;OAGG;IACG,OAAO,CACX,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,UAAU,CAAA;KAAE,CAAC;IAsCjD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAQ1E,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAQjD,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAQlE;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOvE,OAAO,IAAI,IAAI;IAQf,OAAO,CAAC,cAAc;YAcR,aAAa;IAmB3B,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,YAAY;CAOrB"}
|
package/dist/barrier.js
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Barrier Manager — synchronization barriers with all/any/majority semantics.
|
|
3
|
+
*
|
|
4
|
+
* Barriers gate downstream workflow steps until a set of upstream agents
|
|
5
|
+
* or steps have resolved. Supports three resolution modes:
|
|
6
|
+
*
|
|
7
|
+
* - **all** — every agent in `waitFor` must resolve (default)
|
|
8
|
+
* - **any** — at least one agent resolves
|
|
9
|
+
* - **majority** — more than half of `waitFor` must resolve
|
|
10
|
+
*/
|
|
11
|
+
import { randomBytes } from 'node:crypto';
|
|
12
|
+
import { EventEmitter } from 'node:events';
|
|
13
|
+
// ── Manager ─────────────────────────────────────────────────────────────────
|
|
14
|
+
export class BarrierManager extends EventEmitter {
|
|
15
|
+
db;
|
|
16
|
+
/** In-memory mode tracking (not persisted — set once at creation). */
|
|
17
|
+
modes = new Map();
|
|
18
|
+
timeoutTimers = new Map();
|
|
19
|
+
constructor(db) {
|
|
20
|
+
super();
|
|
21
|
+
this.db = db;
|
|
22
|
+
}
|
|
23
|
+
// ── Create ──────────────────────────────────────────────────────────────
|
|
24
|
+
/**
|
|
25
|
+
* Create a barrier for a workflow run.
|
|
26
|
+
*/
|
|
27
|
+
async createBarrier(runId, definition) {
|
|
28
|
+
const id = `bar_${Date.now()}_${randomBytes(4).toString('hex')}`;
|
|
29
|
+
const now = new Date().toISOString();
|
|
30
|
+
const mode = definition.mode ?? 'all';
|
|
31
|
+
const { rows } = await this.db.query(`INSERT INTO workflow_barriers (id, run_id, barrier_name, wait_for, resolved, is_satisfied, timeout_ms, created_at, updated_at)
|
|
32
|
+
VALUES ($1, $2, $3, $4, '[]'::jsonb, FALSE, $5, $6, $6)
|
|
33
|
+
RETURNING *`, [
|
|
34
|
+
id,
|
|
35
|
+
runId,
|
|
36
|
+
definition.name,
|
|
37
|
+
JSON.stringify(definition.waitFor),
|
|
38
|
+
definition.timeoutMs ?? null,
|
|
39
|
+
now,
|
|
40
|
+
]);
|
|
41
|
+
const barrier = rows[0];
|
|
42
|
+
const key = `${runId}:${definition.name}`;
|
|
43
|
+
this.modes.set(key, mode);
|
|
44
|
+
if (definition.timeoutMs) {
|
|
45
|
+
this.scheduleTimeout(barrier, definition.timeoutMs);
|
|
46
|
+
}
|
|
47
|
+
this.emit('barrier:created', barrier);
|
|
48
|
+
return barrier;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Bulk-create barriers from a list of definitions (e.g. from coordination config).
|
|
52
|
+
*/
|
|
53
|
+
async createBarriers(runId, definitions) {
|
|
54
|
+
const results = [];
|
|
55
|
+
for (const def of definitions) {
|
|
56
|
+
results.push(await this.createBarrier(runId, def));
|
|
57
|
+
}
|
|
58
|
+
return results;
|
|
59
|
+
}
|
|
60
|
+
// ── Resolve ─────────────────────────────────────────────────────────────
|
|
61
|
+
/**
|
|
62
|
+
* Mark an agent/step as resolved for a barrier. Returns whether the
|
|
63
|
+
* barrier is now fully satisfied.
|
|
64
|
+
*/
|
|
65
|
+
async resolve(runId, barrierName, agent) {
|
|
66
|
+
const now = new Date().toISOString();
|
|
67
|
+
// Atomic: append agent to resolved array if not already present.
|
|
68
|
+
const { rows } = await this.db.query(`UPDATE workflow_barriers
|
|
69
|
+
SET resolved = CASE
|
|
70
|
+
WHEN resolved @> $3::jsonb THEN resolved
|
|
71
|
+
ELSE resolved || $3::jsonb
|
|
72
|
+
END,
|
|
73
|
+
updated_at = $4
|
|
74
|
+
WHERE run_id = $1 AND barrier_name = $2 AND is_satisfied = FALSE
|
|
75
|
+
RETURNING *`, [runId, barrierName, JSON.stringify(agent), now]);
|
|
76
|
+
if (rows.length === 0) {
|
|
77
|
+
// Barrier may already be satisfied or not exist.
|
|
78
|
+
const existing = await this.getBarrier(runId, barrierName);
|
|
79
|
+
if (!existing)
|
|
80
|
+
throw new Error(`Barrier ${barrierName} not found for run ${runId}`);
|
|
81
|
+
return { satisfied: existing.isSatisfied, barrier: existing };
|
|
82
|
+
}
|
|
83
|
+
const barrier = rows[0];
|
|
84
|
+
this.emit('barrier:resolved', barrierName, agent);
|
|
85
|
+
const key = `${runId}:${barrierName}`;
|
|
86
|
+
const mode = this.modes.get(key) ?? 'all';
|
|
87
|
+
if (this.checkSatisfied(barrier, mode)) {
|
|
88
|
+
return this.markSatisfied(barrier);
|
|
89
|
+
}
|
|
90
|
+
return { satisfied: false, barrier };
|
|
91
|
+
}
|
|
92
|
+
// ── Queries ─────────────────────────────────────────────────────────────
|
|
93
|
+
async getBarrier(runId, barrierName) {
|
|
94
|
+
const { rows } = await this.db.query(`SELECT * FROM workflow_barriers WHERE run_id = $1 AND barrier_name = $2`, [runId, barrierName]);
|
|
95
|
+
return rows[0] ?? null;
|
|
96
|
+
}
|
|
97
|
+
async getBarriers(runId) {
|
|
98
|
+
const { rows } = await this.db.query(`SELECT * FROM workflow_barriers WHERE run_id = $1 ORDER BY created_at ASC`, [runId]);
|
|
99
|
+
return rows;
|
|
100
|
+
}
|
|
101
|
+
async getUnsatisfiedBarriers(runId) {
|
|
102
|
+
const { rows } = await this.db.query(`SELECT * FROM workflow_barriers WHERE run_id = $1 AND is_satisfied = FALSE ORDER BY created_at ASC`, [runId]);
|
|
103
|
+
return rows;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Check if a named barrier is satisfied (useful for gating downstream work).
|
|
107
|
+
*/
|
|
108
|
+
async isSatisfied(runId, barrierName) {
|
|
109
|
+
const barrier = await this.getBarrier(runId, barrierName);
|
|
110
|
+
return barrier?.isSatisfied ?? false;
|
|
111
|
+
}
|
|
112
|
+
// ── Cleanup ─────────────────────────────────────────────────────────────
|
|
113
|
+
cleanup() {
|
|
114
|
+
for (const timer of this.timeoutTimers.values())
|
|
115
|
+
clearTimeout(timer);
|
|
116
|
+
this.timeoutTimers.clear();
|
|
117
|
+
this.modes.clear();
|
|
118
|
+
}
|
|
119
|
+
// ── Private ─────────────────────────────────────────────────────────────
|
|
120
|
+
checkSatisfied(barrier, mode) {
|
|
121
|
+
const waitFor = Array.isArray(barrier.waitFor) ? barrier.waitFor : [];
|
|
122
|
+
const resolved = Array.isArray(barrier.resolved) ? barrier.resolved : [];
|
|
123
|
+
switch (mode) {
|
|
124
|
+
case 'all':
|
|
125
|
+
return waitFor.every((w) => resolved.includes(w));
|
|
126
|
+
case 'any':
|
|
127
|
+
return resolved.length > 0;
|
|
128
|
+
case 'majority':
|
|
129
|
+
return resolved.length > waitFor.length / 2;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async markSatisfied(barrier) {
|
|
133
|
+
const now = new Date().toISOString();
|
|
134
|
+
const { rows } = await this.db.query(`UPDATE workflow_barriers SET is_satisfied = TRUE, updated_at = $2
|
|
135
|
+
WHERE id = $1
|
|
136
|
+
RETURNING *`, [barrier.id, now]);
|
|
137
|
+
const updated = rows[0];
|
|
138
|
+
const key = `${barrier.runId}:${barrier.barrierName}`;
|
|
139
|
+
this.clearTimeout(key);
|
|
140
|
+
this.emit('barrier:satisfied', updated);
|
|
141
|
+
return { satisfied: true, barrier: updated };
|
|
142
|
+
}
|
|
143
|
+
scheduleTimeout(barrier, timeoutMs) {
|
|
144
|
+
const key = `${barrier.runId}:${barrier.barrierName}`;
|
|
145
|
+
const timer = setTimeout(async () => {
|
|
146
|
+
const current = await this.getBarrier(barrier.runId, barrier.barrierName);
|
|
147
|
+
if (current && !current.isSatisfied) {
|
|
148
|
+
this.emit('barrier:timeout', current);
|
|
149
|
+
}
|
|
150
|
+
}, timeoutMs);
|
|
151
|
+
timer.unref();
|
|
152
|
+
this.timeoutTimers.set(key, timer);
|
|
153
|
+
}
|
|
154
|
+
clearTimeout(key) {
|
|
155
|
+
const timer = this.timeoutTimers.get(key);
|
|
156
|
+
if (timer) {
|
|
157
|
+
globalThis.clearTimeout(timer);
|
|
158
|
+
this.timeoutTimers.delete(key);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=barrier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"barrier.js","sourceRoot":"","sources":["../src/barrier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export interface BudgetTrackerStepConfig {
|
|
2
|
+
stepName: string;
|
|
3
|
+
agentName: string;
|
|
4
|
+
maxTokens?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface BudgetTrackerOptions {
|
|
7
|
+
perAgent?: number;
|
|
8
|
+
perWorkflow?: number;
|
|
9
|
+
workflowBudget?: number;
|
|
10
|
+
steps?: BudgetTrackerStepConfig[];
|
|
11
|
+
}
|
|
12
|
+
export interface TokenUsage {
|
|
13
|
+
input: number;
|
|
14
|
+
output: number;
|
|
15
|
+
cacheRead: number;
|
|
16
|
+
total: number;
|
|
17
|
+
}
|
|
18
|
+
export interface BudgetAvailability {
|
|
19
|
+
allowed: boolean;
|
|
20
|
+
reason?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface OverBudgetResult {
|
|
23
|
+
over: boolean;
|
|
24
|
+
reason?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface BudgetStatus {
|
|
27
|
+
agentLimitExceeded: boolean;
|
|
28
|
+
workflowBudgetExceeded: boolean;
|
|
29
|
+
workflowBudgetExhausted: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface StepBudgetStatus {
|
|
32
|
+
used?: number;
|
|
33
|
+
limit?: number;
|
|
34
|
+
over: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface WorkflowBudgetStatus {
|
|
37
|
+
used: number;
|
|
38
|
+
limit?: number;
|
|
39
|
+
exhausted: boolean;
|
|
40
|
+
}
|
|
41
|
+
export interface RunSummaryBudgetData {
|
|
42
|
+
steps: Map<string, StepBudgetStatus>;
|
|
43
|
+
workflow?: WorkflowBudgetStatus;
|
|
44
|
+
}
|
|
45
|
+
export declare class BudgetExceededError extends Error {
|
|
46
|
+
readonly stepName: string;
|
|
47
|
+
readonly budgetType: 'agent' | 'workflow';
|
|
48
|
+
readonly limit: number;
|
|
49
|
+
readonly actual: number;
|
|
50
|
+
readonly used: number;
|
|
51
|
+
constructor(stepName: string, budgetType: 'agent' | 'workflow', limit: number, actual: number);
|
|
52
|
+
}
|
|
53
|
+
export declare class BudgetTracker {
|
|
54
|
+
private readonly defaultAgentBudget?;
|
|
55
|
+
private readonly workflowBudget?;
|
|
56
|
+
private readonly stepLimits;
|
|
57
|
+
private readonly stepUsage;
|
|
58
|
+
private totalUsage;
|
|
59
|
+
private workflowBudgetExhausted;
|
|
60
|
+
constructor(options: BudgetTrackerOptions);
|
|
61
|
+
recordUsage(stepName: string, usage: number | Partial<Omit<TokenUsage, 'total'>>): void;
|
|
62
|
+
getStepUsage(stepName: string): TokenUsage;
|
|
63
|
+
getTotalUsage(): TokenUsage;
|
|
64
|
+
getRemainingBudget(): {
|
|
65
|
+
agent?: number;
|
|
66
|
+
workflow?: number;
|
|
67
|
+
};
|
|
68
|
+
checkCanSpawn(stepName: string): BudgetAvailability;
|
|
69
|
+
isOverBudget(stepName: string): OverBudgetResult;
|
|
70
|
+
getBudgetStatus(stepName: string): BudgetStatus;
|
|
71
|
+
getStepBudgetStatus(stepName: string): StepBudgetStatus | undefined;
|
|
72
|
+
getRunSummaryBudgetData(): RunSummaryBudgetData | undefined;
|
|
73
|
+
private getStepLimit;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=budget-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget-tracker.d.ts","sourceRoot":"","sources":["../src/budget-tracker.ts"],"names":[],"mappings":"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"}
|