@hugex/ai 3.2.0 → 3.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/dist/FlowEngine-UNMMHMN6.js +1 -0
- package/dist/{chunk-V35SRZAO.js → chunk-3D77ZXDC.js} +1 -1
- package/dist/{chunk-6AZ7RATD.js → chunk-AKJFVR6J.js} +1 -1
- package/dist/chunk-EHOK5FW2.js +1 -0
- package/dist/chunk-HJPR76HF.js +1 -0
- package/dist/chunk-J67BCWE3.js +1 -0
- package/dist/chunk-KKJW6HJA.js +3 -0
- package/dist/chunk-V43Y4KSA.js +12 -0
- package/dist/chunk-YXG3ZEUP.js +10 -0
- package/dist/{chunk-ZYIULB2P.js → chunk-Z4CYLB7J.js} +1 -1
- package/dist/client.js +1 -1
- package/dist/common/constants/clef-models.d.ts +48 -0
- package/dist/common/constants/tenant-only-nodes.d.ts +1 -1
- package/dist/common/flow-graph/catalog.d.ts +40 -0
- package/dist/common/flow-graph/classifier.d.ts +2 -0
- package/dist/common/flow-graph/composio.d.ts +2 -0
- package/dist/common/flow-graph/credentials.d.ts +3 -0
- package/dist/common/flow-graph/index.d.ts +11 -0
- package/dist/common/flow-graph/ops.d.ts +21 -0
- package/dist/common/flow-graph/refs.d.ts +18 -0
- package/dist/common/flow-graph/schema.d.ts +570 -0
- package/dist/common/flow-graph/templates.d.ts +2 -0
- package/dist/common/flow-graph/validate.d.ts +77 -0
- package/dist/common/types/classifier-types.d.ts +57 -0
- package/dist/common/types/classifier-validation.d.ts +2 -0
- package/dist/common/utils/clef-prefix.d.ts +16 -0
- package/dist/common/utils/clef.d.ts +49 -0
- package/dist/common.d.ts +5 -0
- package/dist/common.js +1 -1
- package/dist/composioDirectTool-ZCZRW5WU.js +1 -0
- package/dist/composioTool-RKVCX25U.js +1 -0
- package/dist/httpTool-IW4W7CGE.js +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +6 -6
- package/dist/server/core/agentTurn.d.ts +4 -0
- package/dist/server/runners/classifierNodeRunner.d.ts +1 -1
- package/dist/server/utils/clef.d.ts +1 -0
- package/dist/server/utils/composio.d.ts +2 -0
- package/dist/server/utils/redactSecrets.d.ts +6 -0
- package/package.json +1 -1
- package/dist/FlowEngine-H3QNWZVB.js +0 -1
- package/dist/chunk-6JUKM6LT.js +0 -10
- package/dist/chunk-DEW7U7V7.js +0 -23
- package/dist/chunk-QEZQZG6Z.js +0 -3
- package/dist/chunk-RFWFJGER.js +0 -1
- package/dist/chunk-XXB57DMN.js +0 -1
- package/dist/composioDirectTool-XOKIM5FJ.js +0 -1
- package/dist/composioTool-C4KZMI4Q.js +0 -1
- package/dist/httpTool-RT5CTG4O.js +0 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { OutVar } from './var-scope';
|
|
2
|
+
export type ClefModel = 'clef-omni' | 'clef' | 'clef-flash';
|
|
3
|
+
export type ClassifierRoute = 'class' | 'uncertain' | 'blocked' | 'error';
|
|
4
|
+
export type ClassifierCheck = {
|
|
5
|
+
id: string;
|
|
6
|
+
type: 'noul';
|
|
7
|
+
instructions: string;
|
|
8
|
+
criteria?: {
|
|
9
|
+
true?: string;
|
|
10
|
+
false?: string;
|
|
11
|
+
};
|
|
12
|
+
guard?: {
|
|
13
|
+
threshold: number;
|
|
14
|
+
};
|
|
15
|
+
} | {
|
|
16
|
+
id: string;
|
|
17
|
+
type: 'score';
|
|
18
|
+
instructions: string;
|
|
19
|
+
levels: string[];
|
|
20
|
+
};
|
|
21
|
+
export interface ClassifierData {
|
|
22
|
+
label?: string;
|
|
23
|
+
model: ClefModel;
|
|
24
|
+
question: string;
|
|
25
|
+
input: {
|
|
26
|
+
message: string;
|
|
27
|
+
historyTurns: number;
|
|
28
|
+
vars: string[];
|
|
29
|
+
};
|
|
30
|
+
options: Array<{
|
|
31
|
+
id: string;
|
|
32
|
+
label: string;
|
|
33
|
+
criteria: string;
|
|
34
|
+
}>;
|
|
35
|
+
checks: ClassifierCheck[];
|
|
36
|
+
confidence: {
|
|
37
|
+
threshold: number;
|
|
38
|
+
margin: number;
|
|
39
|
+
};
|
|
40
|
+
outVars?: OutVar[];
|
|
41
|
+
}
|
|
42
|
+
export interface ClassifierScore {
|
|
43
|
+
score: number;
|
|
44
|
+
/** Description of the highest probability level (levels are zero indexed). */
|
|
45
|
+
level: string;
|
|
46
|
+
confidence: number;
|
|
47
|
+
probabilities: Record<string, number>;
|
|
48
|
+
}
|
|
49
|
+
export interface ClassifierResult {
|
|
50
|
+
classification: string;
|
|
51
|
+
label: string;
|
|
52
|
+
confidence: number;
|
|
53
|
+
margin: number;
|
|
54
|
+
probabilities: Record<string, number>;
|
|
55
|
+
route: ClassifierRoute;
|
|
56
|
+
checks: Record<string, number | ClassifierScore>;
|
|
57
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ClefModel } from '../types/classifier-types';
|
|
2
|
+
/** Prefixes inside a prose run are excluded: completing the run would lower B.
|
|
3
|
+
* Costs at the remaining boundaries are monotone and exact before rounding.
|
|
4
|
+
* Offsets refer to the original string and never split a surrogate pair.
|
|
5
|
+
*/
|
|
6
|
+
export declare function clefPrefixCosts(value: string, model: ClefModel): {
|
|
7
|
+
boundaries: {
|
|
8
|
+
end: number;
|
|
9
|
+
encodedEnd: number;
|
|
10
|
+
bytes: number;
|
|
11
|
+
}[];
|
|
12
|
+
cuts: {
|
|
13
|
+
index: number;
|
|
14
|
+
hundredths: number;
|
|
15
|
+
}[];
|
|
16
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { ClassifierData, ClassifierResult, ClefModel } from '../types/classifier-types';
|
|
2
|
+
/** Minimal Workers AI contract; independent of generated Env and server modules. */
|
|
3
|
+
export interface ClefAiBinding {
|
|
4
|
+
run(model: string, input: unknown, opts?: unknown): Promise<unknown>;
|
|
5
|
+
}
|
|
6
|
+
export interface ClefHistoryMessage {
|
|
7
|
+
role: 'user' | 'assistant';
|
|
8
|
+
type: string;
|
|
9
|
+
content: unknown;
|
|
10
|
+
}
|
|
11
|
+
export interface ClefState {
|
|
12
|
+
message: string;
|
|
13
|
+
history: Array<{
|
|
14
|
+
role: 'user' | 'assistant';
|
|
15
|
+
text: string;
|
|
16
|
+
}>;
|
|
17
|
+
vars: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
declare const TRUNCATION_WARNING: unique symbol;
|
|
20
|
+
export interface ClefRequest extends Record<string, unknown> {
|
|
21
|
+
readonly [TRUNCATION_WARNING]?: string;
|
|
22
|
+
model: ClefModel;
|
|
23
|
+
state: ClefState;
|
|
24
|
+
questions: Record<string, unknown>;
|
|
25
|
+
}
|
|
26
|
+
export interface ClefUsage {
|
|
27
|
+
promptTokens: number;
|
|
28
|
+
completionTokens: 0;
|
|
29
|
+
totalTokens: number;
|
|
30
|
+
}
|
|
31
|
+
export interface ParsedClefResponse {
|
|
32
|
+
result: ClassifierResult;
|
|
33
|
+
usage: ClefUsage;
|
|
34
|
+
}
|
|
35
|
+
export declare function buildClefRequest(data: ClassifierData, state: ClefState): ClefRequest;
|
|
36
|
+
/** Lab Formula B: prose/dense UTF-8 bytes plus question/option template overhead.
|
|
37
|
+
* Calibrated against real usage; not a universal tokenizer bound.
|
|
38
|
+
*/
|
|
39
|
+
export declare function estimateClefTokens(request: ClefRequest): number;
|
|
40
|
+
export declare function clefTruncationWarning(request: ClefRequest): string | undefined;
|
|
41
|
+
export declare function runClef(ai: ClefAiBinding, model: ClefModel, request: ClefRequest, { timeoutMs }?: {
|
|
42
|
+
timeoutMs?: number;
|
|
43
|
+
}): Promise<unknown>;
|
|
44
|
+
/** Official schema: answers.route.choice, noul.noul, score.score/legend/probabilities. */
|
|
45
|
+
export declare function parseClefResponse(response: unknown, data: ClassifierData): ParsedClefResponse;
|
|
46
|
+
export declare function classifierErrorResult(): ClassifierResult;
|
|
47
|
+
/** A turn starts at a user message. Excludes the current persisted user message when provided. */
|
|
48
|
+
export declare function selectClefHistory(messages: ClefHistoryMessage[], turns: number, currentMessage?: unknown): ClefState['history'];
|
|
49
|
+
export {};
|
package/dist/common.d.ts
CHANGED
|
@@ -19,3 +19,8 @@ export * from './common/utils/agentMemory';
|
|
|
19
19
|
export * from './common/types/crawl-types';
|
|
20
20
|
export * from './common/utils/crawlClient';
|
|
21
21
|
export * from './common/constants/tenant-only-nodes';
|
|
22
|
+
export * from './common/types/classifier-types';
|
|
23
|
+
export * from './common/types/classifier-validation';
|
|
24
|
+
export * from './common/constants/clef-models';
|
|
25
|
+
export * from './common/utils/clef';
|
|
26
|
+
export * from './common/flow-graph';
|
package/dist/common.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as
|
|
1
|
+
import{a as ib,b as jb,c as kb,d as lb}from"./chunk-J67BCWE3.js";import{$ as Ca,A as ba,Aa as cb,B as ca,Ba as db,C as da,Ca as eb,D as ea,Da as fb,E as fa,Ea as gb,F as ga,Fa as hb,G as ha,H as ia,I as ja,J as ka,K as la,L as ma,M as na,N as oa,O as pa,P as qa,Q as ra,R as sa,S as ta,T as ua,U as va,V as wa,W as xa,X as ya,Y as za,Z as Aa,_ as Ba,a as b,aa as Da,b as h,ba as Ea,c as i,ca as Fa,d as j,da as Ha,e as k,ea as Ia,f as l,fa as Ja,g as m,ga as Ka,h as n,ha as La,i as o,ia as Ma,j as p,ja as Na,k as q,ka as Oa,l as r,la as Pa,m as s,ma as Qa,n as t,na as Ra,o as u,oa as Sa,p as v,pa as Ta,q as w,qa as Ua,r as x,ra as Va,s as y,sa as Wa,t as z,ta as Xa,u as A,ua as Ya,v as F,va as Za,w as G,wa as _a,x as H,xa as $a,y as $,ya as ab,z as aa,za as bb}from"./chunk-YXG3ZEUP.js";import{A as Z,B as _,a as c,b as d,c as e,d as f,e as g,f as B,g as C,h as D,i as E,j as I,k as J,l as K,m as L,n as M,o as N,p as O,q as P,r as Q,s as R,t as S,u as T,v as U,w as V,x as W,y as X,z as Y}from"./chunk-KKJW6HJA.js";import{a as Ga}from"./chunk-HJPR76HF.js";import{a}from"./chunk-U56YWPSI.js";import"./chunk-3TXHFKDN.js";export{m as CLASSIFIER_DEFAULTS,n as CLASSIFIER_RESERVED_HANDLES,l as CLEF_MODELS,v as CRAWL_DEFAULTS,w as CRAWL_LIMITS,ba as DEFAULT_MEMORY_LENGTH,ca as DEFAULT_MEMORY_MODEL,d as FLOW_INPUT_NAME_RE,Qa as GENERATION_PARAM_KEYS,Sa as GENERATION_PRESETS,ua as ISSUE_SEVERITY,i as MAX_USER_IDENTITY_LENGTH,$ as MEMORY_LENGTH_MD_LINES,aa as MEMORY_LENGTH_TOKENS,ib as MODEL_REGISTRY_SNAPSHOT,F as NODE_CATALOG,c as NodeType,B as OUT_VAR_NAME_RE,Ra as PRESET_PARAM_KEYS,cb as REASONING_EFFORT_LEVELS,kb as TENANT_ONLY_NODES,Ia as TOOL_REGISTRY_SNAPSHOT,R as VariableResolutionError,p as WORKER_GRAPH_DEFS,q as WORKER_GRAPH_SCHEMA,r as WORKER_OP_SCHEMA,Fa as WORKER_TEMPLATES,Va as applyPresetToOverrides,Da as applyWorkerOps,Ja as buildClefRequest,x as buildCrawlRequestBody,hb as buildReasoningProviderOptions,K as buildScope,g as buildTriggerMessageText,Ba as canonicalGraph,ha as capMemoryContent,Oa as classifierErrorResult,o as classifierHandle,Ha as classifierIdFromLabel,ya as classifyIssues,La as clefTruncationWarning,sa as collectExternalRefs,qa as collectNodeRefs,y as crawlRequestKey,G as defaultNodeData,Ta as deriveParamSupport,Ea as detectInlineCredentials,Ca as diffGraphs,za as edgeId,Ga as enabledComposioSlugs,Ka as estimateClefTokens,ga as estimateTokens,U as extractOutVarValues,Y as extractTemplateReferences,oa as extractUserKeypoints,L as findScopedSourceNode,I as getAncestorNodeIds,C as getDefaultOutVars,E as getEffectiveOutVars,e as getFlowInputDefs,jb as getModelEntry,M as getRefTail,J as getUpstreamOutVars,N as isBinaryOutVar,O as isJsonContentType,lb as isNodeTypeAllowedForTenant,ia as isStartMemoryEnabled,xa as issueFingerprint,a as logc,ma as looksLikeTranscript,la as memoryGenerationMaxTokens,fa as memoryMdLineLimit,ea as memoryTokenLimit,pa as mergeKeypointMemory,b as messageTypes,ta as newExternalRefs,Aa as nextNodeId,Xa as normalizeEffectiveParams,f as normalizeFlowInputs,db as normalizeReasoning,_a as openAiReasoningParamSupport,Za as openAiStandardParamSupport,Na as parseClefResponse,da as parseMemoryLength,P as parsePayloadText,X as parseTemplateExpression,k as parseUserAuth,h as parseUserMessage,t as parseWorkerGraph,u as parseWorkerOps,Wa as pickNodeOverrides,Q as readFetchPayload,eb as reasoningEffortLevels,fb as reasoningExposable,W as resolveOutVarRef,T as resolveOutVarValue,Ua as resolvePreset,gb as resolveReasoningEffort,V as resolveReference,_ as resolveTemplate,ra as rewriteNodeDataRefs,Z as rewriteTemplateNodeRefs,Ma as runClef,A as runCrawl,na as sanitizeMemoryDocument,j as sanitizeUserIdentity,s as schemaErrors,Pa as selectClefHistory,z as shapeCrawlOutput,ka as startMemoryLength,ja as startMemoryModel,bb as stripUnsupportedFromNodeData,Ya as toStreamTextSettings,wa as validateAuthoring,H as validateClassifierData,va as validateFlowStructure,D as validateOutVars,S as walkPath,ab as workersAiParamSupport,$a as xaiParamSupport};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a}from"./chunk-3D77ZXDC.js";import"./chunk-EHOK5FW2.js";import"./chunk-HJPR76HF.js";import"./chunk-3TXHFKDN.js";export{a as executeComposioDirectTool};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a}from"./chunk-AKJFVR6J.js";import"./chunk-EHOK5FW2.js";import"./chunk-HJPR76HF.js";import"./chunk-U56YWPSI.js";import"./chunk-3TXHFKDN.js";export{a as loadComposioTools};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{d as a,e as b}from"./chunk-Z4CYLB7J.js";import"./chunk-KKJW6HJA.js";import"./chunk-V6JSMX5A.js";import"./chunk-U56YWPSI.js";import"./chunk-3TXHFKDN.js";export{a as customHttpTool,b as default};
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import{a as k,b as
|
|
2
|
-
`)}function
|
|
3
|
-
`)}function
|
|
1
|
+
import{a as k,b as Cr,c as De,d as $e,e as ss,f as je,g as os,h as Ke,i as as}from"./chunk-V43Y4KSA.js";import"./chunk-3D77ZXDC.js";import{c as Pr}from"./chunk-Z4CYLB7J.js";import"./chunk-AKJFVR6J.js";import"./chunk-EHOK5FW2.js";import"./chunk-3K4IMMLP.js";import{a as is,b as cs,c as ls,d as us}from"./chunk-J67BCWE3.js";import{$ as kr,A as lr,Aa as es,B as ur,Ba as ts,C as dr,Ca as ns,D as _e,Da as rs,E as L,Ea as Le,F as pr,Fa as He,G as Ue,H as be,I as Oe,J as ve,K as Ce,L as Pe,M as J,N as Ne,O as Me,P as fr,Q as mr,R as gr,S as yr,T as hr,U as wr,V as Rr,W as Sr,X as Er,Y as Ir,Z as xr,_ as Tr,a as I,aa as Ar,b as ke,ba as _r,c as wn,ca as Ur,d as P,da as Or,e as Ae,ea as vr,f as Rn,fa as Nr,g as Sn,ga as Mr,h as En,ha as Dr,i as In,ia as $r,j as xn,ja as Fr,k as Tn,ka as Lr,l as kn,la as Hr,m as An,ma as jr,n as _n,na as Kr,o as Un,oa as qr,p as bn,pa as Gr,q as On,qa as Wr,r as vn,ra as Xr,s as Cn,sa as zr,t as Pn,ta as Vr,u as Nn,ua as Fe,v as Ln,va as Jr,w as Hn,wa as Yr,x as jn,xa as Br,y as ir,ya as Zr,z as cr,za as Qr}from"./chunk-YXG3ZEUP.js";import{A as or,B as ar,a as F,b as yn,c as xe,d as hn,e as Te,f as Mn,g as Dn,h as $n,i as Fn,j as Kn,k as qn,l as Gn,m as Wn,n as Xn,o as zn,p as Vn,q as Jn,r as Yn,s as Bn,t as Zn,u as Qn,v as er,w as tr,x as nr,y as rr,z as sr}from"./chunk-KKJW6HJA.js";import{a as br}from"./chunk-HJPR76HF.js";import{a as cn}from"./chunk-RYHQGPX5.js";import{a as ln}from"./chunk-R6EKV3WR.js";import{a as pn}from"./chunk-6HY7QUMP.js";import{a as un,b as dn}from"./chunk-V6JSMX5A.js";import{a as gn}from"./chunk-Q7QHJJGR.js";import{a as b,b as C,c as fn,d as mn}from"./chunk-YLDLDEUP.js";import{a as Ie}from"./chunk-U56YWPSI.js";import"./chunk-YHXUBVN2.js";import"./chunk-3TXHFKDN.js";import{Agent as nt}from"agents";import{nanoid as qt}from"nanoid";async function St(t){t.sql`CREATE TABLE IF NOT EXISTS messages (id TEXT PRIMARY KEY, role TEXT NOT NULL, type TEXT NOT NULL, content TEXT NOT NULL, ts INTEGER NOT NULL)`}async function qe(t,e){t.sql`INSERT INTO messages (id, role, type, content, ts) VALUES (${e.id}, ${e.role}, ${e.type}, ${e.content}, ${e.ts})`}async function O(t){return t.sql`SELECT id, role, type, content, ts FROM messages ORDER BY ts ASC`}async function H(t){t.sql`DELETE FROM messages`}async function Ge(t){await St(t)}function Y(t){return{"Content-Type":"application/json",Authorization:t.HX_API_KEY}}function j(t){return!!(t!=null&&t.HX_ORA_URL)&&!!(t!=null&&t.HX_API_KEY)}var Et="anonymous:";function We(t,e){return(t==null?void 0:t.trim())||`${Et}${e}`}async function B(t,e){if(!j(t))return null;let r=await fetch(`${t.HX_ORA_URL}/internal/runs`,{method:"POST",headers:Y(t),body:JSON.stringify(e)});return r.ok?await r.json():(console.error("[oraTriggers] createRun failed",r.status,await r.text().catch(()=>"")),null)}async function N(t,e){if(!j(t))return{claimed:!0};let r=await fetch(`${t.HX_ORA_URL}/internal/runs/${encodeURIComponent(e)}/claim`,{method:"POST",headers:Y(t)});if(!r.ok){let n=await r.text().catch(()=>"");throw new Error(`claimRun ${e} failed with ${r.status}: ${n}`)}return await r.json()}async function K(t,e,r,n=3){if(!j(t))return!0;for(let s=1;s<=n;s++){try{let a=await fetch(`${t.HX_ORA_URL}/internal/runs/${encodeURIComponent(e)}/complete`,{method:"POST",headers:Y(t),body:JSON.stringify(r)});if(a.ok||a.status===409)return!0;if(a.status===404)return console.error(`[oraTriggers] completeRun ${e} rejected with 404`),!1;console.warn(`[oraTriggers] completeRun ${e} attempt ${s} failed with ${a.status}`)}catch(a){console.warn(`[oraTriggers] completeRun ${e} attempt ${s} threw`,a)}s<n&&await new Promise(a=>setTimeout(a,250*s))}return console.error(`[oraTriggers] completeRun ${e} exhausted ${n} attempts; hx-ora will time the run out`),!1}async function Xe(t,e){if(!j(t))return Promise.resolve();try{return await B(t,e)}catch(r){return console.error("[oraTriggers] recordRun failed",r),null}}var Z=Object.freeze({}),It="__SYSTEM_";function Q(t){return t.startsWith(It)}function xt(t){let e={};for(let[r,n]of Object.entries(t))Q(r)||(e[r]=n);return Object.freeze(e)}function q(t){return(typeof t=="string"?t.trim():"")||"default"}async function ze(t,e,r){if(!e)return Z;let n=q(r);if(t.HX_ORA_URL&&t.HX_API_KEY)try{let a=new URL(`${t.HX_ORA_URL.replace(/\/$/,"")}/internal/secrets`);a.searchParams.set("org",n);let o=await fetch(a,{headers:{Authorization:t.HX_API_KEY}});if(o.ok){let i=await o.json();if(i.secrets)return xt(i.secrets)}else console.warn(`[secrets] API failed with status ${o.status}, falling back to KV`)}catch(a){console.error("[secrets] API request failed, falling back to KV",a)}let s=t.ORA_SECRETS;if(!s)return Z;try{let a={};return await Tt(s,`${e}:${n}:`,a),n==="default"&&await kt(s,e,a),Object.freeze(a)}catch(a){return console.error("[secrets] failed to load tenant secrets from KV",{tenant:e,org:n,err:a}),Z}}async function Tt(t,e,r){let n=await t.list({prefix:e,limit:1e3});n.list_complete===!1&&console.warn(`[secrets] prefix=${e} exceeded list page; truncating to first 1000 keys`);let s=n.keys.filter(o=>{let i=o.name.slice(e.length);return i.length>0&&!i.includes(":")&&!Q(i)}),a=await Promise.all(s.map(async o=>{let i=await t.get(o.name);return i!==null?[o.name.slice(e.length),i]:null}));for(let o of a){if(!o)continue;let[i,c]=o;i&&(r[i]=c)}}async function kt(t,e,r){let n=`${e}:`,s=await t.list({prefix:n,limit:1e3});s.list_complete===!1&&console.warn(`[secrets] tenant=${e} legacy secrets exceeded list page; truncating to first 1000 keys`);let a=s.keys.filter(i=>{let c=i.name.slice(n.length);return c.length>0&&!c.includes(":")&&!Q(c)}),o=await Promise.all(a.map(async i=>{let c=i.name.slice(n.length);if(c in r)return null;let l=await t.get(i.name);return l!==null?[c,l]:null}));for(let i of o){if(!i)continue;let[c,l]=i;c&&(r[c]=l)}}function G(t){var s;let e=((s=t==null?void 0:t.flowData)==null?void 0:s.state)??(t==null?void 0:t.flowData),n=((e==null?void 0:e.nodes)??[]).find(a=>a.type==="startNode");return n==null?void 0:n.data}import{nanoid as Lt}from"nanoid";import{streamText as At}from"ai";var _t={short:`Up to ${L("short")} markdown lines (one fact or bullet per line). Keep constraints, working agreements, and the outline of anything already settled.`,medium:`Up to ${L("medium")} markdown lines. Group bullets by whatever this session is about (actors, constraints, decisions, current plan/state, open work). Under-remembering is worse than a few extra lines.`,long:`Up to ${L("long")} markdown lines. Same as medium, with one-line context on a decision or plan block when later turns will need it.`},Ut=12,bt=400,Ve=700;function Ot(t,e=Ut){let r=t.filter(s=>s.role==="user"||s.role==="assistant").slice(-e),n=[];for(let s of r){let a=typeof s.content=="string"?s.content:JSON.stringify(s.content??""),o=s.role==="assistant"?Ve:bt,i=a.trim().replace(/\s+/g," ").slice(0,o);i&&n.push(`${s.role==="user"?"U":"A"}: ${i}`)}return n.join(`
|
|
2
|
+
`)}function vt(t){let e=t??{},r=e.promptTokens??e.inputTokens??0,n=e.completionTokens??e.outputTokens??0,s=e.totalTokens??r+n;return{promptTokens:r,completionTokens:n,totalTokens:s}}function Ct(t){var e;for(let r=t.length-1;r>=0;r--)if(((e=t[r])==null?void 0:e.role)==="assistant"&&typeof t[r].content=="string")return t[r].content;return""}function Pt(t){var s,a;let e=((s=t.flowData)==null?void 0:s.state)??t.flowData,r=(e==null?void 0:e.nodes)??[],n=[];for(let o of r){if(o.type!=="answerNode")continue;let i=(a=t.results)==null?void 0:a[o.id];i!=null&&n.push(typeof i=="string"?i:JSON.stringify(i))}return n.join(`
|
|
3
|
+
`)}function Nt(t){var n;let e=["You maintain a KEYPOINT memory for one agent session so later turns can continue without re-asking.",`Hard limit: ${t.maxTokens} tokens.`,_t[t.length],"The session domain is unknown: personal, operational, technical, or mixed. Do not assume a personal-coaching frame.","Store facts that will still matter: who/what is in play, constraints and invariants, preferences, decisions, current state of the work, and the outline of anything the user accepted or asked to keep.","When something was confirmed (a plan, a process, a design, a sequence), keep a compact outline \u2014 enough to resume the next part \u2014 not the assistant\u2019s full wording.","Keep earlier facts unless the user superseded them. Merge, update, dedupe. Do not collapse memory to a single identity line plus one decision.","Never copy the conversation. Never write User:/Assistant:/U:/A: lines. Drop greetings, filler, and unanswered assistant questions.","If this turn added nothing durable, return the current memory unchanged.","If memory is empty and nothing durable happened, return exactly: (none)","Use the same language as the user. Return only the bullet list \u2014 no preamble."].join(" "),r=["Current keypoint memory:",'"""',t.previous.trim()||"(empty)",'"""',"","Recent session (for extraction only; do not transcribe):",'"""',((n=t.recentTurns)==null?void 0:n.trim())||"(none)",'"""',"","This turn:",`User said: ${t.userText.trim()||"(empty)"}`,t.assistantText.trim()?`Latest assistant reply (extract accepted plan/facts only): ${t.assistantText.trim().slice(0,Ve)}`:"",t.answers.trim()?`Answer outputs:
|
|
4
4
|
${t.answers.trim()}`:""].filter(Boolean).join(`
|
|
5
|
-
`);return{system:e,user:r}}function bt(t){return Ce(t.previous,ve(t.userText),t.maxTokens)}async function Ot(t){let e="",r;for await(let n of t.fullStream)n.type==="text-delta"&&(e+=n.text??n.delta??""),n.type==="error"&&(r=n.error instanceof Error?n.error.message:String(n.error??"stream error"));return{text:e.trim(),error:r}}async function vt(t){if(t.fullStream&&typeof t.fullStream[Symbol.asyncIterator]=="function")return Ot({fullStream:t.fullStream});try{return{text:((typeof t.text=="string"?t.text:await t.text)||"").trim()}}catch(e){return{text:"",error:e instanceof Error?e.message:String(e)}}}async function Xe(t){var l;let e=G(t.engineState);if(!e)return{status:"skipped",reason:"start_node_missing"};if(!Ae(e))return{status:"skipped",reason:"memory_disabled"};let r=_e(e),n=Te(r),s=Ue(e),a=J(t.previousContent||""),o=At(t.messages),i=Ut(t.engineState),c=u=>{let m=bt({previous:a,userText:t.userText,maxTokens:n});return{status:"written",content:m,truncated:!1,modelId:s,fallback:!0,error:m?void 0:u}};try{let u=await Fe(s,t.sessionEnv,{maxOutputTokens:n});if(!u)throw new Error(`Memory model '${s}' not found in registry`);let m=be(r,(l=u.reasoning)==null?void 0:l.kind),{system:f,user:p}=_t({previous:a,userText:t.userText,assistantText:o,answers:i,length:r,maxTokens:n,recentTurns:Tt(t.messages)}),g=De(u.reasoning),y=$e(u.provider,{effort:g,exposeReasoning:!1,maxTokens:m}),w=St({model:u.modelHandle,system:f,messages:[{role:"user",content:p}],...Me({...u.effectiveParams??{},maxOutputTokens:m}),...y?{providerOptions:y}:{}}),R=await vt(w),S=kt(await w.usage),U=J(R.text);if(Oe(U)&&(U=""),!U)return{...c(R.error||"Memory model returned empty text"),usage:S};let T=ke(U,n);return{status:"written",content:T.content,truncated:T.truncated,usage:S,modelId:s}}catch(u){let m=u instanceof Error?u.message:"Memory update failed";return console.error("Memory update failed:",u),c(m)}}async function ze(t,e){var n,s;let r=(n=e==null?void 0:e.flowData)==null?void 0:n.flowId;if(!(t!=null&&t.HX_CORE_URL)||!r)return{engineState:e,refreshed:!1};try{let a=await C(r,t),o={...e,flowData:{...a,tenant:e.flowData.tenant,flowId:r,chatId:e.flowData.chatId}},i=a==null?void 0:a.stateVersion,c=typeof i=="number"&&i!==((s=e.flowData)==null?void 0:s.stateVersion);return{engineState:o,refreshed:c}}catch(a){return console.error(`[flowRefresh] fetch failed for flow ${r}:`,a),{engineState:e,refreshed:!1}}}function Ve(t,e){return!t||!t.HX_ORA_URL||!t.HX_API_KEY?Promise.resolve():fetch(`${t.HX_ORA_URL}/internal/sessions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:t.HX_API_KEY},body:JSON.stringify(e)}).catch(r=>{console.error("[sessionIndex] failed to index session",r)})}var Je=async(t,e)=>{fetch(`${e.DW_URL}/q/telemetry/event`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),`${JSON.stringify(t)}`};async function M(t,e){var a;let r=t.id||t.name||"",[n,s]=String(r).split("::");if(!n||!s)return null;try{let i=(a=(await b(n,e)).metadata)==null?void 0:a.tenant,l={flowData:{...await C(n,e),tenant:i,flowId:n,chatId:s},executedNodes:[],context:{}};return t.setState({...t.state,engineState:l}),l}catch(o){return console.error("Failed to initialize engine state:",o),null}}async function Pt(t,e,r){var n;if(e&&t.HX_CORE_URL&&t.HX_API_KEY)try{let s=await b(e,t),a=(n=s==null?void 0:s.metadata)==null?void 0:n.org;if(typeof a=="string"&&a.trim())return q(a)}catch(s){console.warn(`[secrets] could not read org for flow ${e}`,s)}return q(r)}async function D(t){var re,se,oe,ae,ie,ce,le,ue,de,pe,fe;let{agent:e,env:r,ctx:n,payload:s,connection:a}=t,o=Date.now(),i=[],c=t.runId?Pe():void 0,l=async()=>await O(e),u=async d=>{await He(e,d)},m=async d=>{if(e.state.modelsCache&&e.state.modelsCache[d])return e.state.modelsCache[d];try{let{fetchOraModel:h}=await import("./oraApi-YIJGMXX7.js"),x=await h(d,r);return e.setState({...e.state,modelsCache:{...e.state.modelsCache||{},[d]:x}}),x}catch(h){throw console.error(`Error fetching model ${d}:`,h),h}},f={id:Ct(),role:"user",type:"text",content:s.text,images:s.images,ts:Date.now()};await u(f);let p={onChangeState:d=>{e.setState({...e.state,engineState:d})},onServerEvent:async d=>{var h;await((h=t.onServerEvent)==null?void 0:h.call(t,d)),i.push(d)},onTelemetry:async d=>{var _,me,ge,ye,he,we;let h=t.user,x=typeof(h==null?void 0:h.org)=="string"&&h.org.trim()?h.org.trim():"default";await Je({...d,userId:t.resolveUserId(),tenant:((me=(_=e.state.engineState)==null?void 0:_.flowData)==null?void 0:me.tenant)||"",org:x,flowId:((ye=(ge=e.state.engineState)==null?void 0:ge.flowData)==null?void 0:ye.flowId)||"",sessionId:((we=(he=e.state.engineState)==null?void 0:he.flowData)==null?void 0:we.chatId)||""},r)},onError:d=>{var h;(h=t.onError)==null||h.call(t,d),e.setState({...e.state,error:d})},shouldStop:t.shouldStop},g=e.state.engineState?{...e.state.engineState}:null;if(g){let{engineState:d,refreshed:h}=await ze(r,g);g=d,h&&e.setState({...e.state,engineState:g,modelsCache:{}})}else if(g=await M(e,r),!g){let d="Failed to initialize agent";return p.onError(d),{status:"failed",error:d}}let y=t.user??void 0,w=(re=g.flowData)==null?void 0:re.tenant,R=await Pt(r,(se=g.flowData)==null?void 0:se.flowId,y==null?void 0:y.org),S=w?await Ge(r,w,R):{};(oe=t.onSecretsLoaded)==null||oe.call(t,S),g={...g,context:{...g.context||{},user:y}},e.setState({...e.state,user:y,engineState:g});let U={env:r,ctx:n,conn:a,getMessages:l,setMessages:u,getOraModel:m,secrets:S,userAuth:t.userAuth,user:y,composioSessions:t.composioSessions,publicOrigin:t.publicOrigin,skillRefCache:t.skillRefCache,runId:t.runId,outputCollector:c,agentMemory:typeof((ae=e.state.memory)==null?void 0:ae.content)=="string"?e.state.memory.content:"",shouldStop:t.shouldStop,workerStack:(ie=g.flowData)!=null&&ie.flowId?[g.flowData.flowId]:[],workerCalls:{count:0}},T=await Le(U,g,p)(s),E=e.state.engineState??g;if(T.status==="completed")try{let d=await Xe({sessionEnv:U,engineState:E,previousContent:typeof((ce=e.state.memory)==null?void 0:ce.content)=="string"?e.state.memory.content:"",userText:s.text||"",messages:await l()});if(d.status==="skipped")await p.onServerEvent({type:"agent:memory",content:{skipped:!0,reason:d.reason},timestamp:Date.now()});else if(!d.content.trim())await p.onServerEvent({type:"agent:memory",content:{updated:!1,empty:!0,error:d.error,fallback:d.fallback},timestamp:Date.now()});else{let h={promptTokens:((le=E.tokenUsage)==null?void 0:le.promptTokens)??0,completionTokens:((ue=E.tokenUsage)==null?void 0:ue.completionTokens)??0,totalTokens:((de=E.tokenUsage)==null?void 0:de.totalTokens)??0};d.usage&&(h.promptTokens+=d.usage.promptTokens,h.completionTokens+=d.usage.completionTokens,h.totalTokens+=d.usage.totalTokens),E={...E,tokenUsage:h},e.setState({...e.state,engineState:E,memory:{content:d.content,updatedTs:Date.now(),...d.error?{lastError:d.error}:{},...d.fallback?{fallback:!0}:{}}}),await p.onTelemetry({type:"memory_update",payload:{model:d.modelId,truncated:d.truncated,usage:d.usage,fallback:d.fallback,error:d.error}}),await p.onServerEvent({type:"agent:memory",content:{updated:!0,truncated:d.truncated,fallback:d.fallback,error:d.error},timestamp:Date.now()})}}catch(d){let h=d instanceof Error?d.message:"Memory update failed";console.error("Memory update failed:",d),await p.onServerEvent({type:"agent:memory",content:{error:h},timestamp:Date.now()})}if(T.status==="completed"&&t.runId&&(c!=null&&c.hasOutputs())){let{flowId:d,chatId:h}=E.flowData??{};if(!d||!h)T={status:"failed",error:"Structured output persistence requires flowId and sessionId"};else try{await Ne(r,{flowId:d,sessionId:h,runId:t.runId,createdAt:new Date(o).toISOString(),data:c.snapshotData(),answerNodeIds:c.answerNodeIds()});let x={...E.results||{}};for(let _ of c.answerNodeIds())x[_]={...x[_]||{},persisted:!0,runId:t.runId};E={...E,results:x},e.setState({...e.state,engineState:E})}catch(x){let _=x instanceof Error?x.message:"Structured output persistence failed";p.onError(_),await p.onServerEvent({type:"error:answer-output",content:{runId:t.runId,error:_},timestamp:Date.now()}),T={status:"failed",error:_}}}let{tenant:$,flowId:z,chatId:V}=E.flowData??{},ft=(pe=E.flowData)==null?void 0:pe.org;return $&&z&&V&&n.waitUntil(Ve(r,{id:`${z}::${V}`,tenant:$,org:ft,flowId:z,sessionId:V,userId:t.resolveUserId(),title:(fe=s.text)==null?void 0:fe.slice(0,120),turnTs:o,events:i})),e.setState({...e.state,lastUpdated:new Date}),{status:T.status,error:T.error,engineState:E}}import{nanoid as Nt}from"nanoid";function Mt(t){let e=t.headers.get("X-User-Payload");if(!e)return null;try{let r=JSON.parse(e),n=typeof(r==null?void 0:r.email)=="string"?P(r.email):null;return n?{...r,email:n}:null}catch{return null}}async function Ye(t,e,r,n){var s;try{let a=await e.json(),o=a.message;if(!o||typeof o!="string")return new Response(JSON.stringify({error:"Invalid message"}),{status:400,headers:{"content-type":"application/json"}});let i=typeof a.userId=="string"?P(a.userId):null,c=Mt(e),l=c==null?void 0:c.email;c?t.setState({...t.state,user:c,injectedUserId:l}):i&&!((s=t.state.user)!=null&&s.email)&&t.setState({...t.state,injectedUserId:i});let u=()=>l??i??t.state.injectedUserId??void 0;t.skillRefCache||(t.skillRefCache=new Map);let m=a.inputs&&typeof a.inputs=="object"?a.inputs:void 0;if(!t.state.engineState&&!await M(t,r))return new Response(JSON.stringify({error:"Failed to initialize agent"}),{status:500,headers:{"content-type":"application/json"}});let f=`run-${Nt(12)}`;await t.registerManualRun(f,o,u()),await N(r,f).catch(w=>{console.warn(`[AgentHTTP] could not mark manual run ${f} as running`,w)});let p;try{p=await D({agent:t,env:r,ctx:n,payload:{text:o,inputs:m},skillRefCache:t.skillRefCache,user:c??void 0,resolveUserId:u,runId:f,shouldStop:()=>t.isRunStopRequested(f)}),n.waitUntil(t.completeManualRun(f,p.status==="completed"?"succeeded":p.status==="stopped"?"skipped":"failed",p.error))}finally{await t.clearRunStopRequest(f)}if(p.status==="failed")return new Response(JSON.stringify({error:p.error||"Agent execution failed"}),{status:500,headers:{"content-type":"application/json"}});if(p.status==="stopped")return new Response(JSON.stringify({error:p.error||"Stopped by user"}),{status:409,headers:{"content-type":"application/json"}});let y=(await O(t)).reverse().find(w=>w.role==="assistant");return new Response(JSON.stringify({answer:(y==null?void 0:y.content)||""}),{headers:{"content-type":"application/json"}})}catch(a){return new Response(JSON.stringify({error:a.message}),{status:500,headers:{"content-type":"application/json"}})}}async function Be(t){try{return await H(t),t.skillRefCache&&t.skillRefCache.clear(),t.setState({...t.state,error:"",engineState:void 0,modelsCache:{},lastUpdated:new Date}),new Response(JSON.stringify({success:!0,messages:[]}),{headers:{"content-type":"application/json"}})}catch(e){return new Response(JSON.stringify({error:e.message}),{status:500,headers:{"content-type":"application/json"}})}}var Qe="trigger:nonce:",$t=900*1e3,ee="run:stop:",et=class extends Ze{initialState={user:void 0,injectedUserId:null,sessionId:null,lastUpdated:null,modelsCache:{},memory:void 0};constructor(e,r){super(e,r),this.requireStateValidation()}validateStateChange(e,r){if(r!=="server")throw new Error("Client state updates are forbidden")}requireStateValidation(){if(typeof Ze.prototype.validateStateChange!="function")throw new Error("AgentDO requires agents >= 0.8.7 with validateStateChange; upgrade the tenant SDK")}resolveSessionUserId(){return this.state.injectedUserId??void 0}secrets=Object.freeze({});userAuth={};composioSessions={};skillRefCache=new Map;publicOrigin;async inspectPersistedSession(e){return e==="state"?{state:this.state}:e==="memory"?{memory:this.state.memory??null}:{messages:await O(this)}}async requestRunStop(e){return e!=null&&e.trim()?(await this.ctx.storage.put(`${ee}${e}`,Date.now()),{accepted:!0}):{accepted:!1}}async isRunStopRequested(e){return!!await this.ctx.storage.get(`${ee}${e}`)}async clearRunStopRequest(e){await this.ctx.storage.delete(`${ee}${e}`)}async onRequest(e){this.requireStateValidation();let r=new URL(e.url);if(r.pathname.endsWith("/state"))return new Response(JSON.stringify(this.state),{headers:{"content-type":"application/json"}});if(r.pathname.endsWith("/history")){let n=await O(this);return new Response(JSON.stringify(n),{headers:{"content-type":"application/json"}})}return e.method==="POST"&&r.pathname.endsWith("/message")?Ye(this,e,this.env,this.ctx):e.method==="DELETE"&&r.pathname.endsWith("/clear")?Be(this):new Response("Ready to assist.")}async onConnect(e,r){var f,p,g,y,w;this.requireStateValidation();let[n,s]=e.server.split("::"),o=(f=(await b(n,this.env)).metadata)==null?void 0:f.tenant;this.userAuth={},this.composioSessions={},this.publicOrigin=void 0;let i=null;if(r.request){try{this.publicOrigin=new URL(r.request.url).origin}catch{}let R=r.request.headers.get("X-User-Payload");if(R)try{i=JSON.parse(R)}catch(S){console.warn("Failed to parse X-User-Payload",S)}}e.setState({...e.state,authorizedUser:i});let c=await C(n,this.env);this.setState({...this.state,user:i||null,sessionId:s,engineState:{flowData:{...c,tenant:o,flowId:n,chatId:s},executedNodes:[],context:i?{user:i}:{}}}),i||console.warn("[AgentDO] WebSocket connected without authenticated user \u2014 Composio manual auth requires login (access_token on socket URL)");let l=await O(this);k(e,I.SERVER_HISTORY,JSON.stringify({messages:l}));let m=(((p=c==null?void 0:c.state)==null?void 0:p.nodes)??(c==null?void 0:c.nodes)??[]).find(R=>R.type==="startNode");if(m){let R={allow_images:((g=m.data)==null?void 0:g.allow_images)??!1,allow_documents:((y=m.data)==null?void 0:y.allow_documents)??!1,greeting:(w=m.data)==null?void 0:w.greeting};k(e,I.SERVER_CONFIG,JSON.stringify(R))}}async onMessage(e,r){if(typeof r!="string")return;let n=r.indexOf(":");if(n===-1)return;let s=r.substring(0,n),a=r.substring(n+1);if(!s||!a)return;let i={[I.USER_MESSAGE]:c=>this.onUserMessage(e,c),[I.USER_CLEAR_HISTORY]:()=>this.onClearHistory(e),[I.USER_AUTH]:c=>this.onUserAuth(e,c),[I.USER_IDENTITY]:c=>this.onUserIdentity(e,c)}[s];i&&await i(a)}async onUserMessage(e,r){var i;let n=Ie(r),s=((i=e.state)==null?void 0:i.authorizedUser)??void 0,a=()=>(s==null?void 0:s.email)??this.resolveSessionUserId(),o=`run-${Dt(12)}`;await this.registerManualRun(o,n.text,a()),await N(this.env,o).catch(c=>{console.warn(`[AgentDO] could not mark manual run ${o} as running`,c)});try{let c=await D({agent:this,env:this.env,ctx:this.ctx,payload:n,connection:e,userAuth:this.userAuth,composioSessions:this.composioSessions,publicOrigin:this.publicOrigin,skillRefCache:this.skillRefCache,user:s,resolveUserId:a,runId:o,shouldStop:()=>this.isRunStopRequested(o),onServerEvent:l=>{k(e,I.SERVER_EVENT,JSON.stringify(l))},onError:l=>{k(e,I.SERVER_ERROR,l)},onSecretsLoaded:l=>{this.secrets=l}});this.ctx.waitUntil(this.completeManualRun(o,c.status==="completed"?"succeeded":c.status==="stopped"?"skipped":"failed",c.error))}finally{await this.clearRunStopRequest(o)}}registerManualRun(e,r,n){var c;let{tenant:s,flowId:a,chatId:o}=((c=this.state.engineState)==null?void 0:c.flowData)??{};if(!s||!a||!o)return Promise.resolve();let i=Ke(n||this.resolveSessionUserId(),o);return qe(this.env,{id:e,tenant:s,flowId:a,userId:i,sessionId:o,label:r==null?void 0:r.slice(0,120)})}completeManualRun(e,r,n){return K(this.env,e,{status:r,error:n})}async enqueueTrigger(e){var s;if(!(e!=null&&e.runId)||!(e!=null&&e.flowId))return{queued:!1};if(e.nonce&&!await this.claimTriggerNonce(e.nonce))return console.warn(`[AgentDO] rejected replayed trigger nonce ${e.nonce}`),{queued:!1,duplicate:!0};let r=e.runAsUserId;return r&&!((s=this.state.user)!=null&&s.email)&&this.state.injectedUserId!==r&&this.setState({...this.state,injectedUserId:r}),{queued:!0,taskId:await this.queue("processTrigger",e)}}async claimTriggerNonce(e){let r=`${Qe}${e}`;if(await this.ctx.storage.get(r))return!1;let n=Date.now();await this.ctx.storage.put(r,n);let a=[...(await this.ctx.storage.list({prefix:Qe})).entries()].filter(([,o])=>n-o>$t).map(([o])=>o);return a.length>0&&await this.ctx.storage.delete(a),!0}async processTrigger(e){if(!(await N(this.env,e.runId)).claimed){console.warn(`[AgentDO] activation ${e.activationId} skipped \u2014 run ${e.runId} already claimed`);return}try{this.state.engineState||await M(this,this.env);let n=Se(G(this.state.engineState)),s=Ee(n,e.inputs||{},e.label),a=await D({agent:this,env:this.env,ctx:this.ctx,payload:{text:s,inputs:e.inputs||{}},composioSessions:this.composioSessions,skillRefCache:this.skillRefCache,resolveUserId:()=>e.runAsUserId||this.resolveSessionUserId(),runId:e.runId,shouldStop:()=>this.isRunStopRequested(e.runId),onSecretsLoaded:o=>{this.secrets=o}});await K(this.env,e.runId,{status:a.status==="completed"?"succeeded":a.status==="stopped"?"skipped":"failed",error:a.error})}catch(n){let s=n instanceof Error?n.message:"Trigger execution failed";throw await K(this.env,e.runId,{status:"failed",error:s}),n}finally{await this.clearRunStopRequest(e.runId)}}async onUserIdentity(e,r){let n=P(r);if(!n){k(e,I.SERVER_ERROR,"Invalid identity payload");return}this.setState({...this.state,injectedUserId:n}),k(e,I.SERVER_EVENT,JSON.stringify({type:"info:identity",content:{set:!0}}))}async onUserAuth(e,r){let n=xe(r);if(!n){k(e,I.SERVER_ERROR,"Invalid auth payload");return}let s=n.value.trim();s===""?delete this.userAuth[n.name]:this.userAuth[n.name]=n.value,k(e,I.SERVER_EVENT,JSON.stringify({type:"info:auth",content:{name:n.name,set:s!==""}}))}async onClearHistory(e){await H(this),this.userAuth={},this.composioSessions={},this.skillRefCache.clear(),this.setState({...this.state,error:"",engineState:this.state.engineState,memory:this.state.memory,modelsCache:{},lastUpdated:new Date}),e&&k(e,I.SERVER_HISTORY,JSON.stringify({messages:[]}))}async onStart(){`${JSON.stringify(this.state)}`,await je(this);let e=await O(this);`${JSON.stringify(e)}`}async onClose(e,r,n,s){console.log(`Session closed: ${this.state.sessionId} ${r} - ${n}`)}async onError(e){console.error("AgentDO encountered an error:",e)}};function ws(t){let e=t.state;if(!e)return null;let r=["startNode","answerNode"];for(let n of r)if(!e.nodes.some(a=>a.type===n))return!1;return e.nodes.find(n=>n.type==="startNode")}import{importSPKI as Ft,jwtVerify as Lt}from"jose";function W(t){let e={};if(!t)return e;let r=t.split(";");for(let n of r){let s=n.indexOf("=");if(s>-1){let a=n.slice(0,s).trim(),o=n.slice(s+1).trim();a&&(e[a]=decodeURIComponent(o))}}return e}function Ht(t){return(typeof t.email=="string"?t.email.trim():"")||null}async function v(t,e,r){let n=W(t.headers.get("cookie")),s=new URL(t.url),a=n.access_token||s.searchParams.get("access_token"),o=await jt(e,a);if(o.ok){let i=o.payload,c=Ht(i);return c?{id:i.sub,email:c,name:i.name,first_name:i.given_name,last_name:i.family_name,tenant:i.tenant,org:typeof i.org=="string"?i.org:null,roles:i["ora-roles"],db_name:i.db_name||null,user_id:i.user_id||null}:null}return null}async function jt(t,e){if(!e||typeof e!="string")return{ok:!1,payload:null,protectedHeader:null};if(!t.KC_RS256_PK)throw new Error("PK is not defined");let r=`-----BEGIN PUBLIC KEY-----
|
|
5
|
+
`);return{system:e,user:r}}function Mt(t){return Me(t.previous,Ne(t.userText),t.maxTokens)}async function Dt(t){let e="",r;for await(let n of t.fullStream)n.type==="text-delta"&&(e+=n.text??n.delta??""),n.type==="error"&&(r=n.error instanceof Error?n.error.message:String(n.error??"stream error"));return{text:e.trim(),error:r}}async function $t(t){if(t.fullStream&&typeof t.fullStream[Symbol.asyncIterator]=="function")return Dt({fullStream:t.fullStream});try{return{text:((typeof t.text=="string"?t.text:await t.text)||"").trim()}}catch(e){return{text:"",error:e instanceof Error?e.message:String(e)}}}async function Je(t){var l;let e=G(t.engineState);if(!e)return{status:"skipped",reason:"start_node_missing"};if(!be(e))return{status:"skipped",reason:"memory_disabled"};let r=ve(e),n=_e(r),s=Oe(e),a=J(t.previousContent||""),o=Ct(t.messages),i=Pt(t.engineState),c=u=>{let m=Mt({previous:a,userText:t.userText,maxTokens:n});return{status:"written",content:m,truncated:!1,modelId:s,fallback:!0,error:m?void 0:u}};try{let u=await je(s,t.sessionEnv,{maxOutputTokens:n});if(!u)throw new Error(`Memory model '${s}' not found in registry`);let m=Ce(r,(l=u.reasoning)==null?void 0:l.kind),{system:f,user:p}=Nt({previous:a,userText:t.userText,assistantText:o,answers:i,length:r,maxTokens:n,recentTurns:Ot(t.messages)}),g=Le(u.reasoning),y=He(u.provider,{effort:g,exposeReasoning:!1,maxTokens:m}),w=At({model:u.modelHandle,system:f,messages:[{role:"user",content:p}],...Fe({...u.effectiveParams??{},maxOutputTokens:m}),...y?{providerOptions:y}:{}}),R=await $t(w),S=vt(await w.usage),_=J(R.text);if(Pe(_)&&(_=""),!_)return{...c(R.error||"Memory model returned empty text"),usage:S};let x=Ue(_,n);return{status:"written",content:x.content,truncated:x.truncated,usage:S,modelId:s}}catch(u){let m=u instanceof Error?u.message:"Memory update failed";return console.error("Memory update failed:",u),c(m)}}async function Ye(t,e){var n,s;let r=(n=e==null?void 0:e.flowData)==null?void 0:n.flowId;if(!(t!=null&&t.HX_CORE_URL)||!r)return{engineState:e,refreshed:!1};try{let a=await C(r,t),o={...e,flowData:{...a,tenant:e.flowData.tenant,flowId:r,chatId:e.flowData.chatId}},i=a==null?void 0:a.stateVersion,c=typeof i=="number"&&i!==((s=e.flowData)==null?void 0:s.stateVersion);return{engineState:o,refreshed:c}}catch(a){return console.error(`[flowRefresh] fetch failed for flow ${r}:`,a),{engineState:e,refreshed:!1}}}function Ft(t,e){let r=[],n=s=>{if(s)for(let[a,o]of Object.entries(s))typeof o=="string"&&o.length>=8&&r.push({name:a,value:o})};return n(t),n(e),r.sort((s,a)=>a.value.length-s.value.length),r}function Be(t,e){let r=t;for(let n of e)r.includes(n.value)&&(r=r.split(n.value).join(`[redacted:${n.name}]`));return r}function ee(t,e){if(typeof t=="string")return Be(t,e);if(Array.isArray(t))return t.map(r=>ee(r,e));if(t!==null&&typeof t=="object"){let r={};for(let[n,s]of Object.entries(t))r[Be(n,e)]=ee(s,e);return r}return t}function te(t,e,r){let n=Ft(e,r);return n.length===0?t:ee(t,n)}function Ze(t,e){return!t||!t.HX_ORA_URL||!t.HX_API_KEY?Promise.resolve():fetch(`${t.HX_ORA_URL}/internal/sessions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:t.HX_API_KEY},body:JSON.stringify(e)}).catch(r=>{console.error("[sessionIndex] failed to index session",r)})}var Qe=async(t,e)=>{fetch(`${e.DW_URL}/q/telemetry/event`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),`${JSON.stringify(t)}`};async function M(t,e){var a;let r=t.id||t.name||"",[n,s]=String(r).split("::");if(!n||!s)return null;try{let i=(a=(await b(n,e)).metadata)==null?void 0:a.tenant,l={flowData:{...await C(n,e),tenant:i,flowId:n,chatId:s},executedNodes:[],context:{}};return t.setState({...t.state,engineState:l}),l}catch(o){return console.error("Failed to initialize engine state:",o),null}}async function Ht(t,e,r){var n;if(e&&t.HX_CORE_URL&&t.HX_API_KEY)try{let s=await b(e,t),a=(n=s==null?void 0:s.metadata)==null?void 0:n.org;if(typeof a=="string"&&a.trim())return q(a)}catch(s){console.warn(`[secrets] could not read org for flow ${e}`,s)}return q(r)}async function D(t){var ae,ie,ce,le,ue,de,pe,fe,me,ge,ye;let{agent:e,env:r,ctx:n,payload:s,connection:a}=t,o=Date.now(),i=[],c=t.runId?De():void 0,l=async()=>await O(e),u=async d=>{await qe(e,d)},m=async d=>{if(e.state.modelsCache&&e.state.modelsCache[d])return e.state.modelsCache[d];try{let{fetchOraModel:h}=await import("./oraApi-YIJGMXX7.js"),T=await h(d,r);return e.setState({...e.state,modelsCache:{...e.state.modelsCache||{},[d]:T}}),T}catch(h){throw console.error(`Error fetching model ${d}:`,h),h}},f={id:Lt(),role:"user",type:"text",content:s.text,images:s.images,ts:Date.now()};await u(f);let p={onChangeState:d=>{e.setState({...e.state,engineState:d})},onServerEvent:async d=>{var h;await((h=t.onServerEvent)==null?void 0:h.call(t,d)),i.push(d)},onTelemetry:async d=>{var U,he,we,Re,Se,Ee;let h=t.user,T=typeof(h==null?void 0:h.org)=="string"&&h.org.trim()?h.org.trim():"default";await Qe({...d,userId:t.resolveUserId(),tenant:((he=(U=e.state.engineState)==null?void 0:U.flowData)==null?void 0:he.tenant)||"",org:T,flowId:((Re=(we=e.state.engineState)==null?void 0:we.flowData)==null?void 0:Re.flowId)||"",sessionId:((Ee=(Se=e.state.engineState)==null?void 0:Se.flowData)==null?void 0:Ee.chatId)||""},r)},onError:d=>{var h;(h=t.onError)==null||h.call(t,d),e.setState({...e.state,error:d})},shouldStop:t.shouldStop},g=e.state.engineState?{...e.state.engineState}:null;if(g){let{engineState:d,refreshed:h}=await Ye(r,g);g=d,h&&e.setState({...e.state,engineState:g,modelsCache:{}})}else if(g=await M(e,r),!g){let d="Failed to initialize agent";return p.onError(d),{status:"failed",error:d,path:[]}}let y=t.user??void 0,w=(ae=g.flowData)==null?void 0:ae.tenant,R=await Ht(r,(ie=g.flowData)==null?void 0:ie.flowId,y==null?void 0:y.org),S=w?await ze(r,w,R):{};(ce=t.onSecretsLoaded)==null||ce.call(t,S),g={...g,context:{...g.context||{},user:y}},e.setState({...e.state,user:y,engineState:g});let _={env:r,ctx:n,conn:a,getMessages:l,setMessages:u,getOraModel:m,secrets:S,userAuth:t.userAuth,user:y,composioSessions:t.composioSessions,publicOrigin:t.publicOrigin,skillRefCache:t.skillRefCache,runId:t.runId,outputCollector:c,agentMemory:typeof((le=e.state.memory)==null?void 0:le.content)=="string"?e.state.memory.content:"",shouldStop:t.shouldStop,workerStack:(ue=g.flowData)!=null&&ue.flowId?[g.flowData.flowId]:[],workerCalls:{count:0}},x=await Ke(_,g,p)(s),E=e.state.engineState??g;if(x.status==="completed")try{let d=await Je({sessionEnv:_,engineState:E,previousContent:typeof((de=e.state.memory)==null?void 0:de.content)=="string"?e.state.memory.content:"",userText:s.text||"",messages:await l()});if(d.status==="skipped")await p.onServerEvent({type:"agent:memory",content:{skipped:!0,reason:d.reason},timestamp:Date.now()});else if(!d.content.trim())await p.onServerEvent({type:"agent:memory",content:{updated:!1,empty:!0,error:d.error,fallback:d.fallback},timestamp:Date.now()});else{let h={promptTokens:((pe=E.tokenUsage)==null?void 0:pe.promptTokens)??0,completionTokens:((fe=E.tokenUsage)==null?void 0:fe.completionTokens)??0,totalTokens:((me=E.tokenUsage)==null?void 0:me.totalTokens)??0};d.usage&&(h.promptTokens+=d.usage.promptTokens,h.completionTokens+=d.usage.completionTokens,h.totalTokens+=d.usage.totalTokens),E={...E,tokenUsage:h},e.setState({...e.state,engineState:E,memory:{content:d.content,updatedTs:Date.now(),...d.error?{lastError:d.error}:{},...d.fallback?{fallback:!0}:{}}}),await p.onTelemetry({type:"memory_update",payload:{model:d.modelId,truncated:d.truncated,usage:d.usage,fallback:d.fallback,error:d.error}}),await p.onServerEvent({type:"agent:memory",content:{updated:!0,truncated:d.truncated,fallback:d.fallback,error:d.error},timestamp:Date.now()})}}catch(d){let h=d instanceof Error?d.message:"Memory update failed";console.error("Memory update failed:",d),await p.onServerEvent({type:"agent:memory",content:{error:h},timestamp:Date.now()})}if(x.status==="completed"&&t.runId&&(c!=null&&c.hasOutputs())){let{flowId:d,chatId:h}=E.flowData??{};if(!d||!h)x={status:"failed",error:"Structured output persistence requires flowId and sessionId"};else try{await $e(r,{flowId:d,sessionId:h,runId:t.runId,createdAt:new Date(o).toISOString(),data:c.snapshotData(),answerNodeIds:c.answerNodeIds()});let T={...E.results||{}};for(let U of c.answerNodeIds())T[U]={...T[U]||{},persisted:!0,runId:t.runId};E={...E,results:T},e.setState({...e.state,engineState:E})}catch(T){let U=T instanceof Error?T.message:"Structured output persistence failed";p.onError(U),await p.onServerEvent({type:"error:answer-output",content:{runId:t.runId,error:U},timestamp:Date.now()}),x={status:"failed",error:U}}}let{tenant:$,flowId:z,chatId:V}=E.flowData??{},ht=(ge=E.flowData)==null?void 0:ge.org;$&&z&&V&&n.waitUntil(Ze(r,{id:`${z}::${V}`,tenant:$,org:ht,flowId:z,sessionId:V,userId:t.resolveUserId(),title:(ye=s.text)==null?void 0:ye.slice(0,120),turnTs:o,events:i})),e.setState({...e.state,lastUpdated:new Date});let wt=(E.executedNodes??[]).flatMap(d=>typeof(d==null?void 0:d.id)=="string"?[d.id]:[]),Rt=typeof x.error=="string"?te(x.error,S,t.userAuth):x.error,oe=c!=null&&c.hasOutputs()?te(c.snapshotData(),S,t.userAuth):void 0;return{status:x.status,error:Rt,engineState:E,path:wt,...oe!==void 0?{outputs:oe}:{}}}import{nanoid as jt}from"nanoid";function Kt(t){let e=t.headers.get("X-User-Payload");if(!e)return null;try{let r=JSON.parse(e),n=typeof(r==null?void 0:r.email)=="string"?P(r.email):null;return n?{...r,email:n}:null}catch{return null}}async function et(t,e,r,n){var s;try{let a=await e.json(),o=a.message;if(!o||typeof o!="string")return new Response(JSON.stringify({error:"Invalid message"}),{status:400,headers:{"content-type":"application/json"}});let i=typeof a.userId=="string"?P(a.userId):null,c=Kt(e),l=c==null?void 0:c.email;c?t.setState({...t.state,user:c,injectedUserId:l}):i&&!((s=t.state.user)!=null&&s.email)&&t.setState({...t.state,injectedUserId:i});let u=()=>l??i??t.state.injectedUserId??void 0;t.skillRefCache||(t.skillRefCache=new Map);let m=a.inputs&&typeof a.inputs=="object"?a.inputs:void 0;if(!t.state.engineState&&!await M(t,r))return new Response(JSON.stringify({error:"Failed to initialize agent"}),{status:500,headers:{"content-type":"application/json"}});let f=`run-${jt(12)}`;await t.registerManualRun(f,o,u()),await N(r,f).catch(w=>{console.warn(`[AgentHTTP] could not mark manual run ${f} as running`,w)});let p;try{p=await D({agent:t,env:r,ctx:n,payload:{text:o,inputs:m},skillRefCache:t.skillRefCache,user:c??void 0,resolveUserId:u,runId:f,shouldStop:()=>t.isRunStopRequested(f)}),n.waitUntil(t.completeManualRun(f,p.status==="completed"?"succeeded":p.status==="stopped"?"skipped":"failed",p.error))}finally{await t.clearRunStopRequest(f)}if(p.status==="failed")return new Response(JSON.stringify({error:p.error||"Agent execution failed",runId:f,path:p.path??[]}),{status:500,headers:{"content-type":"application/json"}});if(p.status==="stopped")return new Response(JSON.stringify({error:p.error||"Stopped by user"}),{status:409,headers:{"content-type":"application/json"}});let y=(await O(t)).reverse().find(w=>w.role==="assistant");return new Response(JSON.stringify({answer:(y==null?void 0:y.content)||"",runId:f,path:p.path??[],...p.outputs!==void 0?{outputs:p.outputs}:{}}),{headers:{"content-type":"application/json"}})}catch(a){return new Response(JSON.stringify({error:a.message}),{status:500,headers:{"content-type":"application/json"}})}}async function tt(t){try{return await H(t),t.skillRefCache&&t.skillRefCache.clear(),t.setState({...t.state,error:"",engineState:void 0,modelsCache:{},lastUpdated:new Date}),new Response(JSON.stringify({success:!0,messages:[]}),{headers:{"content-type":"application/json"}})}catch(e){return new Response(JSON.stringify({error:e.message}),{status:500,headers:{"content-type":"application/json"}})}}var rt="trigger:nonce:",Gt=900*1e3,ne="run:stop:",st=class extends nt{initialState={user:void 0,injectedUserId:null,sessionId:null,lastUpdated:null,modelsCache:{},memory:void 0};constructor(e,r){super(e,r),this.requireStateValidation()}validateStateChange(e,r){if(r!=="server")throw new Error("Client state updates are forbidden")}requireStateValidation(){if(typeof nt.prototype.validateStateChange!="function")throw new Error("AgentDO requires agents >= 0.8.7 with validateStateChange; upgrade the tenant SDK")}resolveSessionUserId(){return this.state.injectedUserId??void 0}secrets=Object.freeze({});userAuth={};composioSessions={};skillRefCache=new Map;publicOrigin;async inspectPersistedSession(e){return e==="state"?{state:this.state}:e==="memory"?{memory:this.state.memory??null}:{messages:await O(this)}}async requestRunStop(e){return e!=null&&e.trim()?(await this.ctx.storage.put(`${ne}${e}`,Date.now()),{accepted:!0}):{accepted:!1}}async isRunStopRequested(e){return!!await this.ctx.storage.get(`${ne}${e}`)}async clearRunStopRequest(e){await this.ctx.storage.delete(`${ne}${e}`)}async onRequest(e){this.requireStateValidation();let r=new URL(e.url);if(r.pathname.endsWith("/state"))return new Response(JSON.stringify(this.state),{headers:{"content-type":"application/json"}});if(r.pathname.endsWith("/history")){let n=await O(this);return new Response(JSON.stringify(n),{headers:{"content-type":"application/json"}})}return e.method==="POST"&&r.pathname.endsWith("/message")?et(this,e,this.env,this.ctx):e.method==="DELETE"&&r.pathname.endsWith("/clear")?tt(this):new Response("Ready to assist.")}async onConnect(e,r){var f,p,g,y,w;this.requireStateValidation();let[n,s]=e.server.split("::"),o=(f=(await b(n,this.env)).metadata)==null?void 0:f.tenant;this.userAuth={},this.composioSessions={},this.publicOrigin=void 0;let i=null;if(r.request){try{this.publicOrigin=new URL(r.request.url).origin}catch{}let R=r.request.headers.get("X-User-Payload");if(R)try{i=JSON.parse(R)}catch(S){console.warn("Failed to parse X-User-Payload",S)}}e.setState({...e.state,authorizedUser:i});let c=await C(n,this.env);this.setState({...this.state,user:i||null,sessionId:s,engineState:{flowData:{...c,tenant:o,flowId:n,chatId:s},executedNodes:[],context:i?{user:i}:{}}}),i||console.warn("[AgentDO] WebSocket connected without authenticated user \u2014 Composio manual auth requires login (access_token on socket URL)");let l=await O(this);k(e,I.SERVER_HISTORY,JSON.stringify({messages:l}));let m=(((p=c==null?void 0:c.state)==null?void 0:p.nodes)??(c==null?void 0:c.nodes)??[]).find(R=>R.type==="startNode");if(m){let R={allow_images:((g=m.data)==null?void 0:g.allow_images)??!1,allow_documents:((y=m.data)==null?void 0:y.allow_documents)??!1,greeting:(w=m.data)==null?void 0:w.greeting};k(e,I.SERVER_CONFIG,JSON.stringify(R))}}async onMessage(e,r){if(typeof r!="string")return;let n=r.indexOf(":");if(n===-1)return;let s=r.substring(0,n),a=r.substring(n+1);if(!s||!a)return;let i={[I.USER_MESSAGE]:c=>this.onUserMessage(e,c),[I.USER_CLEAR_HISTORY]:()=>this.onClearHistory(e),[I.USER_AUTH]:c=>this.onUserAuth(e,c),[I.USER_IDENTITY]:c=>this.onUserIdentity(e,c)}[s];i&&await i(a)}async onUserMessage(e,r){var i;let n=ke(r),s=((i=e.state)==null?void 0:i.authorizedUser)??void 0,a=()=>(s==null?void 0:s.email)??this.resolveSessionUserId(),o=`run-${qt(12)}`;await this.registerManualRun(o,n.text,a()),await N(this.env,o).catch(c=>{console.warn(`[AgentDO] could not mark manual run ${o} as running`,c)});try{let c=await D({agent:this,env:this.env,ctx:this.ctx,payload:n,connection:e,userAuth:this.userAuth,composioSessions:this.composioSessions,publicOrigin:this.publicOrigin,skillRefCache:this.skillRefCache,user:s,resolveUserId:a,runId:o,shouldStop:()=>this.isRunStopRequested(o),onServerEvent:l=>{k(e,I.SERVER_EVENT,JSON.stringify(l))},onError:l=>{k(e,I.SERVER_ERROR,l)},onSecretsLoaded:l=>{this.secrets=l}});this.ctx.waitUntil(this.completeManualRun(o,c.status==="completed"?"succeeded":c.status==="stopped"?"skipped":"failed",c.error))}finally{await this.clearRunStopRequest(o)}}registerManualRun(e,r,n){var c;let{tenant:s,flowId:a,chatId:o}=((c=this.state.engineState)==null?void 0:c.flowData)??{};if(!s||!a||!o)return Promise.resolve();let i=We(n||this.resolveSessionUserId(),o);return Xe(this.env,{id:e,tenant:s,flowId:a,userId:i,sessionId:o,label:r==null?void 0:r.slice(0,120)})}completeManualRun(e,r,n){return K(this.env,e,{status:r,error:n})}async enqueueTrigger(e){var s;if(!(e!=null&&e.runId)||!(e!=null&&e.flowId))return{queued:!1};if(e.nonce&&!await this.claimTriggerNonce(e.nonce))return console.warn(`[AgentDO] rejected replayed trigger nonce ${e.nonce}`),{queued:!1,duplicate:!0};let r=e.runAsUserId;return r&&!((s=this.state.user)!=null&&s.email)&&this.state.injectedUserId!==r&&this.setState({...this.state,injectedUserId:r}),{queued:!0,taskId:await this.queue("processTrigger",e)}}async claimTriggerNonce(e){let r=`${rt}${e}`;if(await this.ctx.storage.get(r))return!1;let n=Date.now();await this.ctx.storage.put(r,n);let a=[...(await this.ctx.storage.list({prefix:rt})).entries()].filter(([,o])=>n-o>Gt).map(([o])=>o);return a.length>0&&await this.ctx.storage.delete(a),!0}async processTrigger(e){if(!(await N(this.env,e.runId)).claimed){console.warn(`[AgentDO] activation ${e.activationId} skipped \u2014 run ${e.runId} already claimed`);return}try{this.state.engineState||await M(this,this.env);let n=xe(G(this.state.engineState)),s=Te(n,e.inputs||{},e.label),a=await D({agent:this,env:this.env,ctx:this.ctx,payload:{text:s,inputs:e.inputs||{}},composioSessions:this.composioSessions,skillRefCache:this.skillRefCache,resolveUserId:()=>e.runAsUserId||this.resolveSessionUserId(),runId:e.runId,shouldStop:()=>this.isRunStopRequested(e.runId),onSecretsLoaded:o=>{this.secrets=o}});await K(this.env,e.runId,{status:a.status==="completed"?"succeeded":a.status==="stopped"?"skipped":"failed",error:a.error})}catch(n){let s=n instanceof Error?n.message:"Trigger execution failed";throw await K(this.env,e.runId,{status:"failed",error:s}),n}finally{await this.clearRunStopRequest(e.runId)}}async onUserIdentity(e,r){let n=P(r);if(!n){k(e,I.SERVER_ERROR,"Invalid identity payload");return}this.setState({...this.state,injectedUserId:n}),k(e,I.SERVER_EVENT,JSON.stringify({type:"info:identity",content:{set:!0}}))}async onUserAuth(e,r){let n=Ae(r);if(!n){k(e,I.SERVER_ERROR,"Invalid auth payload");return}let s=n.value.trim();s===""?delete this.userAuth[n.name]:this.userAuth[n.name]=n.value,k(e,I.SERVER_EVENT,JSON.stringify({type:"info:auth",content:{name:n.name,set:s!==""}}))}async onClearHistory(e){await H(this),this.userAuth={},this.composioSessions={},this.skillRefCache.clear(),this.setState({...this.state,error:"",engineState:this.state.engineState,memory:this.state.memory,modelsCache:{},lastUpdated:new Date}),e&&k(e,I.SERVER_HISTORY,JSON.stringify({messages:[]}))}async onStart(){`${JSON.stringify(this.state)}`,await Ge(this);let e=await O(this);`${JSON.stringify(e)}`}async onClose(e,r,n,s){console.log(`Session closed: ${this.state.sessionId} ${r} - ${n}`)}async onError(e){console.error("AgentDO encountered an error:",e)}};function po(t){let e=t.state;if(!e)return null;let r=["startNode","answerNode"];for(let n of r)if(!e.nodes.some(a=>a.type===n))return!1;return e.nodes.find(n=>n.type==="startNode")}import{importSPKI as Wt,jwtVerify as Xt}from"jose";function W(t){let e={};if(!t)return e;let r=t.split(";");for(let n of r){let s=n.indexOf("=");if(s>-1){let a=n.slice(0,s).trim(),o=n.slice(s+1).trim();a&&(e[a]=decodeURIComponent(o))}}return e}function zt(t){return(typeof t.email=="string"?t.email.trim():"")||null}async function v(t,e,r){let n=W(t.headers.get("cookie")),s=new URL(t.url),a=n.access_token||s.searchParams.get("access_token"),o=await Vt(e,a);if(o.ok){let i=o.payload,c=zt(i);return c?{id:i.sub,email:c,name:i.name,first_name:i.given_name,last_name:i.family_name,tenant:i.tenant,org:typeof i.org=="string"?i.org:null,roles:i["ora-roles"],db_name:i.db_name||null,user_id:i.user_id||null}:null}return null}async function Vt(t,e){if(!e||typeof e!="string")return{ok:!1,payload:null,protectedHeader:null};if(!t.KC_RS256_PK)throw new Error("PK is not defined");let r=`-----BEGIN PUBLIC KEY-----
|
|
6
6
|
${t.KC_RS256_PK}
|
|
7
|
-
-----END PUBLIC KEY-----`,n=await
|
|
8
|
-
`)}async function ct(t,e){let r=await crypto.subtle.importKey("raw",nt.encode(t),{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return qt(await crypto.subtle.sign("HMAC",r,nt.encode(e)))}function Wt(t,e){if(t.length!==e.length)return!1;let r=0;for(let n=0;n<t.length;n++)r|=t.charCodeAt(n)^e.charCodeAt(n);return r===0}async function Os(t){let e=String(t.timestamp??Math.floor(Date.now()/1e3)),r=await ct(t.secret,it({timestamp:e,nonce:t.nonce,tenant:t.tenant,destination:t.destination,body:t.body}));return{"content-type":"application/json",[at]:t.tenant,[st]:e,[ot]:t.nonce,[rt]:`v1=${r}`}}async function lt(t){var l,u,m,f,p;if(!((l=t.secret)!=null&&l.trim()))return{ok:!1,error:"HX_API_KEY is not configured"};let e=(u=t.headers.get(at))==null?void 0:u.trim(),r=(m=t.headers.get(st))==null?void 0:m.trim(),n=(f=t.headers.get(ot))==null?void 0:f.trim(),s=(p=t.headers.get(rt))==null?void 0:p.trim();if(!e||!r||!n||!s)return{ok:!1,error:"missing signature headers"};if(!s.startsWith("v1="))return{ok:!1,error:"unsupported signature version"};let a=Number(r);if(!Number.isFinite(a))return{ok:!1,error:"invalid timestamp"};let o=Math.floor((t.now??Date.now())/1e3),i=t.toleranceSeconds??300;if(Math.abs(o-a)>i)return{ok:!1,error:"stale timestamp"};let c=await ct(t.secret.trim(),it({timestamp:r,nonce:n,tenant:e,destination:t.url,body:t.body}));return Wt(s.slice(3),c)?{ok:!0,tenant:e,nonce:n,timestamp:a}:{ok:!1,error:"signature mismatch"}}var A=(t,e=200)=>new Response(JSON.stringify(t),{status:e,headers:{"content-type":"application/json"}});async function ut(t,e,r){var l;if(new URL(t.url).pathname!=="/api/triggers/dispatch")return;if(t.method!=="POST")return A({error:"Method not allowed"},405);let s=await t.text(),a=await lt({secret:e.HX_API_KEY,body:s,url:t.url,headers:t.headers});if(!a.ok)return console.warn(`[triggers] rejected dispatch: ${a.error}`),A({error:"Invalid signature"},401);let o;try{o=JSON.parse(s)}catch{return A({error:"Invalid payload"},400)}if(!(o!=null&&o.runId)||!(o!=null&&o.flowId)||!(o!=null&&o.runAsUserId)||!(o!=null&&o.tenant)||!(o!=null&&o.activationId)||!(o!=null&&o.triggerId)||!(o!=null&&o.triggerKind)||!(o!=null&&o.invocationMode))return A({error:"activationId, triggerId, triggerKind, invocationMode, runId, flowId, runAsUserId and tenant are required"},400);if(o.tenant!==a.tenant)return A({error:"Tenant mismatch"},403);let i;try{i=await b(o.flowId,e)}catch{return A({error:"Flow not found"},404)}if(!((l=i==null?void 0:i.metadata)!=null&&l.tenant)||i.metadata.tenant!==o.tenant)return console.warn(`[triggers] flow ${o.flowId} does not belong to tenant ${o.tenant}`),A({error:"Tenant mismatch"},403);let c=await tt(e,{...o,sessionId:o.sessionId||o.runAsUserId,nonce:a.nonce});return c.status==="error"?A({error:c.error},502):c.status==="deduped"?A({deduped:!0,runId:c.runId},200):A({accepted:!0,runId:c.runId,taskId:c.taskId},202)}var te=/^[A-Za-z0-9_-]{1,64}$/;async function ne(t,e,r,n,s,a=!1){let o=(f,p)=>({response:new Response(f,{status:p})});if(!/^[A-Za-z0-9_-]+$/.test(n))return o("Invalid flowId",400);if((!a||s)&&(!s||!te.test(s)))return o("Invalid sessionId",400);let i;try{i=await b(n,e)}catch{return o("Flow not found",404)}let c=i==null?void 0:i.metadata;if(!c||!["active","activo"].includes(c.status))return o("Flow not found",404);if(!e.TENANT||c.tenant!==e.TENANT)return o("Forbidden",403);let l=await v(t,e,r),u=l&&typeof l=="object"?l:void 0;if(u&&u.tenant!==e.TENANT)return o("Forbidden",403);if(c.visibility==="public")return{user:u};if(!u){if(!a)return o("Unauthorized",401);let f=new URL(t.url),p=new URL("/login",f.origin);return p.searchParams.set("nextURL",`${f.pathname}${f.search}`),{response:Response.redirect(p.toString(),302)}}if((c.org||"default")!==(u.org||"default"))return o("Forbidden",403);let m=W(t.headers.get("cookie")).access_token||new URL(t.url).searchParams.get("access_token");if(!m)return o("Unauthorized",401);try{let f=await fetch(`${e.HX_CORE_URL}/flows/${encodeURIComponent(n)}`,{headers:{Authorization:m},cache:"no-store"});if(!f.ok||(await f.json()).id!==n)return o("Forbidden",403)}catch{return o("Forbidden",403)}return{user:u}}var Xt=/^[A-Za-z0-9_-]+$/,zt=new Set(["state","messages","memory"]);async function Vt(t,e){let r=new URL(t.url);if(!r.pathname.startsWith("/api/internal/sessions/"))return;let n=r.pathname.split("/");if(n[6]!=="runs"||n[8]!=="stop"||n.length!==9)return;if(t.method!=="POST")return new Response("Method not allowed",{status:405});if(!e.HX_API_KEY||t.headers.get("Authorization")!==e.HX_API_KEY)return new Response("Unauthorized",{status:401});let s=decodeURIComponent(n[4]||""),a=decodeURIComponent(n[5]||""),o=decodeURIComponent(n[7]||"");if(!s||!a||!o)return new Response("Not found",{status:404});try{let i=await X(e.AGENT,`${s}::${a}`);return Response.json(await i.requestRunStop(o))}catch(i){return console.error("[agents] failed to request run stop",i),Response.json({error:"Failed to stop run"},{status:502})}}async function Jt(t,e){let r=new URL(t.url);if(!r.pathname.startsWith("/api/internal/sessions/"))return;if(t.method!=="GET")return new Response("Method not allowed",{status:405});let n=t.headers.get("Authorization")||"";if(!e.HX_API_KEY||n!==e.HX_API_KEY)return new Response("Unauthorized",{status:401});let s=r.pathname.split("/"),a=decodeURIComponent(s[4]||""),o=decodeURIComponent(s[5]||""),i=s[6];if(!a||!o||!i||!zt.has(i))return new Response("Not found",{status:404});try{let l=await(await X(e.AGENT,`${a}::${o}`)).inspectPersistedSession(i);return Response.json(l)}catch(c){return console.error("[agents] failed to inspect persisted session",c),Response.json({error:"Failed to inspect persisted session"},{status:502})}}async function Gs(t,e,r){var i,c;let n=new URL(t.url),s=await ut(t,e,r);if(s instanceof Response)return s;let a=await Vt(t,e);if(a instanceof Response)return a;let o=await Jt(t,e);if(o instanceof Response)return o;if(n.pathname.startsWith("/a/")){let l=n.pathname.split("/"),u=l[2],m=l[3];try{if(!u)return Response.redirect(new URL("/",n.origin).toString(),302);let f=await ne(t,e,r,u,m,!0);if(f.response)return f.response;if(!m){let p=crypto.randomUUID(),g=new URL(`/a/${u}/${p}`,n.origin);return Response.redirect(g.toString(),302)}}catch(f){return console.error("Error accessing flow KV:",f),new Response("Flow error",{status:500})}}if(n.pathname.startsWith("/api/agent/flow/")){let l=n.pathname.split("/"),u=l[4],m=l[5];return dt(t,e,r,u,m)}if(n.pathname.startsWith("/api/ora/connect")){let l=n.pathname.split("/"),u=l[4],m=l[5];if(!u||!m)return new Response("Missing flowId or sessionId",{status:400});let f=t.headers.get("Authorization")||n.searchParams.get("authorization");if(!f)return new Response("Missing Authorization header",{status:401});try{let p=`${e.HX_CORE_URL}/p/v1/validation/key/agent/${u}`,y=await(await fetch(p,{method:"GET",headers:{Authorization:f}})).json();if(((i=y.payload)==null?void 0:i.flowId)!==u)return console.error("FlowId mismatch:",(c=y.payload)==null?void 0:c.flowId,"!==",u),new Response("Validation error",{status:403});let w=`${u}::${m}`,R=await v(t,e,r);if(!R){let $=new URL(t.url).searchParams.has("access_token");console.warn(`[agents] Unauthenticated agent socket upgrade (access_token query=${$}) \u2014 Composio connections from tool editor will not apply`)}let S=new Headers(t.headers);S.delete("X-User-Payload"),R&&S.set("X-User-Payload",JSON.stringify(R));let U=new Request(t,{headers:S});return(await X(e.AGENT,w)).fetch(U)}catch(p){return console.error("Error in /api/ora/connect:",p),new Response("Internal error",{status:500})}}}async function dt(t,e,r,n,s){let a=`${n}::${s}`;try{let o=await ne(t,e,r,n,s);if(o.response)return o.response;let i=o.user,c=new Headers(t.headers);c.delete("X-User-Payload"),i&&c.set("X-User-Payload",JSON.stringify(i));let l=new Request(t,{headers:c});return(await X(e.AGENT,a)).fetch(l)}catch(o){return console.error("Error accessing agent:",o),new Response("Agent error",{status:500})}}var Ws=async(t,e,r,n)=>{if(!(n!=null&&n.flowId)||!Xt.test(n.flowId)||!(n!=null&&n.sessionId)||!te.test(n.sessionId))return new Response("Not found",{status:404});let s=new URL(`/api/agent/flow/${n.flowId}/${n.sessionId}`,t.url),a=new Headers;for(let[c,l]of t.headers.entries())c.toLowerCase().startsWith("x-")||a.append(c,l);let o={method:t.method,headers:a};t.body&&t.method!=="GET"&&t.method!=="HEAD"&&(o.body=t.body,o.duplex="half");let i=new Request(s.toString(),o);return dt(i,e,r,n.flowId,n.sessionId)};async function Vs(t,e,r){let n=new URL(t.url),s=t.method;if(!n.pathname.startsWith("/api/instances"))return;let a=await v(t,e,r);if(!a)return new Response("Unauthorized",{status:401});let o=e.HX_CORE_URL,i=e.HX_API_KEY;if(!o||!i)return console.error("Missing configuration: HX_CORE_URL or HX_API_KEY"),new Response("Internal Server Error",{status:500});let l=n.pathname.slice("/api/instances".length);l.startsWith("/")&&(l=l.slice(1)),l.endsWith("/")&&(l=l.slice(0,-1));let u="/ora/instances";l&&(u+=`/${l}`);let m=o.endsWith("/")?o.slice(0,-1):o,f=new URL(`${m}${u}`);n.searchParams.forEach((y,w)=>{f.searchParams.set(w,y)}),s==="GET"&&!l&&f.searchParams.set("filter_user_id",a.email);let p=new Headers;p.set("Authorization",i),p.set("Content-Type","application/json"),p.set("X-User-Payload",JSON.stringify(a));let g={method:s,headers:p};if(["POST","PATCH","PUT"].includes(s))try{g.body=await t.text()}catch(y){console.error("Error reading request body:",y)}try{let y=await fetch(f.toString(),g),w=await y.text();return new Response(w,{status:y.status,headers:{"Content-Type":"application/json"}})}catch(y){return console.error("Error proxying to flow instance backend:",y),new Response("Internal Server Error",{status:500})}}async function Bs(t,e,r){let n=new URL(t.url);if(t.method==="POST"&&n.pathname==="/auth/login")try{let s=await t.formData(),a=s.get("username"),o=s.get("password"),i=s.get("nextURL")||"/";if(!a||!o)return new Response("Missing username or password",{status:400});let c=new URLSearchParams;c.append("username",a),c.append("password",o),c.append("grant_type","password"),c.append("client_id",e.KC_CLIENT_ID),c.append("client_secret",e.KC_CLIENT_SECRET);let l=await fetch(`${e.KC_BASE_URL}/protocol/openid-connect/token`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Cookie:"hxsecure=1"},body:c});if(!l.ok)return new Response("Unauthorized",{status:401});let u=await l.json(),m=new Response(null,{status:302,headers:{Location:i}}),p=n.protocol==="https:"?"; Secure":"",g=(y,w,R)=>{m.headers.append("Set-Cookie",`${y}=${w}; Path=/; HttpOnly${p}; SameSite=Lax; Max-Age=${R}`)};return u.access_token&&g("access_token",u.access_token,u.expires_in),u.refresh_token&&g("refresh_token",u.refresh_token,u.refresh_expires_in||3600*24*30),u.id_token&&g("id_token",u.id_token,u.expires_in),m}catch(s){return console.error("Auth error:",s),new Response("Internal Server Error",{status:500})}if(n.pathname==="/auth/logout"){let s=new Response(null,{status:302,headers:{Location:"/login"}}),a=o=>{s.headers.append("Set-Cookie",`${o}=; Path=/; HttpOnly; Secure; SameSite=Strict; Max-Age=0`)};return a("access_token"),a("refresh_token"),a("id_token"),s}if(n.pathname.startsWith("/s/")){let s=await v(t,e,r);if(!s){let a=new URL("/login",n.origin);return a.searchParams.set("nextURL",`${n.pathname}${n.search}`),Response.redirect(a.toString(),302)}return{user:s}}}import{WorkerEntrypoint as Yt}from"cloudflare:workers";import{getAgentByName as Bt}from"agents";var Zt=/^[A-Za-z0-9_-]+$/,Qt=/^art-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,pt=class extends Yt{async ask(e,r){var n,s,a,o;try{if(!e||typeof e!="string"||!Zt.test(e))throw console.error("[ArtifactWorkerGateway] invalid flowId:",e),new Error("Artifact worker request failed");if(!r||typeof r.message!="string")throw console.error("[ArtifactWorkerGateway] invalid input: message is required"),new Error("Artifact worker request failed");let i;if(r.sessionId!==void 0){if(typeof r.sessionId!="string"||!Qt.test(r.sessionId))throw console.error("[ArtifactWorkerGateway] invalid sessionId:",r.sessionId),new Error("Artifact worker request failed");i=r.sessionId}else i=`art-${crypto.randomUUID()}`;let c=(s=(n=this.ctx)==null?void 0:n.props)==null?void 0:s.slug,l=(o=(a=this.ctx)==null?void 0:a.props)==null?void 0:o.artifactUuid;if(!c||!l)throw console.error("[ArtifactWorkerGateway] missing slug or artifactUuid in gateway context props"),new Error("Artifact worker request failed");let u=this.env.ARTIFACT;if(!u)throw console.error("[ArtifactWorkerGateway] ARTIFACT binding not configured"),new Error("Artifact worker request failed");let m=u.idFromName(c),p=await u.get(m).allowsWorker({flowId:e,mode:"server",artifactUuid:l});if(!(p!=null&&p.ok))throw console.error(`[ArtifactWorkerGateway] grant check failed for flow ${e} on artifact ${c}`),new Error("Artifact worker request failed");let g=await Bt(this.env.AGENT,`${e}::${i}`),y={message:r.message};r.inputs&&typeof r.inputs=="object"&&(y.inputs=r.inputs);let w=new Request("http://localhost/message",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(y)}),R=await g.fetch(w);if(!R.ok)throw console.error(`[ArtifactWorkerGateway] agent returned status ${R.status}`),new Error("Artifact worker request failed");let S=await R.json();return{text:typeof(S==null?void 0:S.answer)=="string"?S.answer:"",sessionId:i}}catch(i){throw(i==null?void 0:i.message)==="Artifact worker request failed"?i:(console.error("[ArtifactWorkerGateway] unexpected error in ask:",i),new Error("Artifact worker request failed"))}}};export{gt as ANONYMOUS_RUN_USER_PREFIX,et as AgentDO,pt as ArtifactWorkerGateway,Wn as CRAWL_DEFAULTS,Xn as CRAWL_LIMITS,mn as DEFAULT_MEMORY_LENGTH,gn as DEFAULT_MEMORY_MODEL,ln as FLOW_INPUT_NAME_RE,hr as FlowExecutionStoppedError,Bn as GENERATION_PARAM_KEYS,Qn as GENERATION_PRESETS,dn as MAX_USER_IDENTITY_LENGTH,pn as MEMORY_LENGTH_MD_LINES,fn as MEMORY_LENGTH_TOKENS,wr as MODEL_REGISTRY_SNAPSHOT,F as NodeType,wn as OUT_VAR_NAME_RE,Zn as PRESET_PARAM_KEYS,ur as REASONING_EFFORT_LEVELS,qn as TENANT_ONLY_NODES,yr as TOOL_REGISTRY_SNAPSHOT,ot as TRIGGER_NONCE_HEADER,rt as TRIGGER_SIGNATURE_HEADER,bs as TRIGGER_SIGNATURE_TOLERANCE_SECONDS,at as TRIGGER_TENANT_HEADER,st as TRIGGER_TIMESTAMP_HEADER,vn as VariableResolutionError,nr as applyPresetToOverrides,Ws as artifactAgentProxy,zn as buildCrawlRequestBody,$e as buildReasoningProviderOptions,Tn as buildScope,Os as buildSignedTriggerHeaders,Ee as buildTriggerMessageText,rn as buildUrl,Ht as canonicalUserEmail,ke as capMemoryContent,N as claimRun,H as clearAllMessages,K as completeRun,en as convertTempMessure,Vn as crawlRequestKey,B as createRun,er as deriveParamSupport,tt as dispatchTrigger,an as embedText,je as ensureAgentTables,mt as ensureMessagesTable,hn as estimateTokens,Nn as extractOutVarValues,Fn as extractTemplateReferences,ve as extractUserKeypoints,kn as findScopedSourceNode,dt as forwardToAgentFlow,O as getAllMessages,In as getAncestorNodeIds,Rn as getDefaultOutVars,En as getEffectiveOutVars,Se as getFlowInputDefs,Rr as getModelEntry,An as getRefTail,xn as getUpstreamOutVars,Gs as handleAgentsRoutes,Bs as handleAuthRoutes,Ts as handleCommonRoutes,Vs as handleIntancesRoutes,Jt as handlePersistedSessionInspection,Vt as handleSessionRunControl,ut as handleTriggerRoutes,on as hashText,M as initializeEngineState,Un as isBinaryOutVar,_n as isJsonContentType,Gn as isNodeTypeAllowedForTenant,Ae as isStartMemoryEnabled,Kn as jsonSchemaToZod,Re as logc,Oe as looksLikeTranscript,be as memoryGenerationMaxTokens,L as memoryMdLineLimit,Te as memoryTokenLimit,Ce as mergeKeypointMemory,I as messageTypes,Gt as normalizeDestination,sr as normalizeEffectiveParams,un as normalizeFlowInputs,mr as normalizeModelEntry,dr as normalizeReasoning,ar as openAiReasoningParamSupport,or as openAiStandardParamSupport,W as parseCookies,yn as parseMemoryLength,bn as parsePayloadText,$n as parseTemplateExpression,xe as parseUserAuth,Ie as parseUserMessage,rr as pickNodeOverrides,On as readFetchPayload,pr as reasoningEffortLevels,fr as reasoningExposable,qe as recordRun,gr as registerProvider,jn as resolveAnswerMappings,Fe as resolveModelById,Dn as resolveOutVarRef,Pn as resolveOutVarValue,tr as resolvePreset,De as resolveReasoningEffort,Mn as resolveReference,Ke as resolveRunUserId,Hn as resolveTemplate,Ln as rewriteTemplateNodeRefs,D as runAgentTurn,Yn as runCrawl,nn as safeParseJSON,J as sanitizeMemoryDocument,P as sanitizeUserIdentity,Je as sendEvent,k as serverSend,He as setMessage,Jn as shapeCrawlOutput,ct as signTriggerMaterial,Le as startEngine,_e as startMemoryLength,Ue as startMemoryModel,lr as stripUnsupportedFromNodeData,tn as tempTool,Wt as timingSafeEqualHex,Me as toStreamTextSettings,it as triggerSignatureMaterial,sn as twitter,ws as validateFlowStart,Sn as validateOutVars,cn as vectorize,jt as verifyToken,lt as verifyTriggerRequest,v as verifyUser,Cn as walkPath,cr as workersAiParamSupport,ir as xaiParamSupport};
|
|
7
|
+
-----END PUBLIC KEY-----`,n=await Wt(r,"RS256");try{let{payload:s,protectedHeader:a}=await Xt(e,n);return{ok:!0,payload:s,protectedHeader:a}}catch(s){return console.error("JWT verification failed:",s),{ok:!1,payload:null,protectedHeader:null}}}async function wo(t,e,r){let n=new URL(t.url);if(n.pathname==="/favicon.ico")return new Response(null,{status:204});if(n.pathname.startsWith("/.well-known/appspecific"))return new Response(null,{status:204})}import{getAgentByName as X}from"agents";import{getAgentByName as Jt}from"agents";async function ot(t,e){let r=e.sessionId||e.runAsUserId,n=e.inputs||{},s=e.runId;if(!s){let c=await B(t,{tenant:e.tenant,flowId:e.flowId,userId:e.runAsUserId,sessionId:r,triggerId:e.triggerId,triggerKind:e.triggerKind,invocationMode:e.invocationMode,activationId:e.activationId,deliveryId:void 0,externalDeliveryId:e.externalDeliveryId,correlationKey:e.correlationKey,inputs:n,label:e.label});if(!c)return{status:"error",error:"Failed to register run"};if(!c.created&&c.run.status!=="queued")return{status:"deduped",runId:c.run.id};s=c.run.id}let a={...e,sessionId:r,runId:s,inputs:n},i=await(await Jt(t.AGENT,`${e.flowId}::${r}`)).enqueueTrigger(a);return i.duplicate?{status:"deduped",runId:s}:i.queued?{status:"queued",runId:s,activation:a,taskId:i.taskId}:{status:"error",error:"Failed to queue trigger"}}var it="x-ora-signature",ct="x-ora-timestamp",lt="x-ora-nonce",ut="x-ora-tenant",xo=300,at=new TextEncoder;function Yt(t){return[...new Uint8Array(t)].map(e=>e.toString(16).padStart(2,"0")).join("")}function Bt(t){try{let e=new URL(t);return`${e.origin}${e.pathname.replace(/\/$/,"")}`}catch{return t.replace(/\/$/,"")}}function dt(t){return["v1",t.timestamp,t.nonce,t.tenant,Bt(t.destination),t.body].join(`
|
|
8
|
+
`)}async function pt(t,e){let r=await crypto.subtle.importKey("raw",at.encode(t),{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return Yt(await crypto.subtle.sign("HMAC",r,at.encode(e)))}function Zt(t,e){if(t.length!==e.length)return!1;let r=0;for(let n=0;n<t.length;n++)r|=t.charCodeAt(n)^e.charCodeAt(n);return r===0}async function To(t){let e=String(t.timestamp??Math.floor(Date.now()/1e3)),r=await pt(t.secret,dt({timestamp:e,nonce:t.nonce,tenant:t.tenant,destination:t.destination,body:t.body}));return{"content-type":"application/json",[ut]:t.tenant,[ct]:e,[lt]:t.nonce,[it]:`v1=${r}`}}async function ft(t){var l,u,m,f,p;if(!((l=t.secret)!=null&&l.trim()))return{ok:!1,error:"HX_API_KEY is not configured"};let e=(u=t.headers.get(ut))==null?void 0:u.trim(),r=(m=t.headers.get(ct))==null?void 0:m.trim(),n=(f=t.headers.get(lt))==null?void 0:f.trim(),s=(p=t.headers.get(it))==null?void 0:p.trim();if(!e||!r||!n||!s)return{ok:!1,error:"missing signature headers"};if(!s.startsWith("v1="))return{ok:!1,error:"unsupported signature version"};let a=Number(r);if(!Number.isFinite(a))return{ok:!1,error:"invalid timestamp"};let o=Math.floor((t.now??Date.now())/1e3),i=t.toleranceSeconds??300;if(Math.abs(o-a)>i)return{ok:!1,error:"stale timestamp"};let c=await pt(t.secret.trim(),dt({timestamp:r,nonce:n,tenant:e,destination:t.url,body:t.body}));return Zt(s.slice(3),c)?{ok:!0,tenant:e,nonce:n,timestamp:a}:{ok:!1,error:"signature mismatch"}}var A=(t,e=200)=>new Response(JSON.stringify(t),{status:e,headers:{"content-type":"application/json"}});async function mt(t,e,r){var l;if(new URL(t.url).pathname!=="/api/triggers/dispatch")return;if(t.method!=="POST")return A({error:"Method not allowed"},405);let s=await t.text(),a=await ft({secret:e.HX_API_KEY,body:s,url:t.url,headers:t.headers});if(!a.ok)return console.warn(`[triggers] rejected dispatch: ${a.error}`),A({error:"Invalid signature"},401);let o;try{o=JSON.parse(s)}catch{return A({error:"Invalid payload"},400)}if(!(o!=null&&o.runId)||!(o!=null&&o.flowId)||!(o!=null&&o.runAsUserId)||!(o!=null&&o.tenant)||!(o!=null&&o.activationId)||!(o!=null&&o.triggerId)||!(o!=null&&o.triggerKind)||!(o!=null&&o.invocationMode))return A({error:"activationId, triggerId, triggerKind, invocationMode, runId, flowId, runAsUserId and tenant are required"},400);if(o.tenant!==a.tenant)return A({error:"Tenant mismatch"},403);let i;try{i=await b(o.flowId,e)}catch{return A({error:"Flow not found"},404)}if(!((l=i==null?void 0:i.metadata)!=null&&l.tenant)||i.metadata.tenant!==o.tenant)return console.warn(`[triggers] flow ${o.flowId} does not belong to tenant ${o.tenant}`),A({error:"Tenant mismatch"},403);let c=await ot(e,{...o,sessionId:o.sessionId||o.runAsUserId,nonce:a.nonce});return c.status==="error"?A({error:c.error},502):c.status==="deduped"?A({deduped:!0,runId:c.runId},200):A({accepted:!0,runId:c.runId,taskId:c.taskId},202)}var re=/^[A-Za-z0-9_-]{1,64}$/;async function se(t,e,r,n,s,a=!1){let o=(f,p)=>({response:new Response(f,{status:p})});if(!/^[A-Za-z0-9_-]+$/.test(n))return o("Invalid flowId",400);if((!a||s)&&(!s||!re.test(s)))return o("Invalid sessionId",400);let i;try{i=await b(n,e)}catch{return o("Flow not found",404)}let c=i==null?void 0:i.metadata;if(!c||!["active","activo"].includes(c.status))return o("Flow not found",404);if(!e.TENANT||c.tenant!==e.TENANT)return o("Forbidden",403);let l=await v(t,e,r),u=l&&typeof l=="object"?l:void 0;if(u&&u.tenant!==e.TENANT)return o("Forbidden",403);if(c.visibility==="public")return{user:u};if(!u){if(!a)return o("Unauthorized",401);let f=new URL(t.url),p=new URL("/login",f.origin);return p.searchParams.set("nextURL",`${f.pathname}${f.search}`),{response:Response.redirect(p.toString(),302)}}if((c.org||"default")!==(u.org||"default"))return o("Forbidden",403);let m=W(t.headers.get("cookie")).access_token||new URL(t.url).searchParams.get("access_token");if(!m)return o("Unauthorized",401);try{let f=await fetch(`${e.HX_CORE_URL}/flows/${encodeURIComponent(n)}`,{headers:{Authorization:m},cache:"no-store"});if(!f.ok||(await f.json()).id!==n)return o("Forbidden",403)}catch{return o("Forbidden",403)}return{user:u}}var Qt=/^[A-Za-z0-9_-]+$/,en=new Set(["state","messages","memory"]);async function tn(t,e){let r=new URL(t.url);if(!r.pathname.startsWith("/api/internal/sessions/"))return;let n=r.pathname.split("/");if(n[6]!=="runs"||n[8]!=="stop"||n.length!==9)return;if(t.method!=="POST")return new Response("Method not allowed",{status:405});if(!e.HX_API_KEY||t.headers.get("Authorization")!==e.HX_API_KEY)return new Response("Unauthorized",{status:401});let s=decodeURIComponent(n[4]||""),a=decodeURIComponent(n[5]||""),o=decodeURIComponent(n[7]||"");if(!s||!a||!o)return new Response("Not found",{status:404});try{let i=await X(e.AGENT,`${s}::${a}`);return Response.json(await i.requestRunStop(o))}catch(i){return console.error("[agents] failed to request run stop",i),Response.json({error:"Failed to stop run"},{status:502})}}async function nn(t,e){let r=new URL(t.url);if(!r.pathname.startsWith("/api/internal/sessions/"))return;if(t.method!=="GET")return new Response("Method not allowed",{status:405});let n=t.headers.get("Authorization")||"";if(!e.HX_API_KEY||n!==e.HX_API_KEY)return new Response("Unauthorized",{status:401});let s=r.pathname.split("/"),a=decodeURIComponent(s[4]||""),o=decodeURIComponent(s[5]||""),i=s[6];if(!a||!o||!i||!en.has(i))return new Response("Not found",{status:404});try{let l=await(await X(e.AGENT,`${a}::${o}`)).inspectPersistedSession(i);return Response.json(l)}catch(c){return console.error("[agents] failed to inspect persisted session",c),Response.json({error:"Failed to inspect persisted session"},{status:502})}}async function Fo(t,e,r){var i,c;let n=new URL(t.url),s=await mt(t,e,r);if(s instanceof Response)return s;let a=await tn(t,e);if(a instanceof Response)return a;let o=await nn(t,e);if(o instanceof Response)return o;if(n.pathname.startsWith("/a/")){let l=n.pathname.split("/"),u=l[2],m=l[3];try{if(!u)return Response.redirect(new URL("/",n.origin).toString(),302);let f=await se(t,e,r,u,m,!0);if(f.response)return f.response;if(!m){let p=crypto.randomUUID(),g=new URL(`/a/${u}/${p}`,n.origin);return Response.redirect(g.toString(),302)}}catch(f){return console.error("Error accessing flow KV:",f),new Response("Flow error",{status:500})}}if(n.pathname.startsWith("/api/agent/flow/")){let l=n.pathname.split("/"),u=l[4],m=l[5];return gt(t,e,r,u,m)}if(n.pathname.startsWith("/api/ora/connect")){let l=n.pathname.split("/"),u=l[4],m=l[5];if(!u||!m)return new Response("Missing flowId or sessionId",{status:400});let f=t.headers.get("Authorization")||n.searchParams.get("authorization");if(!f)return new Response("Missing Authorization header",{status:401});try{let p=`${e.HX_CORE_URL}/p/v1/validation/key/agent/${u}`,y=await(await fetch(p,{method:"GET",headers:{Authorization:f}})).json();if(((i=y.payload)==null?void 0:i.flowId)!==u)return console.error("FlowId mismatch:",(c=y.payload)==null?void 0:c.flowId,"!==",u),new Response("Validation error",{status:403});let w=`${u}::${m}`,R=await v(t,e,r);if(!R){let $=new URL(t.url).searchParams.has("access_token");console.warn(`[agents] Unauthenticated agent socket upgrade (access_token query=${$}) \u2014 Composio connections from tool editor will not apply`)}let S=new Headers(t.headers);S.delete("X-User-Payload"),R&&S.set("X-User-Payload",JSON.stringify(R));let _=new Request(t,{headers:S});return(await X(e.AGENT,w)).fetch(_)}catch(p){return console.error("Error in /api/ora/connect:",p),new Response("Internal error",{status:500})}}}async function gt(t,e,r,n,s){let a=`${n}::${s}`;try{let o=await se(t,e,r,n,s);if(o.response)return o.response;let i=o.user,c=new Headers(t.headers);c.delete("X-User-Payload"),i&&c.set("X-User-Payload",JSON.stringify(i));let l=new Request(t,{headers:c});return(await X(e.AGENT,a)).fetch(l)}catch(o){return console.error("Error accessing agent:",o),new Response("Agent error",{status:500})}}var Lo=async(t,e,r,n)=>{if(!(n!=null&&n.flowId)||!Qt.test(n.flowId)||!(n!=null&&n.sessionId)||!re.test(n.sessionId))return new Response("Not found",{status:404});let s=new URL(`/api/agent/flow/${n.flowId}/${n.sessionId}`,t.url),a=new Headers;for(let[c,l]of t.headers.entries())c.toLowerCase().startsWith("x-")||a.append(c,l);let o={method:t.method,headers:a};t.body&&t.method!=="GET"&&t.method!=="HEAD"&&(o.body=t.body,o.duplex="half");let i=new Request(s.toString(),o);return gt(i,e,r,n.flowId,n.sessionId)};async function Ko(t,e,r){let n=new URL(t.url),s=t.method;if(!n.pathname.startsWith("/api/instances"))return;let a=await v(t,e,r);if(!a)return new Response("Unauthorized",{status:401});let o=e.HX_CORE_URL,i=e.HX_API_KEY;if(!o||!i)return console.error("Missing configuration: HX_CORE_URL or HX_API_KEY"),new Response("Internal Server Error",{status:500});let l=n.pathname.slice("/api/instances".length);l.startsWith("/")&&(l=l.slice(1)),l.endsWith("/")&&(l=l.slice(0,-1));let u="/ora/instances";l&&(u+=`/${l}`);let m=o.endsWith("/")?o.slice(0,-1):o,f=new URL(`${m}${u}`);n.searchParams.forEach((y,w)=>{f.searchParams.set(w,y)}),s==="GET"&&!l&&f.searchParams.set("filter_user_id",a.email);let p=new Headers;p.set("Authorization",i),p.set("Content-Type","application/json"),p.set("X-User-Payload",JSON.stringify(a));let g={method:s,headers:p};if(["POST","PATCH","PUT"].includes(s))try{g.body=await t.text()}catch(y){console.error("Error reading request body:",y)}try{let y=await fetch(f.toString(),g),w=await y.text();return new Response(w,{status:y.status,headers:{"Content-Type":"application/json"}})}catch(y){return console.error("Error proxying to flow instance backend:",y),new Response("Internal Server Error",{status:500})}}async function Wo(t,e,r){let n=new URL(t.url);if(t.method==="POST"&&n.pathname==="/auth/login")try{let s=await t.formData(),a=s.get("username"),o=s.get("password"),i=s.get("nextURL")||"/";if(!a||!o)return new Response("Missing username or password",{status:400});let c=new URLSearchParams;c.append("username",a),c.append("password",o),c.append("grant_type","password"),c.append("client_id",e.KC_CLIENT_ID),c.append("client_secret",e.KC_CLIENT_SECRET);let l=await fetch(`${e.KC_BASE_URL}/protocol/openid-connect/token`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Cookie:"hxsecure=1"},body:c});if(!l.ok)return new Response("Unauthorized",{status:401});let u=await l.json(),m=new Response(null,{status:302,headers:{Location:i}}),p=n.protocol==="https:"?"; Secure":"",g=(y,w,R)=>{m.headers.append("Set-Cookie",`${y}=${w}; Path=/; HttpOnly${p}; SameSite=Lax; Max-Age=${R}`)};return u.access_token&&g("access_token",u.access_token,u.expires_in),u.refresh_token&&g("refresh_token",u.refresh_token,u.refresh_expires_in||3600*24*30),u.id_token&&g("id_token",u.id_token,u.expires_in),m}catch(s){return console.error("Auth error:",s),new Response("Internal Server Error",{status:500})}if(n.pathname==="/auth/logout"){let s=new Response(null,{status:302,headers:{Location:"/login"}}),a=o=>{s.headers.append("Set-Cookie",`${o}=; Path=/; HttpOnly; Secure; SameSite=Strict; Max-Age=0`)};return a("access_token"),a("refresh_token"),a("id_token"),s}if(n.pathname.startsWith("/s/")){let s=await v(t,e,r);if(!s){let a=new URL("/login",n.origin);return a.searchParams.set("nextURL",`${n.pathname}${n.search}`),Response.redirect(a.toString(),302)}return{user:s}}}import{WorkerEntrypoint as rn}from"cloudflare:workers";import{getAgentByName as sn}from"agents";var on=/^[A-Za-z0-9_-]+$/,an=/^art-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,yt=class extends rn{async ask(e,r){var n,s,a,o;try{if(!e||typeof e!="string"||!on.test(e))throw console.error("[ArtifactWorkerGateway] invalid flowId:",e),new Error("Artifact worker request failed");if(!r||typeof r.message!="string")throw console.error("[ArtifactWorkerGateway] invalid input: message is required"),new Error("Artifact worker request failed");let i;if(r.sessionId!==void 0){if(typeof r.sessionId!="string"||!an.test(r.sessionId))throw console.error("[ArtifactWorkerGateway] invalid sessionId:",r.sessionId),new Error("Artifact worker request failed");i=r.sessionId}else i=`art-${crypto.randomUUID()}`;let c=(s=(n=this.ctx)==null?void 0:n.props)==null?void 0:s.slug,l=(o=(a=this.ctx)==null?void 0:a.props)==null?void 0:o.artifactUuid;if(!c||!l)throw console.error("[ArtifactWorkerGateway] missing slug or artifactUuid in gateway context props"),new Error("Artifact worker request failed");let u=this.env.ARTIFACT;if(!u)throw console.error("[ArtifactWorkerGateway] ARTIFACT binding not configured"),new Error("Artifact worker request failed");let m=u.idFromName(c),p=await u.get(m).allowsWorker({flowId:e,mode:"server",artifactUuid:l});if(!(p!=null&&p.ok))throw console.error(`[ArtifactWorkerGateway] grant check failed for flow ${e} on artifact ${c}`),new Error("Artifact worker request failed");let g=await sn(this.env.AGENT,`${e}::${i}`),y={message:r.message};r.inputs&&typeof r.inputs=="object"&&(y.inputs=r.inputs);let w=new Request("http://localhost/message",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(y)}),R=await g.fetch(w);if(!R.ok)throw console.error(`[ArtifactWorkerGateway] agent returned status ${R.status}`),new Error("Artifact worker request failed");let S=await R.json();return{text:typeof(S==null?void 0:S.answer)=="string"?S.answer:"",sessionId:i}}catch(i){throw(i==null?void 0:i.message)==="Artifact worker request failed"?i:(console.error("[ArtifactWorkerGateway] unexpected error in ask:",i),new Error("Artifact worker request failed"))}}};export{Et as ANONYMOUS_RUN_USER_PREFIX,st as AgentDO,yt as ArtifactWorkerGateway,Sn as CLASSIFIER_DEFAULTS,En as CLASSIFIER_RESERVED_HANDLES,Rn as CLEF_MODELS,bn as CRAWL_DEFAULTS,On as CRAWL_LIMITS,lr as DEFAULT_MEMORY_LENGTH,ur as DEFAULT_MEMORY_MODEL,yn as FLOW_INPUT_NAME_RE,as as FlowExecutionStoppedError,jr as GENERATION_PARAM_KEYS,qr as GENERATION_PRESETS,hr as ISSUE_SEVERITY,wn as MAX_USER_IDENTITY_LENGTH,ir as MEMORY_LENGTH_MD_LINES,cr as MEMORY_LENGTH_TOKENS,is as MODEL_REGISTRY_SNAPSHOT,Ln as NODE_CATALOG,F as NodeType,Mn as OUT_VAR_NAME_RE,Kr as PRESET_PARAM_KEYS,es as REASONING_EFFORT_LEVELS,ls as TENANT_ONLY_NODES,vr as TOOL_REGISTRY_SNAPSHOT,lt as TRIGGER_NONCE_HEADER,it as TRIGGER_SIGNATURE_HEADER,xo as TRIGGER_SIGNATURE_TOLERANCE_SECONDS,ut as TRIGGER_TENANT_HEADER,ct as TRIGGER_TIMESTAMP_HEADER,Bn as VariableResolutionError,xn as WORKER_GRAPH_DEFS,Tn as WORKER_GRAPH_SCHEMA,kn as WORKER_OP_SCHEMA,Ur as WORKER_TEMPLATES,Xr as applyPresetToOverrides,Ar as applyWorkerOps,Lo as artifactAgentProxy,Nr as buildClefRequest,vn as buildCrawlRequestBody,He as buildReasoningProviderOptions,Gn as buildScope,To as buildSignedTriggerHeaders,Te as buildTriggerMessageText,dn as buildUrl,Tr as canonicalGraph,zt as canonicalUserEmail,Ue as capMemoryContent,N as claimRun,Lr as classifierErrorResult,In as classifierHandle,Or as classifierIdFromLabel,Er as classifyIssues,H as clearAllMessages,Dr as clefTruncationWarning,gr as collectExternalRefs,fr as collectNodeRefs,K as completeRun,cn as convertTempMessure,Cn as crawlRequestKey,B as createRun,Hn as defaultNodeData,Gr as deriveParamSupport,_r as detectInlineCredentials,kr as diffGraphs,ot as dispatchTrigger,Ir as edgeId,mn as embedText,br as enabledComposioSlugs,Ge as ensureAgentTables,St as ensureMessagesTable,Mr as estimateClefTokens,pr as estimateTokens,er as extractOutVarValues,sr as extractTemplateReferences,Ne as extractUserKeypoints,Wn as findScopedSourceNode,gt as forwardToAgentFlow,O as getAllMessages,Kn as getAncestorNodeIds,Dn as getDefaultOutVars,Fn as getEffectiveOutVars,xe as getFlowInputDefs,cs as getModelEntry,Xn as getRefTail,qn as getUpstreamOutVars,Fo as handleAgentsRoutes,Wo as handleAuthRoutes,wo as handleCommonRoutes,Ko as handleIntancesRoutes,nn as handlePersistedSessionInspection,tn as handleSessionRunControl,mt as handleTriggerRoutes,fn as hashText,M as initializeEngineState,zn as isBinaryOutVar,Vn as isJsonContentType,us as isNodeTypeAllowedForTenant,be as isStartMemoryEnabled,Sr as issueFingerprint,Pr as jsonSchemaToZod,Ie as logc,Pe as looksLikeTranscript,Ce as memoryGenerationMaxTokens,L as memoryMdLineLimit,_e as memoryTokenLimit,Me as mergeKeypointMemory,I as messageTypes,yr as newExternalRefs,xr as nextNodeId,Bt as normalizeDestination,Vr as normalizeEffectiveParams,hn as normalizeFlowInputs,ss as normalizeModelEntry,ts as normalizeReasoning,Yr as openAiReasoningParamSupport,Jr as openAiStandardParamSupport,Fr as parseClefResponse,W as parseCookies,dr as parseMemoryLength,Jn as parsePayloadText,rr as parseTemplateExpression,Ae as parseUserAuth,ke as parseUserMessage,_n as parseWorkerGraph,Un as parseWorkerOps,zr as pickNodeOverrides,Yn as readFetchPayload,ns as reasoningEffortLevels,rs as reasoningExposable,Xe as recordRun,os as registerProvider,Cr as resolveAnswerMappings,je as resolveModelById,nr as resolveOutVarRef,Qn as resolveOutVarValue,Wr as resolvePreset,Le as resolveReasoningEffort,tr as resolveReference,We as resolveRunUserId,ar as resolveTemplate,mr as rewriteNodeDataRefs,or as rewriteTemplateNodeRefs,D as runAgentTurn,$r as runClef,Nn as runCrawl,un as safeParseJSON,J as sanitizeMemoryDocument,P as sanitizeUserIdentity,An as schemaErrors,Hr as selectClefHistory,Qe as sendEvent,k as serverSend,qe as setMessage,Pn as shapeCrawlOutput,pt as signTriggerMaterial,Ke as startEngine,ve as startMemoryLength,Oe as startMemoryModel,Qr as stripUnsupportedFromNodeData,ln as tempTool,Zt as timingSafeEqualHex,Fe as toStreamTextSettings,dt as triggerSignatureMaterial,pn as twitter,Rr as validateAuthoring,jn as validateClassifierData,po as validateFlowStart,wr as validateFlowStructure,$n as validateOutVars,gn as vectorize,Vt as verifyToken,ft as verifyTriggerRequest,v as verifyUser,Zn as walkPath,Zr as workersAiParamSupport,Br as xaiParamSupport};
|
|
@@ -35,6 +35,10 @@ export interface AgentTurnResult {
|
|
|
35
35
|
error?: string;
|
|
36
36
|
engineState?: FlowEngineState;
|
|
37
37
|
answer?: string;
|
|
38
|
+
/** Ids of `executedNodes`, in execution order. */
|
|
39
|
+
path?: string[];
|
|
40
|
+
/** Redacted snapshot of the answer collector, when the turn produced structured outputs. */
|
|
41
|
+
outputs?: Record<string, unknown>;
|
|
38
42
|
}
|
|
39
43
|
/**
|
|
40
44
|
* Single execution path shared by every trigger source: persists the user turn, refreshes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { SessionEnv } from '../core/AgentDO';
|
|
2
2
|
import type { FlowEngineEvent, FlowEngineState } from '../logic/FlowEngine';
|
|
3
|
-
export default function classifierNodeRunner(sessionEnv: SessionEnv, node: any, engineState: FlowEngineState, onServerEvent?: (event: FlowEngineEvent) => void, onResult?: (key: string, result: any) => void,
|
|
3
|
+
export default function classifierNodeRunner(sessionEnv: SessionEnv, node: any, engineState: FlowEngineState, onServerEvent?: (event: FlowEngineEvent) => void, onResult?: (key: string, result: any) => void, _onChangeState?: (state: FlowEngineState) => void, onTelemetry?: (event: {
|
|
4
4
|
type: string;
|
|
5
5
|
payload: any;
|
|
6
6
|
}) => void): Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../../common/utils/clef';
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { enabledComposioSlugs } from '../../common/flow-graph/composio';
|
|
1
2
|
import type { FlowEngineState } from '../logic/FlowEngine';
|
|
2
3
|
import type { SessionEnv } from '../core/AgentDO';
|
|
4
|
+
export { enabledComposioSlugs };
|
|
3
5
|
export type ComposioAuthMode = 'in_app' | 'manual';
|
|
4
6
|
export type ComposioToolkitToolsConfig = {
|
|
5
7
|
enable?: string[];
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SecretsMap } from './secrets';
|
|
2
|
+
/**
|
|
3
|
+
* Replaces literal occurrences of loaded vault and auth values (8 characters or longer).
|
|
4
|
+
* Transformed values (base64, hashes, truncated copies) are left as-is.
|
|
5
|
+
*/
|
|
6
|
+
export declare function redactKnownSecrets<T>(value: T, secrets?: SecretsMap | null, userAuth?: SecretsMap | null): T;
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{h as a,i as b}from"./chunk-DEW7U7V7.js";import"./chunk-V35SRZAO.js";import"./chunk-ZYIULB2P.js";import"./chunk-6AZ7RATD.js";import"./chunk-XXB57DMN.js";import"./chunk-3K4IMMLP.js";import"./chunk-6JUKM6LT.js";import"./chunk-QEZQZG6Z.js";import"./chunk-V6JSMX5A.js";import"./chunk-YLDLDEUP.js";import"./chunk-U56YWPSI.js";import"./chunk-YHXUBVN2.js";import"./chunk-3TXHFKDN.js";export{b as FlowExecutionStoppedError,a as startEngine};
|
package/dist/chunk-6JUKM6LT.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
var we={USER_MESSAGE:"M",USER_CLEAR_HISTORY:"CH",USER_AUTH:"AUT",USER_IDENTITY:"UID",SERVER_EVENT:"SE",SERVER_HISTORY:"HIS",SERVER_ERROR:"ERR",SERVER_STEP:"STEP",SERVER_TEXT_STREAM:"TS",SERVER_TEXT_STREAM_COMPLETE:"TSC",SERVER_REASONING_STREAM:"RS",SERVER_REASONING_STREAM_COMPLETE:"RSC",SERVER_CONFIG:"CFG"};function Ee(e){try{let t=JSON.parse(e);if(t&&typeof t=="object"&&typeof t.text=="string")return t}catch{}return{text:e}}var Z=256;function Re(e){if(typeof e!="string")return null;let t=e.trim();return t?t.slice(0,Z):null}function be(e){try{let t=JSON.parse(e);if(t&&typeof t=="object"&&typeof t.name=="string"&&typeof t.value=="string"){let n=t.name.trim();return/^[A-Z][A-Z0-9_]*$/.test(n)?{name:n,value:t.value}:null}}catch{}return null}var X={short:100,medium:250,long:1e3},Q={short:2e3,medium:5e3,long:2e4},L="medium",ee="gpt_5_nano",F=4;function te(e){return e==="short"||e==="medium"||e==="long"?e:L}function ne(e=L){return Q[e]}function Te(e=L){return X[e]}function re(e){return e?Math.ceil(e.length/F):0}function oe(e,t){if(!e)return{content:"",truncated:!1};if(re(e)<=t)return{content:e,truncated:!1};let n=Math.max(0,t*F);return{content:e.slice(0,n),truncated:!0}}function Ce(e){let t=e==null?void 0:e.memory_enabled;return t===!0||t==="true"||t===1}function Me(e){let t=e==null?void 0:e.memory_model;return typeof t=="string"&&t.trim()?t.trim():ee}function ke(e){return te(e==null?void 0:e.memory_length)}function ve(e,t){let n=ne(e);return t&&t!=="none"?n+2048:n}var H=/^(user|assistant|usuario|asistente|u|a)\s*:/i,se=/^(hola|hello|hi|hey|buenas|buen[oa]s?\s+d[ií]as?|qu[eé]\s+tal|qu[eé]\s+haces)[\s,.!¡¿?]*$/i;function ie(e){let t=e.split(`
|
|
2
|
-
`).map(r=>r.replace(/^[-*]\s*/,"").trim()).filter(Boolean);if(t.length<2)return!1;let n=t.filter(r=>H.test(r));return n.length>=2&&n.length>=Math.ceil(t.length/2)}function ae(e){let t=e.split(`
|
|
3
|
-
`).map(n=>n.trim()).filter(Boolean).filter(n=>n!=="(empty)"&&n!=="(none)").filter(n=>!H.test(n.replace(/^[-*]\s*/,"")));return ie(t.join(`
|
|
4
|
-
`))?"":t.join(`
|
|
5
|
-
`)}function Oe(e){let t=e.trim();if(!t||se.test(t))return[];let n=[],r=t.match(/(?:me llamo|soy|i['’]m|i am|my name is)\s+([A-Za-zÁÉÍÓÚÜáéíóúüñÑ][\wÁÉÍÓÚÜáéíóúüñÑ'-]{1,40})/i);r&&n.push(`Name: ${r[1]}`);let i=t.match(/me gusta[n]?\s+([^,.!?]+)/i);if(i&&n.push(`Likes: ${i[1].trim()}`),/[?¿]/.test(t)||/^(pregunt|dime\b|cu[eé]nt)/i.test(t))return n;let m=t.replace(/^(hola|hey|hi)[,\s]+/i,"").replace(/(?:me llamo|soy)\s+[A-Za-zÁÉÍÓÚÜáéíóúüñÑ][\wÁÉÍÓÚÜáéíóúüñÑ'-]*/gi,"").replace(/me gusta[n]?\s+[^,.!?]+/gi,"").replace(/[,.\s]+/g," ").trim();return m.length>=16&&n.push(m.slice(0,140)),n}function _e(e,t,n){let i=[...ae(e).split(`
|
|
6
|
-
`).map(s=>s.replace(/^[-*]\s*/,"").trim()).filter(Boolean)];for(let s of t){let m=s.replace(/^[-*]\s*/,"").trim();m&&(i.some(a=>a.toLowerCase()===m.toLowerCase())||i.push(m))}return i.length===0?"":oe(i.map(s=>`- ${s}`).join(`
|
|
7
|
-
`),n).content}var Y={crawlNode:["cx_hugex"],toolNode:["cx_hugex"]};function Ie(e,t){let n=Object.hasOwn(Y,e)?Y[e]:void 0;return n===void 0||!!t&&n.includes(t)}var P={source:"all",limit:5,depth:2,render:!1,format:"markdown",includeSubdomains:!1,waitTimeoutMs:6e4,maxAgeS:86400,maxCharsPerPage:4e3},S={limit:50,depth:10,waitTimeoutMs:12e4,maxAgeS:604800,maxOutputBytes:256*1024};function v(e,t,n,r=0){return Math.min(n,Math.max(r,Math.floor(typeof e=="number"&&Number.isFinite(e)?e:t)))}function ue(e,t,n){let r=new URL(t);if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error("Crawl URL must use http(s)");let i=e.format??P.format;return{url:r.href,source:e.source??P.source,limit:v(e.limit,P.limit,S.limit,1),depth:v(e.depth,P.depth,S.depth),render:e.render??P.render,formats:[i],...i==="json"?{jsonOptions:{...e.jsonPrompt!==void 0?{prompt:e.jsonPrompt}:{},...e.jsonSchema!==void 0?{response_format:e.jsonSchema}:{}}}:{},maxAge:v((n==null?void 0:n.maxAgeOverrideS)??e.maxAgeS,P.maxAgeS,S.maxAgeS),options:{includeExternalLinks:!1,includeSubdomains:e.includeSubdomains??P.includeSubdomains,includePatterns:e.includePatterns??[],excludePatterns:e.excludePatterns??[]}}}function I(e){return Array.isArray(e)?e.map(I):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0).sort(([t],[n])=>t.localeCompare(n)).map(([t,n])=>[t,I(n)])):e}async function qe(e){let t=new TextEncoder().encode(JSON.stringify(I(e))),n=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(n),r=>r.toString(16).padStart(2,"0")).join("")}function le(e,t){let n=t.split(/(\*\*|\*)/).map(r=>r==="**"?".*":r==="*"?"[^/]*":r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("");return new RegExp(`^${n}$`).test(e)}function z(e,t,n){let r=(t==null?void 0:t.mode)??"pages",i=(t==null?void 0:t.fields)??["url","title",n],s=v(t==null?void 0:t.maxCharsPerPage,P.maxCharsPerPage,S.maxOutputBytes),m=e;if(r==="single"){let o=t==null?void 0:t.select,l=(o==null?void 0:o.url)!==void 0?e.find(u=>u.url===o.url):(o==null?void 0:o.pattern)!==void 0?e.find(u=>le(u.url,o.pattern)):e[(o==null?void 0:o.index)??0];m=l?[l]:[]}let a=!1,c=m.map(o=>{let l={url:o.url,status:o.status};o.httpStatus!==void 0&&(l.httpStatus=o.httpStatus),i.includes("title")&&o.title!==void 0&&(l.title=o.title);let u=o.truncated??!1;if(i.includes("markdown")&&o.markdown!==void 0&&(l.markdown=o.markdown.slice(0,s),u||=l.markdown.length<o.markdown.length),i.includes("json")&&o.json!==void 0){let T=o.truncated&&typeof o.json=="string"?o.json:JSON.stringify(o.json);l.json=T.length>s?T.slice(0,s):o.json,u||=T.length>s}return u&&(l.truncated=!0),a||=u,l});if(r!=="concat")return{pages:c,truncated:a};let d=c.map(o=>i.map(l=>{let u=o[l];return u===void 0?"":typeof u=="string"?u:JSON.stringify(u)}).filter(Boolean).join(`
|
|
8
|
-
`)).join(`
|
|
9
|
-
|
|
10
|
-
`);return{pages:[],text:d,truncated:a}}var B=e=>new TextEncoder().encode(JSON.stringify(e)).byteLength;async function Ue(e,t,n){var K,D,G;let r=Date.now(),i=r+v(t.waitTimeoutMs,P.waitTimeoutMs,S.waitTimeoutMs),s=n.fetchImpl??fetch,m=n.sleep??(g=>new Promise(w=>setTimeout(w,g))),a=n.resumeJobId??null,c={status:"running"},d=[],o=!1,l=2,u=()=>Math.max(0,i-Date.now()),T=async g=>{if(!u())throw new Error("timeout");if(await m(Math.min(g,u())),!u())throw new Error("timeout")},N=async(g,w)=>{var E,h,p,b,y;for(let R=0;;R++){if(!u())throw new Error("timeout");let f=new AbortController,M,k=new Promise((x,C)=>{M=setTimeout(()=>{f.abort(),C(new Error("timeout"))},u())});try{let x=await Promise.race([s(g,{...w,signal:f.signal,headers:{Authorization:`Bearer ${e.apiToken}`,"Content-Type":"application/json"}}),k]);if(x.status===429&&R<2){let O=x.headers.get("Retry-After"),$=O===null?NaN:Number(O),W=Number.isFinite($)?Math.max(0,$*1e3):O?Math.max(0,Date.parse(O)-Date.now()):2e3;await((E=x.body)==null?void 0:E.cancel()),clearTimeout(M),await T(Number.isFinite(W)?W:2e3);continue}let C=await Promise.race([x.json(),k]);if(C.success===!1)throw new Error(((p=(h=C.errors)==null?void 0:h[0])==null?void 0:p.message)??"Crawl API error");if(!x.ok)throw new Error(((y=(b=C.errors)==null?void 0:b[0])==null?void 0:y.message)??`Crawl API HTTP ${x.status}`);if(!u())throw new Error("timeout");return C}catch(x){throw f.signal.aborted||!u()?new Error("timeout"):x}finally{clearTimeout(M)}}},U=(g,w)=>{let E=()=>z(d.filter(b=>b.status==="completed"),t.output,t.format??"markdown"),h=E(),p={ok:g,error:w,data:a?{jobId:a,status:w==="timeout"?"running":c.status,total:c.total??0,finished:c.finished??0,browserSeconds:c.browserSecondsUsed??0,elapsedMs:Date.now()-r,...h,truncated:o||h.truncated}:null};for(;B(p)>S.maxOutputBytes&&d.length;)d.pop(),h=E(),Object.assign(p.data,h,{truncated:!0});return{result:p,allPages:d}};try{if(!e.accountId||!e.apiToken)throw new Error("Crawl no configurado: faltan CF_ACCOUNT_ID / CF_BROWSER_RUN_TOKEN");let g=ue(t,n.url,n),w=`https://api.cloudflare.com/client/v4/accounts/${encodeURIComponent(e.accountId)}/browser-run/crawl`;if(!a){let y=await N(w,{method:"POST",body:JSON.stringify(g)});if(typeof y.result!="string"||!y.result)throw new Error("Crawl API returned no jobId");a=y.result}let E=`${w}/${encodeURIComponent(a)}`,h=2e3;do{let y=await N(`${E}?limit=1`);if(!y.result||typeof y.result!="object"||!y.result.status)throw new Error("Crawl API returned no status");if(c=y.result,c.status!=="running")break;await T(h),h=Math.min(5e3,h+1e3)}while(u());let p,b=new Set;do{let y=p===void 0?"":`?cursor=${encodeURIComponent(p)}`,R=await N(`${E}${y}`);if(!R.result||typeof R.result!="object")throw new Error("Crawl API returned invalid results");c={...c,...R.result};for(let f of R.result.records??[]){let M={url:f.url,status:f.status,...((K=f.metadata)==null?void 0:K.title)!==void 0?{title:f.metadata.title}:{},...((D=f.metadata)==null?void 0:D.status)!==void 0?{httpStatus:f.metadata.status}:{},...f.markdown!==void 0?{markdown:f.markdown}:{},...f.json!==void 0?{json:f.json}:{}},k=z([M],{mode:"pages",maxCharsPerPage:(G=t.output)==null?void 0:G.maxCharsPerPage},t.format??"markdown").pages[0],x=B(k)+1;if(l+x>S.maxOutputBytes){o=!0;break}d.push(k),l+=x}if(o)break;if(p=R.result.cursor,p!=null&&p!==""){if(b.has(String(p)))throw new Error("Crawl API repeated pagination cursor");b.add(String(p))}else p=void 0}while(p!==void 0);return U(c.status==="completed",c.status==="completed"?null:c.status)}catch(g){return U(!1,g instanceof Error?g.message:String(g))}}var q=["temperature","topP","topK","frequencyPenalty","presencePenalty","maxOutputTokens","seed","stopSequences","maxRetries"],J=["temperature","topP","topK","frequencyPenalty","presencePenalty"],V={precise:{temperature:.3,topP:.9,topK:30},balanced:{temperature:.8,topP:1,topK:50},creative:{temperature:1.1,topP:.95,topK:80}},ce=1e-6,j={temperature:{min:0,max:2,step:.1},topP:{min:0,max:1,step:.05},topK:{min:1,max:500,step:1},frequencyPenalty:{min:-2,max:2,step:.1},presencePenalty:{min:-2,max:2,step:.1},maxOutputTokens:{max:128e3},seed:!0,stopSequences:{max:4}};function me(e){return/^gpt-5/i.test(e)}function _(e){let t=e.contextWindow??128e3;return e.provider==="openai"?me(e.providerModel)?{temperature:!1,topP:!1,topK:{min:1,max:500,step:1},frequencyPenalty:{min:-2,max:2,step:.1},presencePenalty:{min:-2,max:2,step:.1},maxOutputTokens:{max:t},seed:!0,stopSequences:{max:4}}:{...j,maxOutputTokens:{max:t}}:e.provider==="xai"?{...j,maxOutputTokens:{max:t},seed:!0}:e.provider==="anthropic"?{temperature:{min:0,max:1,step:.1},topP:{min:0,max:1,step:.05},topK:{min:1,max:500,step:1},frequencyPenalty:!1,presencePenalty:!1,maxOutputTokens:{max:t},seed:!1,stopSequences:{max:4}}:e.provider==="openrouter"?{temperature:{min:0,max:2,step:.1},topP:{min:0,max:1,step:.05},topK:{min:1,max:500,step:1},frequencyPenalty:{min:-2,max:2,step:.1},presencePenalty:{min:-2,max:2,step:.1},maxOutputTokens:{max:t},seed:!0,stopSequences:{max:4}}:e.provider==="workersai"||e.provider==="cloudflare"?{temperature:{min:0,max:2,step:.1},topP:{min:0,max:1,step:.05},topK:{min:1,max:500,step:1},frequencyPenalty:!1,presencePenalty:!1,maxOutputTokens:{max:t},seed:!1,stopSequences:{max:4}}:{...j,maxOutputTokens:{max:t}}}function A(e,t){if(e==="maxRetries")return!0;let n=t[e];return n===!1?!1:e==="seed"?n===!0:n!==void 0}function pe(e,t,n){return Math.min(n,Math.max(t,e))}function fe(e,t){return e===void 0&&t===void 0?!0:e===void 0||t===void 0?!1:Math.abs(e-t)<ce}function De(e,t){for(let n of["precise","balanced","creative"]){let r=V[n],i=!0;for(let s of J){if(t&&!A(s,t))continue;let m=r[s],a=e[s];if(m!==void 0){if(typeof m=="number"&&typeof a=="number"){if(!fe(a,m)){i=!1;break}}else if(a!==m){i=!1;break}}}if(i)return n}return"custom"}function Ge(e,t){let n=V[e],r={};for(let i of J){if(t&&!A(i,t))continue;let s=n[i];s!==void 0&&(r[i]=s)}return r}function $e(e){if(!e)return{};let t={};for(let n of q){let r=e[n];r!==void 0&&(n==="stopSequences"?Array.isArray(r)&&(t.stopSequences=r.filter(i=>typeof i=="string")):n==="maxRetries"?typeof r=="number"&&(t.maxRetries=r):typeof r=="number"&&(t[n]=r))}return t}function We(e,t,n){var m;let r={...e,...t},i=[],s={};for(let a of q){let c=r[a];if(c===void 0)continue;if(a==="maxRetries"){s.maxRetries=c;continue}if(!A(a,n)){i.push({key:a,action:"stripped",detail:"unsupported by model"});continue}if(a==="stopSequences"){let o=c,l=((m=n.stopSequences)==null?void 0:m.max)??o.length;o.length>l?(s.stopSequences=o.slice(0,l),i.push({key:a,action:"clamped",detail:`truncated to ${l} sequences`})):s.stopSequences=o;continue}if(a==="seed"){s.seed=c;continue}let d=n[a];if(d&&typeof d=="object"&&"min"in d){let o=c,l=pe(o,d.min,d.max);s[a]=l,l!==o&&i.push({key:a,action:"clamped",detail:`clamped from ${o} to ${l}`})}else if(a==="maxOutputTokens"){let o=c,l=n.maxOutputTokens.max,u=Math.min(o,l);s.maxOutputTokens=u,u!==o&&i.push({key:a,action:"clamped",detail:`clamped from ${o} to ${u}`})}}return{effectiveParams:s,adjustments:i}}function Fe(e){let t={};return e.temperature!==void 0&&(t.temperature=e.temperature),e.topP!==void 0&&(t.topP=e.topP),e.topK!==void 0&&(t.topK=e.topK),e.frequencyPenalty!==void 0&&(t.frequencyPenalty=e.frequencyPenalty),e.presencePenalty!==void 0&&(t.presencePenalty=e.presencePenalty),e.maxOutputTokens!==void 0&&(t.maxOutputTokens=e.maxOutputTokens),e.seed!==void 0&&(t.seed=e.seed),e.stopSequences!==void 0&&(t.stopSequences=e.stopSequences),e.maxRetries!==void 0&&(t.maxRetries=e.maxRetries),t}function He(e=128e3){return _({provider:"openai",providerModel:"gpt-4.1",contextWindow:e})}function Ye(e=2e6){return _({provider:"openai",providerModel:"gpt-5-nano",contextWindow:e})}function ze(e=256e3){return _({provider:"xai",providerModel:"grok-4-fast",contextWindow:e})}function Be(e=128e3){return _({provider:"cloudflare",providerModel:"@cf/meta/llama-3.2-3b-instruct",contextWindow:e})}function Je(e,t){let n={...e};for(let r of q)r==="maxRetries"||n[r]===void 0||A(r,t)||delete n[r];return n}var de=["none","minimal","low","medium","high","xhigh"],ge=e=>typeof e=="string"&&de.includes(e);function Ze(e){var n;let t=(n=e.capabilities)==null?void 0:n.reasoning;return t&&typeof t=="object"?t:t?{kind:"effort"}:{kind:"none"}}function ye(e){return e.kind!=="effort"?[]:e.levels??[]}var xe=e=>e===!0||e==="true";function Xe(e){return e.kind==="tag"?!0:e.kind==="effort"?xe(e.exposesReasoning):!1}function Qe(e,t){if(e.kind!=="effort")return;let n=ye(e);if(ge(t)&&n.includes(t))return t;if(e.defaultLevel&&n.includes(e.defaultLevel))return e.defaultLevel}function et(e,t){let{effort:n,exposeReasoning:r,maxTokens:i}=t;if(e==="openai"){let s={};return n&&(s.reasoningEffort=n),r&&(s.reasoningSummary="auto"),Object.keys(s).length?{openai:s}:void 0}if(e==="xai")return n?{xai:{reasoningEffort:n}}:void 0;if(e==="openrouter"){if(!i&&!n)return;let s={};return r!==void 0&&(s.exclude=!r),i?{openrouter:{reasoning:{...s,max_tokens:i}}}:{openrouter:{reasoning:{...s,effort:n}}}}if(e==="anthropic"){let s={};return(n||r)&&(s.thinking={type:"adaptive",...r?{display:"summarized"}:{}}),n&&(s.effort=n),Object.keys(s).length?{anthropic:s}:void 0}}var he=[{id:"convertTempMessure",label:"Convert Temperature",description:"Convert temperature between Celsius, Fahrenheit, and Kelvin with optional static parameters"},{id:"tempTool",label:"Temp Tool",description:"Temporary demo tool"},{id:"twitter",label:"Twitter",description:"Twitter API for user info, tweets, mentions, replies, advanced search, and trends"},{id:"vectorize",label:"Vectorize",description:"Perform a semantic vector search. Returns relevant matches with scores and metadata."}],nt=he.reduce((e,t)=>(e[t.id]=t,e),{});export{we as a,Ee as b,Z as c,Re as d,be as e,X as f,Q as g,L as h,ee as i,te as j,ne as k,Te as l,re as m,oe as n,Ce as o,Me as p,ke as q,ve as r,ie as s,ae as t,Oe as u,_e as v,Y as w,Ie as x,P as y,S as z,ue as A,qe as B,z as C,Ue as D,q as E,J as F,V as G,_ as H,De as I,Ge as J,$e as K,We as L,Fe as M,He as N,Ye as O,ze as P,Be as Q,Je as R,de as S,Ze as T,ye as U,Xe as V,Qe as W,et as X,nt as Y};
|