@nordsym/apiclaw 1.3.13 → 1.4.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/PRD-API-CHAINING.md +483 -0
- package/PRD-HARDEN-SHELL.md +18 -12
- package/convex/_generated/api.d.ts +2 -0
- package/convex/chains.ts +1095 -0
- package/convex/schema.ts +101 -0
- package/dist/chain-types.d.ts +187 -0
- package/dist/chain-types.d.ts.map +1 -0
- package/dist/chain-types.js +33 -0
- package/dist/chain-types.js.map +1 -0
- package/dist/chainExecutor.d.ts +122 -0
- package/dist/chainExecutor.d.ts.map +1 -0
- package/dist/chainExecutor.js +454 -0
- package/dist/chainExecutor.js.map +1 -0
- package/dist/chainResolver.d.ts +100 -0
- package/dist/chainResolver.d.ts.map +1 -0
- package/dist/chainResolver.js +519 -0
- package/dist/chainResolver.js.map +1 -0
- package/dist/chainResolver.test.d.ts +5 -0
- package/dist/chainResolver.test.d.ts.map +1 -0
- package/dist/chainResolver.test.js +201 -0
- package/dist/chainResolver.test.js.map +1 -0
- package/dist/execute.d.ts +4 -1
- package/dist/execute.d.ts.map +1 -1
- package/dist/execute.js +3 -0
- package/dist/execute.js.map +1 -1
- package/dist/index.js +382 -2
- package/dist/index.js.map +1 -1
- package/landing/public/logos/chattgpt.svg +1 -0
- package/landing/public/logos/claude.svg +1 -0
- package/landing/public/logos/gemini.svg +1 -0
- package/landing/public/logos/grok.svg +1 -0
- package/landing/src/app/page.tsx +12 -21
- package/landing/src/app/workspace/chains/page.tsx +520 -0
- package/landing/src/components/AITestimonials.tsx +15 -9
- package/landing/src/components/ChainStepDetail.tsx +310 -0
- package/landing/src/components/ChainTrace.tsx +261 -0
- package/landing/src/lib/stats.json +1 -1
- package/package.json +1 -1
- package/src/chain-types.ts +270 -0
- package/src/chainExecutor.ts +730 -0
- package/src/chainResolver.test.ts +246 -0
- package/src/chainResolver.ts +658 -0
- package/src/execute.ts +23 -0
- package/src/index.ts +423 -2
package/convex/schema.ts
CHANGED
|
@@ -597,6 +597,107 @@ export default defineSchema({
|
|
|
597
597
|
// FEEDBACK SYSTEM
|
|
598
598
|
// ============================================
|
|
599
599
|
|
|
600
|
+
// ============================================
|
|
601
|
+
// CHAIN ORCHESTRATION TABLES
|
|
602
|
+
// ============================================
|
|
603
|
+
|
|
604
|
+
// Chain executions (main orchestration record)
|
|
605
|
+
chains: defineTable({
|
|
606
|
+
workspaceId: v.id("workspaces"),
|
|
607
|
+
// Chain definition
|
|
608
|
+
steps: v.array(v.any()), // Array of step definitions (raw, unresolved)
|
|
609
|
+
// Execution state
|
|
610
|
+
status: v.union(
|
|
611
|
+
v.literal("pending"),
|
|
612
|
+
v.literal("running"),
|
|
613
|
+
v.literal("completed"),
|
|
614
|
+
v.literal("failed"),
|
|
615
|
+
v.literal("paused")
|
|
616
|
+
),
|
|
617
|
+
currentStep: v.number(), // Index of current step (0-based)
|
|
618
|
+
// Results storage
|
|
619
|
+
results: v.any(), // Record<stepId, result>
|
|
620
|
+
// Error tracking
|
|
621
|
+
error: v.optional(v.object({
|
|
622
|
+
stepId: v.string(),
|
|
623
|
+
code: v.string(),
|
|
624
|
+
message: v.string(),
|
|
625
|
+
retryAfter: v.optional(v.number()),
|
|
626
|
+
})),
|
|
627
|
+
// Execution options
|
|
628
|
+
continueOnError: v.optional(v.boolean()),
|
|
629
|
+
timeout: v.optional(v.number()), // ms
|
|
630
|
+
// Resume capability
|
|
631
|
+
resumeToken: v.optional(v.string()),
|
|
632
|
+
canResume: v.optional(v.boolean()),
|
|
633
|
+
// Cost tracking
|
|
634
|
+
totalCostCents: v.optional(v.number()),
|
|
635
|
+
totalLatencyMs: v.optional(v.number()),
|
|
636
|
+
// Timestamps
|
|
637
|
+
createdAt: v.number(),
|
|
638
|
+
startedAt: v.optional(v.number()),
|
|
639
|
+
completedAt: v.optional(v.number()),
|
|
640
|
+
})
|
|
641
|
+
.index("by_workspaceId", ["workspaceId"])
|
|
642
|
+
.index("by_status", ["status"])
|
|
643
|
+
.index("by_workspaceId_status", ["workspaceId", "status"])
|
|
644
|
+
.index("by_resumeToken", ["resumeToken"]),
|
|
645
|
+
|
|
646
|
+
// Chain templates (reusable chain definitions)
|
|
647
|
+
chainTemplates: defineTable({
|
|
648
|
+
workspaceId: v.id("workspaces"),
|
|
649
|
+
name: v.string(),
|
|
650
|
+
description: v.optional(v.string()),
|
|
651
|
+
// Input schema for the template
|
|
652
|
+
inputs: v.optional(v.any()), // JSON Schema for inputs
|
|
653
|
+
// Chain definition
|
|
654
|
+
chain: v.array(v.any()), // Array of step definitions
|
|
655
|
+
// Usage tracking
|
|
656
|
+
useCount: v.optional(v.number()),
|
|
657
|
+
lastUsedAt: v.optional(v.number()),
|
|
658
|
+
// Timestamps
|
|
659
|
+
createdAt: v.number(),
|
|
660
|
+
updatedAt: v.number(),
|
|
661
|
+
})
|
|
662
|
+
.index("by_workspaceId", ["workspaceId"])
|
|
663
|
+
.index("by_name", ["workspaceId", "name"]),
|
|
664
|
+
|
|
665
|
+
// Chain step executions (detailed trace per step)
|
|
666
|
+
chainExecutions: defineTable({
|
|
667
|
+
chainId: v.id("chains"),
|
|
668
|
+
stepId: v.string(), // The id from step definition
|
|
669
|
+
stepIndex: v.number(), // Position in chain
|
|
670
|
+
// Execution state
|
|
671
|
+
status: v.union(
|
|
672
|
+
v.literal("pending"),
|
|
673
|
+
v.literal("running"),
|
|
674
|
+
v.literal("completed"),
|
|
675
|
+
v.literal("failed"),
|
|
676
|
+
v.literal("skipped")
|
|
677
|
+
),
|
|
678
|
+
// I/O
|
|
679
|
+
input: v.optional(v.any()), // Resolved params sent to provider
|
|
680
|
+
output: v.optional(v.any()), // Result from provider
|
|
681
|
+
// Metrics
|
|
682
|
+
latencyMs: v.optional(v.number()),
|
|
683
|
+
costCents: v.optional(v.number()),
|
|
684
|
+
// Error info
|
|
685
|
+
error: v.optional(v.object({
|
|
686
|
+
code: v.string(),
|
|
687
|
+
message: v.string(),
|
|
688
|
+
retryCount: v.optional(v.number()),
|
|
689
|
+
})),
|
|
690
|
+
// Parallel execution tracking
|
|
691
|
+
parallelGroup: v.optional(v.string()), // Group ID if part of parallel batch
|
|
692
|
+
// Timestamps
|
|
693
|
+
createdAt: v.number(),
|
|
694
|
+
startedAt: v.optional(v.number()),
|
|
695
|
+
completedAt: v.optional(v.number()),
|
|
696
|
+
})
|
|
697
|
+
.index("by_chainId", ["chainId"])
|
|
698
|
+
.index("by_chainId_stepId", ["chainId", "stepId"])
|
|
699
|
+
.index("by_chainId_stepIndex", ["chainId", "stepIndex"]),
|
|
700
|
+
|
|
600
701
|
// User feedback with voting
|
|
601
702
|
feedback: defineTable({
|
|
602
703
|
workspaceId: v.id("workspaces"),
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chain Execution Types for APIClaw
|
|
3
|
+
*
|
|
4
|
+
* Enables multi-step API orchestration with:
|
|
5
|
+
* - Sequential execution
|
|
6
|
+
* - Parallel execution
|
|
7
|
+
* - Conditional branching
|
|
8
|
+
* - Loops (forEach, map-reduce)
|
|
9
|
+
* - Error handling & retry
|
|
10
|
+
* - Cross-step references ($stepId.property)
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Base step configuration
|
|
14
|
+
*/
|
|
15
|
+
export interface ChainStepBase {
|
|
16
|
+
id: string;
|
|
17
|
+
provider: string;
|
|
18
|
+
action: string;
|
|
19
|
+
params?: Record<string, any>;
|
|
20
|
+
onError?: ErrorHandler;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Parallel execution step - runs multiple steps concurrently
|
|
24
|
+
*/
|
|
25
|
+
export interface ParallelStep {
|
|
26
|
+
parallel: ChainStepBase[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Conditional step - executes based on condition
|
|
30
|
+
*/
|
|
31
|
+
export interface ConditionalStep {
|
|
32
|
+
if: string;
|
|
33
|
+
then: ChainStepBase | ChainStep;
|
|
34
|
+
else?: ChainStepBase | ChainStep;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Loop step - iterates over array
|
|
38
|
+
*/
|
|
39
|
+
export interface ForEachStep {
|
|
40
|
+
forEach: string;
|
|
41
|
+
as: string;
|
|
42
|
+
do: ChainStepBase;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Map step - transforms array
|
|
46
|
+
*/
|
|
47
|
+
export interface MapStep {
|
|
48
|
+
map: {
|
|
49
|
+
input: string;
|
|
50
|
+
fn: ChainStepBase;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Reduce step - aggregates results
|
|
55
|
+
*/
|
|
56
|
+
export interface ReduceStep {
|
|
57
|
+
reduce: {
|
|
58
|
+
input: string;
|
|
59
|
+
fn: ChainStepBase;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Union type for all step variants
|
|
64
|
+
*/
|
|
65
|
+
export type ChainStep = ChainStepBase | ParallelStep | ConditionalStep | ForEachStep | MapStep | ReduceStep;
|
|
66
|
+
export interface RetryConfig {
|
|
67
|
+
attempts?: number;
|
|
68
|
+
maxAttempts?: number;
|
|
69
|
+
backoff?: number[] | 'exponential' | 'linear';
|
|
70
|
+
backoffMs?: number;
|
|
71
|
+
}
|
|
72
|
+
export interface ErrorHandler {
|
|
73
|
+
retry?: RetryConfig;
|
|
74
|
+
fallback?: ChainStepBase;
|
|
75
|
+
abort?: boolean;
|
|
76
|
+
}
|
|
77
|
+
export type ErrorPolicy = 'fail-fast' | 'best-effort' | 'transactional';
|
|
78
|
+
export interface RollbackAction {
|
|
79
|
+
if: string;
|
|
80
|
+
do: ChainStepBase;
|
|
81
|
+
}
|
|
82
|
+
export interface ChainErrorPolicy {
|
|
83
|
+
mode: ErrorPolicy;
|
|
84
|
+
rollback?: RollbackAction[];
|
|
85
|
+
}
|
|
86
|
+
export interface ChainLimits {
|
|
87
|
+
maxSteps?: number;
|
|
88
|
+
maxParallel?: number;
|
|
89
|
+
maxCost?: {
|
|
90
|
+
cents: number;
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export interface ChainOptions {
|
|
94
|
+
continueOnError?: boolean;
|
|
95
|
+
timeout?: number;
|
|
96
|
+
async?: boolean;
|
|
97
|
+
webhook?: string;
|
|
98
|
+
errorPolicy?: ChainErrorPolicy;
|
|
99
|
+
limits?: ChainLimits;
|
|
100
|
+
}
|
|
101
|
+
export interface ChainRequest extends ChainOptions {
|
|
102
|
+
chain: ChainStep[];
|
|
103
|
+
}
|
|
104
|
+
export type StepStatus = 'pending' | 'running' | 'completed' | 'failed' | 'skipped';
|
|
105
|
+
export interface StepResult {
|
|
106
|
+
id: string;
|
|
107
|
+
status: StepStatus;
|
|
108
|
+
result?: any;
|
|
109
|
+
error?: string;
|
|
110
|
+
errorCode?: string;
|
|
111
|
+
latencyMs: number;
|
|
112
|
+
cost?: {
|
|
113
|
+
cents: number;
|
|
114
|
+
};
|
|
115
|
+
retryAttempts?: number;
|
|
116
|
+
}
|
|
117
|
+
export interface ChainSuccessResponse {
|
|
118
|
+
success: true;
|
|
119
|
+
chainId: string;
|
|
120
|
+
steps: StepResult[];
|
|
121
|
+
finalResult: any;
|
|
122
|
+
totalLatencyMs: number;
|
|
123
|
+
totalCost: {
|
|
124
|
+
cents: number;
|
|
125
|
+
};
|
|
126
|
+
tokensSaved: number;
|
|
127
|
+
}
|
|
128
|
+
export interface ChainErrorResponse {
|
|
129
|
+
success: false;
|
|
130
|
+
chainId: string;
|
|
131
|
+
completedSteps: string[];
|
|
132
|
+
failedStep: {
|
|
133
|
+
id: string;
|
|
134
|
+
error: string;
|
|
135
|
+
code?: string;
|
|
136
|
+
retryAfter?: number;
|
|
137
|
+
};
|
|
138
|
+
partialResults: Record<string, any>;
|
|
139
|
+
canResume: boolean;
|
|
140
|
+
resumeToken?: string;
|
|
141
|
+
}
|
|
142
|
+
export type ChainResponse = ChainSuccessResponse | ChainErrorResponse;
|
|
143
|
+
export interface AsyncChainResponse {
|
|
144
|
+
chainId: string;
|
|
145
|
+
status: 'running' | 'completed' | 'failed';
|
|
146
|
+
estimatedCompletion?: string;
|
|
147
|
+
statusUrl: string;
|
|
148
|
+
}
|
|
149
|
+
export interface ChainStatusResponse {
|
|
150
|
+
chainId: string;
|
|
151
|
+
status: 'pending' | 'running' | 'completed' | 'failed';
|
|
152
|
+
progress: {
|
|
153
|
+
completedSteps: number;
|
|
154
|
+
totalSteps: number;
|
|
155
|
+
currentStep?: string;
|
|
156
|
+
};
|
|
157
|
+
startedAt: string;
|
|
158
|
+
completedAt?: string;
|
|
159
|
+
result?: ChainResponse;
|
|
160
|
+
}
|
|
161
|
+
export interface ResumeChainRequest {
|
|
162
|
+
resumeToken: string;
|
|
163
|
+
overrides?: Record<string, Record<string, any>>;
|
|
164
|
+
}
|
|
165
|
+
export interface ChainInput {
|
|
166
|
+
type: 'string' | 'number' | 'boolean' | 'object' | 'array';
|
|
167
|
+
required?: boolean;
|
|
168
|
+
default?: any;
|
|
169
|
+
description?: string;
|
|
170
|
+
}
|
|
171
|
+
export interface ChainTemplate {
|
|
172
|
+
name: string;
|
|
173
|
+
description?: string;
|
|
174
|
+
inputs: Record<string, ChainInput>;
|
|
175
|
+
chain: ChainStep[];
|
|
176
|
+
}
|
|
177
|
+
export interface UseChainRequest {
|
|
178
|
+
useChain: string;
|
|
179
|
+
inputs: Record<string, any>;
|
|
180
|
+
}
|
|
181
|
+
export declare function isParallelStep(step: ChainStep): step is ParallelStep;
|
|
182
|
+
export declare function isConditionalStep(step: ChainStep): step is ConditionalStep;
|
|
183
|
+
export declare function isForEachStep(step: ChainStep): step is ForEachStep;
|
|
184
|
+
export declare function isMapStep(step: ChainStep): step is MapStep;
|
|
185
|
+
export declare function isReduceStep(step: ChainStep): step is ReduceStep;
|
|
186
|
+
export declare function isBaseStep(step: ChainStep): step is ChainStepBase;
|
|
187
|
+
//# sourceMappingURL=chain-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain-types.d.ts","sourceRoot":"","sources":["../src/chain-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,aAAa,GAAG,SAAS,CAAC;IAChC,IAAI,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,aAAa,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE;QACH,KAAK,EAAE,MAAM,CAAC;QACd,EAAE,EAAE,aAAa,CAAC;KACnB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,EAAE,EAAE,aAAa,CAAC;KACnB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GACjB,aAAa,GACb,YAAY,GACZ,eAAe,GACf,WAAW,GACX,OAAO,GACP,UAAU,CAAC;AAMf,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,aAAa,GAAG,QAAQ,CAAC;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,aAAa,GAAG,eAAe,CAAC;AAExE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,aAAa,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;CAC7B;AAMD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAMD,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAMD,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEpF,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,WAAW,EAAE,GAAG,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,KAAK,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE;QACV,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,aAAa,GAAG,oBAAoB,GAAG,kBAAkB,CAAC;AAMtE,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACvD,QAAQ,EAAE;QACR,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAMD,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;CACjD;AAMD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnC,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC7B;AAMD,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,IAAI,YAAY,CAEpE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,IAAI,eAAe,CAE1E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,IAAI,WAAW,CAElE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,IAAI,OAAO,CAE1D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,IAAI,UAAU,CAEhE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,IAAI,aAAa,CAEjE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chain Execution Types for APIClaw
|
|
3
|
+
*
|
|
4
|
+
* Enables multi-step API orchestration with:
|
|
5
|
+
* - Sequential execution
|
|
6
|
+
* - Parallel execution
|
|
7
|
+
* - Conditional branching
|
|
8
|
+
* - Loops (forEach, map-reduce)
|
|
9
|
+
* - Error handling & retry
|
|
10
|
+
* - Cross-step references ($stepId.property)
|
|
11
|
+
*/
|
|
12
|
+
// ============================================
|
|
13
|
+
// TYPE GUARDS
|
|
14
|
+
// ============================================
|
|
15
|
+
export function isParallelStep(step) {
|
|
16
|
+
return 'parallel' in step;
|
|
17
|
+
}
|
|
18
|
+
export function isConditionalStep(step) {
|
|
19
|
+
return 'if' in step && 'then' in step;
|
|
20
|
+
}
|
|
21
|
+
export function isForEachStep(step) {
|
|
22
|
+
return 'forEach' in step && 'do' in step;
|
|
23
|
+
}
|
|
24
|
+
export function isMapStep(step) {
|
|
25
|
+
return 'map' in step;
|
|
26
|
+
}
|
|
27
|
+
export function isReduceStep(step) {
|
|
28
|
+
return 'reduce' in step;
|
|
29
|
+
}
|
|
30
|
+
export function isBaseStep(step) {
|
|
31
|
+
return 'provider' in step && 'action' in step;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=chain-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain-types.js","sourceRoot":"","sources":["../src/chain-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAyOH,+CAA+C;AAC/C,cAAc;AACd,+CAA+C;AAE/C,MAAM,UAAU,cAAc,CAAC,IAAe;IAC5C,OAAO,UAAU,IAAI,IAAI,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAe;IAC/C,OAAO,IAAI,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAe;IAC3C,OAAO,SAAS,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAe;IACvC,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAe;IAC1C,OAAO,QAAQ,IAAI,IAAI,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAe;IACxC,OAAO,UAAU,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* APIClaw Chain Executor
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates multi-step API chains with:
|
|
5
|
+
* - Sequential execution
|
|
6
|
+
* - Parallel batches
|
|
7
|
+
* - Conditional branching
|
|
8
|
+
* - ForEach loops
|
|
9
|
+
* - Error handling and retry
|
|
10
|
+
* - Full execution trace
|
|
11
|
+
*/
|
|
12
|
+
import { ChainStep, ChainStepUnion } from './chainResolver.js';
|
|
13
|
+
export interface ChainDefinition {
|
|
14
|
+
id?: string;
|
|
15
|
+
name?: string;
|
|
16
|
+
description?: string;
|
|
17
|
+
steps: ChainStepUnion[];
|
|
18
|
+
inputs?: Record<string, InputDefinition>;
|
|
19
|
+
errorPolicy?: ErrorPolicy;
|
|
20
|
+
limits?: ChainLimits;
|
|
21
|
+
timeout?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface InputDefinition {
|
|
24
|
+
type: 'string' | 'number' | 'boolean' | 'array' | 'object';
|
|
25
|
+
required?: boolean;
|
|
26
|
+
default?: any;
|
|
27
|
+
description?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface ErrorPolicy {
|
|
30
|
+
mode: 'fail-fast' | 'best-effort' | 'transactional';
|
|
31
|
+
rollback?: RollbackStep[];
|
|
32
|
+
}
|
|
33
|
+
export interface RollbackStep {
|
|
34
|
+
if: string;
|
|
35
|
+
do: ChainStep;
|
|
36
|
+
}
|
|
37
|
+
export interface ChainLimits {
|
|
38
|
+
maxSteps?: number;
|
|
39
|
+
maxParallel?: number;
|
|
40
|
+
maxCost?: {
|
|
41
|
+
cents: number;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export interface Credentials {
|
|
45
|
+
userId?: string;
|
|
46
|
+
customerKeys?: Record<string, string>;
|
|
47
|
+
}
|
|
48
|
+
export interface ChainOptions {
|
|
49
|
+
dryRun?: boolean;
|
|
50
|
+
verbose?: boolean;
|
|
51
|
+
onStepComplete?: (step: StepTrace) => void;
|
|
52
|
+
onStepStart?: (stepId: string, stepIndex: number) => void;
|
|
53
|
+
}
|
|
54
|
+
export interface ChainResult {
|
|
55
|
+
success: boolean;
|
|
56
|
+
chainId: string;
|
|
57
|
+
startedAt: string;
|
|
58
|
+
completedAt: string;
|
|
59
|
+
totalLatencyMs: number;
|
|
60
|
+
totalCost: {
|
|
61
|
+
cents: number;
|
|
62
|
+
};
|
|
63
|
+
finalResult?: any;
|
|
64
|
+
results: Record<string, any>;
|
|
65
|
+
error?: ChainError;
|
|
66
|
+
completedSteps: string[];
|
|
67
|
+
failedStep?: StepTrace;
|
|
68
|
+
trace: StepTrace[];
|
|
69
|
+
canResume: boolean;
|
|
70
|
+
resumeToken?: string;
|
|
71
|
+
}
|
|
72
|
+
export interface ChainError {
|
|
73
|
+
stepId: string;
|
|
74
|
+
code: string;
|
|
75
|
+
message: string;
|
|
76
|
+
retryAfter?: number;
|
|
77
|
+
}
|
|
78
|
+
export interface StepTrace {
|
|
79
|
+
stepId: string;
|
|
80
|
+
stepIndex: number;
|
|
81
|
+
provider: string;
|
|
82
|
+
action: string;
|
|
83
|
+
startedAt: string;
|
|
84
|
+
completedAt: string;
|
|
85
|
+
latencyMs: number;
|
|
86
|
+
success: boolean;
|
|
87
|
+
input: Record<string, any>;
|
|
88
|
+
output?: any;
|
|
89
|
+
error?: string;
|
|
90
|
+
errorCode?: string;
|
|
91
|
+
cost?: {
|
|
92
|
+
cents: number;
|
|
93
|
+
};
|
|
94
|
+
retries?: number;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Execute a chain of API calls
|
|
98
|
+
*/
|
|
99
|
+
export declare function executeChain(chain: ChainDefinition, credentials: Credentials, inputs?: Record<string, any>, options?: ChainOptions): Promise<ChainResult>;
|
|
100
|
+
export declare class StepError extends Error {
|
|
101
|
+
code: string;
|
|
102
|
+
retryAfter?: number;
|
|
103
|
+
constructor(message: string, code: string, retryAfter?: number);
|
|
104
|
+
}
|
|
105
|
+
export declare class TimeoutError extends Error {
|
|
106
|
+
code: string;
|
|
107
|
+
constructor(message: string);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get status of a running or completed chain
|
|
111
|
+
*/
|
|
112
|
+
export declare function getChainStatus(chainId: string): Promise<{
|
|
113
|
+
chainId: string;
|
|
114
|
+
status: 'running' | 'completed' | 'failed' | 'not_found';
|
|
115
|
+
result?: ChainResult;
|
|
116
|
+
}>;
|
|
117
|
+
/**
|
|
118
|
+
* Resume a failed chain from a resume token
|
|
119
|
+
*/
|
|
120
|
+
export declare function resumeChain(resumeToken: string, chain: ChainDefinition, credentials: Credentials, inputs?: Record<string, any>, overrides?: Record<string, Record<string, any>>, options?: ChainOptions): Promise<ChainResult>;
|
|
121
|
+
export { ChainContext, ChainStep, ChainStepUnion, resolveReferences, validateReferences, evaluateCondition, } from './chainResolver.js';
|
|
122
|
+
//# sourceMappingURL=chainExecutor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chainExecutor.d.ts","sourceRoot":"","sources":["../src/chainExecutor.ts"],"names":[],"mappings":"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"}
|