@cascaide-ts/postgres-js 0.1.0 → 0.5.1

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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License
2
2
 
3
- Copyright (c) 2026 Cascaide
3
+ Copyright (c) 2026 Jishnu K Ramakrishnan
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # @cascaide-ts/postgres-js
2
+
3
+ Cascaide is a fullstack agent runtime and AI orchestration framework in typescript.
4
+
5
+ `cascaide-ts/postgres-js` provides the postgres backed durability layer for cascade executions. Used to create the persistence api route.
6
+
7
+
8
+ ## Installation
9
+
10
+ ```bash
11
+ npm i @cascaide-ts/postgres-js
12
+ ```
13
+
14
+ ## Example Use
15
+
16
+ ```ts
17
+ import { createPersistenceHandler } from '@cascaide-ts/server-next';
18
+ import { PostgresPersistor } from '@cascaide-ts/postgres-js';
19
+ import { sql } from '@/lib/pglite';
20
+
21
+ const persistor = new PostgresPersistor(sql);
22
+ export const POST =createPersistenceHandler(persistor);
23
+
24
+ ```
25
+
26
+ ## Additional Resources
27
+
28
+ [Pesistence Concepts](https://www.cascaide-ts.com/docs/capabilities/persistence)
29
+ [Persistence Setup](https://www.cascaide-ts.com/docs/QuickStart/db)
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- var l=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var x=(r,t)=>{for(var a in t)l(r,a,{get:t[a],enumerable:!0})},R=(r,t,a,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of T(t))!C.call(r,e)&&e!==a&&l(r,e,{get:()=>t[e],enumerable:!(n=I(t,e))||n.enumerable});return r};var S=r=>R(l({},"__esModule",{value:!0}),r);var y={};x(y,{PostgresPersistor:()=>u});module.exports=S(y);var f=require("crypto"),u=class{constructor(t){this.sql=t}async claimNodeExecution(t){let a=performance.now(),{nodeInstanceId:n,cascadeId:e,userId:s,nodeName:c,functionId:o,inputContext:d,location:i}=t;console.log("Claiming node execution:",{cascadeId:e,nodeName:c,requestedId:o});let _=(0,f.randomUUID)(),m=await this.sql.begin(async N=>{let E=await N`
1
+ var E=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var I=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var C=(u,e)=>{for(var r in e)E(u,r,{get:e[r],enumerable:!0})},R=(u,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of I(e))!T.call(u,t)&&t!==r&&E(u,t,{get:()=>e[t],enumerable:!(n=m(e,t))||n.enumerable});return u};var S=u=>R(E({},"__esModule",{value:!0}),u);var y={};C(y,{PostgresPersistor:()=>_});module.exports=S(y);var f=require("crypto"),x=process.env.NODE_ENV==="development",O=(...u)=>{x&&console.log(...u)};var _=class{constructor(e){this.sql=e}sql;async claimNodeExecution(e){let r=performance.now(),{nodeInstanceId:n,cascadeId:t,userId:c,nodeName:i,functionId:o,inputContext:a,location:s}=e;O("Claiming node execution:",{cascadeId:t,nodeName:i,requestedId:o});let d=(0,f.randomUUID)(),N=await this.sql.begin(async p=>{let l=await p`
2
2
  WITH conflict_check AS (
3
3
  -- Single aggregation combining conflict detection and MAX calculation
4
4
  -- More efficient than separate EXISTS and MAX queries
@@ -9,11 +9,11 @@ var l=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var T=Object.g
9
9
  ELSE ${o}
10
10
  END as next_fn_id
11
11
  FROM node_executions
12
- WHERE cascade_id = ${e}
12
+ WHERE cascade_id = ${t}
13
13
  ),
14
14
  cascade_upsert AS (
15
15
  INSERT INTO cascades (id, user_id, status, fn_id, created_at, updated_at)
16
- SELECT ${e}, ${s}, 'RUNNING', next_fn_id, NOW(), NOW()
16
+ SELECT ${t}, ${c}, 'RUNNING', next_fn_id, NOW(), NOW()
17
17
  FROM conflict_check
18
18
  ON CONFLICT (id) DO UPDATE
19
19
  SET fn_id = EXCLUDED.fn_id, updated_at = NOW()
@@ -31,23 +31,23 @@ var l=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var T=Object.g
31
31
  started_at
32
32
  )
33
33
  SELECT
34
- ${_},
34
+ ${d},
35
35
  ${n},
36
- ${e},
37
- ${c},
38
- fn_id,
39
- ${this.sql.json(d)},
36
+ ${t},
40
37
  ${i},
38
+ fn_id,
39
+ ${this.sql.json(a)},
40
+ ${s},
41
41
  'RUNNING',
42
42
  NOW()
43
43
  FROM cascade_upsert
44
44
  RETURNING status, function_id as "functionId"
45
- `;return{status:E[0].status,functionId:Number(E[0].functionId)}}),p=performance.now()-a;return console.log(`claimNodeExecution latency: ${p.toFixed(2)}ms`,{cascadeId:e,nodeName:c}),m}async finalizeNodeExecution(t){let a=performance.now(),{nodeInstanceId:n,cascadeId:e,fullOutput:s,hasSpawns:c}=t,o=await this.sql.begin(async i=>(await i`
45
+ `;return{status:l[0].status,functionId:Number(l[0].functionId)}}),g=performance.now()-r;return N}async finalizeNodeExecution(e){let r=performance.now(),{nodeInstanceId:n,cascadeId:t,fullOutput:c,hasSpawns:i}=e;return await this.sql.begin(async a=>(await a`
46
46
  WITH updated_node AS (
47
47
  UPDATE node_executions
48
48
  SET
49
49
  status = 'COMPLETED',
50
- full_output = ${this.sql.json(s)},
50
+ full_output = ${this.sql.json(c)},
51
51
  completed_at = NOW()
52
52
  WHERE node_instance_id = ${n}
53
53
  RETURNING cascade_id
@@ -55,82 +55,72 @@ var l=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var T=Object.g
55
55
  UPDATE cascades
56
56
  SET status = 'COMPLETED', updated_at = NOW()
57
57
  WHERE id IN (SELECT cascade_id FROM updated_node)
58
- AND ${!c}
59
- `,{status:"COMPLETED"})),d=performance.now()-a;return console.log(`finalizeNodeExecution latency: ${d.toFixed(2)}ms`,{cascadeId:e,nodeInstanceId:n}),o}async markExecutionFailed(t,a,n){let e=performance.now(),s=await this.sql.begin(async o=>(await o`
58
+ AND ${!i}
59
+ `,{status:"COMPLETED"}))}async markExecutionFailed(e,r,n){let t=performance.now();return await this.sql.begin(async i=>(await i`
60
60
  WITH updated_node AS (
61
61
  UPDATE node_executions
62
62
  SET status = 'FAILED', error = ${n}, completed_at = NOW()
63
- WHERE node_instance_id = ${t}
63
+ WHERE node_instance_id = ${e}
64
64
  RETURNING cascade_id
65
65
  )
66
66
  UPDATE cascades
67
67
  SET status = 'ERROR', updated_at = NOW()
68
68
  WHERE id IN (SELECT cascade_id FROM updated_node)
69
- `,{status:"FAILED"})),c=performance.now()-e;return console.log(`markExecutionFailed latency: ${c.toFixed(2)}ms`,{cascadeId:a,nodeInstanceId:t}),s}async recordContextEvents(t){let a=performance.now(),{cascadeId:n,functionId:e,updates:s}=t,c=Object.entries(s).map(([d,i])=>({key:d,value:this.sql.json(i),function_id:e,cascade_id:n,created_at:new Date}));if(c.length===0){let d=performance.now()-a;return console.log(`recordContextEvents latency: ${d.toFixed(2)}ms (no events)`,{cascadeId:n,functionId:e}),{status:"SUCCESS"}}await this.sql`
70
- INSERT INTO context_events ${this.sql(c,"key","value","function_id","cascade_id","created_at")}
71
- `;let o=performance.now()-a;return console.log(`recordContextEvents latency: ${o.toFixed(2)}ms (${c.length} events)`,{cascadeId:n,functionId:e}),{status:"SUCCESS"}}async hydrateCascadeContext(t,a){let n=performance.now(),e=await this.sql`
72
- SELECT key, value, function_id, created_at
73
- FROM context_events
74
- WHERE cascade_id = ${t}
75
- AND function_id < ${a}
76
- ORDER BY function_id ASC, created_at ASC
77
- `,s={};for(let o of e){let d=o.key,i=o.value;if(s[d]||(s[d]=[]),typeof i=="object"&&i!==null&&!Array.isArray(i)&&"index"in i){let _=i.index;s[d][_]=i}else s[d].push(i)}let c=performance.now()-n;return console.log(`hydrateCascadeContext latency: ${c.toFixed(2)}ms (${e.length} events)`,{cascadeId:t,upToFunctionId:a}),s}async forkCascade(t){let a=performance.now(),{sourceCascadeId:n,newCascadeId:e,upToFunctionId:s}=t;await this.sql.begin(async o=>{await o`
69
+ `,{status:"FAILED"}))}async recordContextEvents(e){let r=performance.now(),{cascadeId:n,functionId:t,updates:c,uiUpdates:i}=e,o=Object.entries(c).map(([a,s])=>{let d=i?.[a];return{key:a,value:this.sql.json(s),ui_value:d!==void 0?this.sql.json(d):null,function_id:t,cascade_id:n,created_at:new Date}});return o.length===0?{status:"SUCCESS"}:(await this.sql`
70
+ INSERT INTO context_events ${this.sql(o,"key","value","ui_value","function_id","cascade_id","created_at")}
71
+ `,{status:"SUCCESS"})}async hydrateCascadeContext(e,r,n){let t=performance.now(),c;n?c=await this.sql`
72
+ SELECT
73
+ key,
74
+ COALESCE(ui_value, value) AS value,
75
+ function_id,
76
+ created_at
77
+ FROM context_events
78
+ WHERE cascade_id = ${e}
79
+ AND function_id < ${r}
80
+ ORDER BY function_id ASC, created_at ASC
81
+ `:c=await this.sql`
82
+ SELECT
83
+ key,
84
+ value,
85
+ function_id,
86
+ created_at
87
+ FROM context_events
88
+ WHERE cascade_id = ${e}
89
+ AND function_id < ${r}
90
+ ORDER BY function_id ASC, created_at ASC
91
+ `;let i={};for(let o of c){let a=o.key,s=o.value;if(i[a]||(i[a]=[]),typeof s=="object"&&s!==null&&!Array.isArray(s)&&"index"in s){let d=s.index;i[a][d]=s}else i[a].push(s)}return i}async forkCascadeWithContext(e){let r=performance.now(),{sourceCascadeId:n,newCascadeId:t,upToFunctionId:c}=e,i=await this.sql.begin(async a=>(await a`
78
92
  INSERT INTO cascades (id, user_id, status, fn_id, created_at, updated_at)
79
93
  SELECT
80
- ${e},
94
+ ${t},
81
95
  user_id,
82
96
  'RUNNING',
83
- ${s-1},
97
+ ${c-1},
84
98
  NOW(),
85
99
  NOW()
86
100
  FROM cascades
87
101
  WHERE id = ${n}
88
- `,await o`
102
+ `,await a`
89
103
  INSERT INTO node_executions (
90
- id,
91
- node_instance_id,
92
- cascade_id,
93
- node_name,
94
- function_id,
95
- input_context,
96
- location,
97
- status,
98
- started_at,
99
- completed_at,
100
- full_output,
101
- error
104
+ id, node_instance_id, cascade_id, node_name, function_id,
105
+ input_context, location, status, started_at, completed_at, full_output, error
102
106
  )
103
107
  SELECT
104
- gen_random_uuid(),
105
- node_instance_id,
106
- ${e},
107
- node_name,
108
- function_id,
109
- input_context,
110
- location,
111
- status,
112
- started_at,
113
- completed_at,
114
- full_output,
115
- error
108
+ gen_random_uuid(), gen_random_uuid(), ${t},
109
+ node_name, function_id, input_context, location, status,
110
+ started_at, completed_at, full_output, error
116
111
  FROM node_executions
117
112
  WHERE cascade_id = ${n}
118
- AND function_id < ${s}
119
- `,await o`
120
- INSERT INTO context_events (
121
- key,
122
- value,
123
- function_id,
124
- cascade_id,
125
- created_at
126
- )
113
+ AND function_id < ${c}
114
+ `,await a`
115
+ INSERT INTO context_events (key, value, function_id, cascade_id, created_at)
127
116
  SELECT
128
- key,
117
+ CASE WHEN key = ${n} THEN ${t} ELSE key END,
129
118
  value,
130
119
  function_id,
131
- ${e},
120
+ ${t},
132
121
  created_at
133
122
  FROM context_events
134
123
  WHERE cascade_id = ${n}
135
- AND function_id < ${s}
136
- `});let c=performance.now()-a;return console.log(`forkCascade latency: ${c.toFixed(2)}ms`,{sourceCascadeId:n,newCascadeId:e,upToFunctionId:s}),{newCascadeId:e,status:"SUCCESS"}}};0&&(module.exports={PostgresPersistor});
124
+ AND function_id < ${c}
125
+ RETURNING key, value, function_id, created_at
126
+ `)),o={};for(let a of i){let{key:s,value:d}=a;o[s]||(o[s]=[]),typeof d=="object"&&d!==null&&!Array.isArray(d)&&"index"in d?o[s][d.index]=d:o[s].push(d)}return{newCascadeId:t,status:"SUCCESS",context:o}}};0&&(module.exports={PostgresPersistor});
package/dist/index.d.cts CHANGED
@@ -23,17 +23,21 @@ declare class PostgresPersistor implements CascadePersistence {
23
23
  updates: {
24
24
  [key: string]: any;
25
25
  };
26
+ uiUpdates?: {
27
+ [key: string]: any;
28
+ };
26
29
  }): Promise<{
27
30
  status: string;
28
31
  }>;
29
- hydrateCascadeContext(cascadeId: string, upToFunctionId: number): Promise<WorkflowContext>;
30
- forkCascade(params: {
32
+ hydrateCascadeContext(cascadeId: string, upToFunctionId: number, ui?: boolean): Promise<WorkflowContext>;
33
+ forkCascadeWithContext(params: {
31
34
  sourceCascadeId: string;
32
35
  newCascadeId: string;
33
36
  upToFunctionId: number;
34
37
  }): Promise<{
35
38
  newCascadeId: string;
36
39
  status: string;
40
+ context: WorkflowContext;
37
41
  }>;
38
42
  }
39
43
 
package/dist/index.d.ts CHANGED
@@ -23,17 +23,21 @@ declare class PostgresPersistor implements CascadePersistence {
23
23
  updates: {
24
24
  [key: string]: any;
25
25
  };
26
+ uiUpdates?: {
27
+ [key: string]: any;
28
+ };
26
29
  }): Promise<{
27
30
  status: string;
28
31
  }>;
29
- hydrateCascadeContext(cascadeId: string, upToFunctionId: number): Promise<WorkflowContext>;
30
- forkCascade(params: {
32
+ hydrateCascadeContext(cascadeId: string, upToFunctionId: number, ui?: boolean): Promise<WorkflowContext>;
33
+ forkCascadeWithContext(params: {
31
34
  sourceCascadeId: string;
32
35
  newCascadeId: string;
33
36
  upToFunctionId: number;
34
37
  }): Promise<{
35
38
  newCascadeId: string;
36
39
  status: string;
40
+ context: WorkflowContext;
37
41
  }>;
38
42
  }
39
43
 
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{randomUUID as m}from"crypto";var u=class{constructor(o){this.sql=o}async claimNodeExecution(o){let c=performance.now(),{nodeInstanceId:n,cascadeId:e,userId:t,nodeName:s,functionId:a,inputContext:d,location:i}=o;console.log("Claiming node execution:",{cascadeId:e,nodeName:s,requestedId:a});let r=m(),l=await this.sql.begin(async f=>{let _=await f`
1
+ import{randomUUID as N}from"crypto";var p=process.env.NODE_ENV==="development",m=(..._)=>{p&&console.log(..._)};var u=class{constructor(d){this.sql=d}sql;async claimNodeExecution(d){let r=performance.now(),{nodeInstanceId:i,cascadeId:s,userId:o,nodeName:n,functionId:a,inputContext:e,location:t}=d;m("Claiming node execution:",{cascadeId:s,nodeName:n,requestedId:a});let c=N(),l=await this.sql.begin(async f=>{let E=await f`
2
2
  WITH conflict_check AS (
3
3
  -- Single aggregation combining conflict detection and MAX calculation
4
4
  -- More efficient than separate EXISTS and MAX queries
@@ -9,11 +9,11 @@ import{randomUUID as m}from"crypto";var u=class{constructor(o){this.sql=o}async
9
9
  ELSE ${a}
10
10
  END as next_fn_id
11
11
  FROM node_executions
12
- WHERE cascade_id = ${e}
12
+ WHERE cascade_id = ${s}
13
13
  ),
14
14
  cascade_upsert AS (
15
15
  INSERT INTO cascades (id, user_id, status, fn_id, created_at, updated_at)
16
- SELECT ${e}, ${t}, 'RUNNING', next_fn_id, NOW(), NOW()
16
+ SELECT ${s}, ${o}, 'RUNNING', next_fn_id, NOW(), NOW()
17
17
  FROM conflict_check
18
18
  ON CONFLICT (id) DO UPDATE
19
19
  SET fn_id = EXCLUDED.fn_id, updated_at = NOW()
@@ -31,106 +31,96 @@ import{randomUUID as m}from"crypto";var u=class{constructor(o){this.sql=o}async
31
31
  started_at
32
32
  )
33
33
  SELECT
34
- ${r},
35
- ${n},
36
- ${e},
34
+ ${c},
35
+ ${i},
37
36
  ${s},
37
+ ${n},
38
38
  fn_id,
39
- ${this.sql.json(d)},
40
- ${i},
39
+ ${this.sql.json(e)},
40
+ ${t},
41
41
  'RUNNING',
42
42
  NOW()
43
43
  FROM cascade_upsert
44
44
  RETURNING status, function_id as "functionId"
45
- `;return{status:_[0].status,functionId:Number(_[0].functionId)}}),E=performance.now()-c;return console.log(`claimNodeExecution latency: ${E.toFixed(2)}ms`,{cascadeId:e,nodeName:s}),l}async finalizeNodeExecution(o){let c=performance.now(),{nodeInstanceId:n,cascadeId:e,fullOutput:t,hasSpawns:s}=o,a=await this.sql.begin(async i=>(await i`
45
+ `;return{status:E[0].status,functionId:Number(E[0].functionId)}}),I=performance.now()-r;return l}async finalizeNodeExecution(d){let r=performance.now(),{nodeInstanceId:i,cascadeId:s,fullOutput:o,hasSpawns:n}=d;return await this.sql.begin(async e=>(await e`
46
46
  WITH updated_node AS (
47
47
  UPDATE node_executions
48
48
  SET
49
49
  status = 'COMPLETED',
50
- full_output = ${this.sql.json(t)},
50
+ full_output = ${this.sql.json(o)},
51
51
  completed_at = NOW()
52
- WHERE node_instance_id = ${n}
52
+ WHERE node_instance_id = ${i}
53
53
  RETURNING cascade_id
54
54
  )
55
55
  UPDATE cascades
56
56
  SET status = 'COMPLETED', updated_at = NOW()
57
57
  WHERE id IN (SELECT cascade_id FROM updated_node)
58
- AND ${!s}
59
- `,{status:"COMPLETED"})),d=performance.now()-c;return console.log(`finalizeNodeExecution latency: ${d.toFixed(2)}ms`,{cascadeId:e,nodeInstanceId:n}),a}async markExecutionFailed(o,c,n){let e=performance.now(),t=await this.sql.begin(async a=>(await a`
58
+ AND ${!n}
59
+ `,{status:"COMPLETED"}))}async markExecutionFailed(d,r,i){let s=performance.now();return await this.sql.begin(async n=>(await n`
60
60
  WITH updated_node AS (
61
61
  UPDATE node_executions
62
- SET status = 'FAILED', error = ${n}, completed_at = NOW()
63
- WHERE node_instance_id = ${o}
62
+ SET status = 'FAILED', error = ${i}, completed_at = NOW()
63
+ WHERE node_instance_id = ${d}
64
64
  RETURNING cascade_id
65
65
  )
66
66
  UPDATE cascades
67
67
  SET status = 'ERROR', updated_at = NOW()
68
68
  WHERE id IN (SELECT cascade_id FROM updated_node)
69
- `,{status:"FAILED"})),s=performance.now()-e;return console.log(`markExecutionFailed latency: ${s.toFixed(2)}ms`,{cascadeId:c,nodeInstanceId:o}),t}async recordContextEvents(o){let c=performance.now(),{cascadeId:n,functionId:e,updates:t}=o,s=Object.entries(t).map(([d,i])=>({key:d,value:this.sql.json(i),function_id:e,cascade_id:n,created_at:new Date}));if(s.length===0){let d=performance.now()-c;return console.log(`recordContextEvents latency: ${d.toFixed(2)}ms (no events)`,{cascadeId:n,functionId:e}),{status:"SUCCESS"}}await this.sql`
70
- INSERT INTO context_events ${this.sql(s,"key","value","function_id","cascade_id","created_at")}
71
- `;let a=performance.now()-c;return console.log(`recordContextEvents latency: ${a.toFixed(2)}ms (${s.length} events)`,{cascadeId:n,functionId:e}),{status:"SUCCESS"}}async hydrateCascadeContext(o,c){let n=performance.now(),e=await this.sql`
72
- SELECT key, value, function_id, created_at
73
- FROM context_events
74
- WHERE cascade_id = ${o}
75
- AND function_id < ${c}
76
- ORDER BY function_id ASC, created_at ASC
77
- `,t={};for(let a of e){let d=a.key,i=a.value;if(t[d]||(t[d]=[]),typeof i=="object"&&i!==null&&!Array.isArray(i)&&"index"in i){let r=i.index;t[d][r]=i}else t[d].push(i)}let s=performance.now()-n;return console.log(`hydrateCascadeContext latency: ${s.toFixed(2)}ms (${e.length} events)`,{cascadeId:o,upToFunctionId:c}),t}async forkCascade(o){let c=performance.now(),{sourceCascadeId:n,newCascadeId:e,upToFunctionId:t}=o;await this.sql.begin(async a=>{await a`
69
+ `,{status:"FAILED"}))}async recordContextEvents(d){let r=performance.now(),{cascadeId:i,functionId:s,updates:o,uiUpdates:n}=d,a=Object.entries(o).map(([e,t])=>{let c=n?.[e];return{key:e,value:this.sql.json(t),ui_value:c!==void 0?this.sql.json(c):null,function_id:s,cascade_id:i,created_at:new Date}});return a.length===0?{status:"SUCCESS"}:(await this.sql`
70
+ INSERT INTO context_events ${this.sql(a,"key","value","ui_value","function_id","cascade_id","created_at")}
71
+ `,{status:"SUCCESS"})}async hydrateCascadeContext(d,r,i){let s=performance.now(),o;i?o=await this.sql`
72
+ SELECT
73
+ key,
74
+ COALESCE(ui_value, value) AS value,
75
+ function_id,
76
+ created_at
77
+ FROM context_events
78
+ WHERE cascade_id = ${d}
79
+ AND function_id < ${r}
80
+ ORDER BY function_id ASC, created_at ASC
81
+ `:o=await this.sql`
82
+ SELECT
83
+ key,
84
+ value,
85
+ function_id,
86
+ created_at
87
+ FROM context_events
88
+ WHERE cascade_id = ${d}
89
+ AND function_id < ${r}
90
+ ORDER BY function_id ASC, created_at ASC
91
+ `;let n={};for(let a of o){let e=a.key,t=a.value;if(n[e]||(n[e]=[]),typeof t=="object"&&t!==null&&!Array.isArray(t)&&"index"in t){let c=t.index;n[e][c]=t}else n[e].push(t)}return n}async forkCascadeWithContext(d){let r=performance.now(),{sourceCascadeId:i,newCascadeId:s,upToFunctionId:o}=d,n=await this.sql.begin(async e=>(await e`
78
92
  INSERT INTO cascades (id, user_id, status, fn_id, created_at, updated_at)
79
93
  SELECT
80
- ${e},
94
+ ${s},
81
95
  user_id,
82
96
  'RUNNING',
83
- ${t-1},
97
+ ${o-1},
84
98
  NOW(),
85
99
  NOW()
86
100
  FROM cascades
87
- WHERE id = ${n}
88
- `,await a`
101
+ WHERE id = ${i}
102
+ `,await e`
89
103
  INSERT INTO node_executions (
90
- id,
91
- node_instance_id,
92
- cascade_id,
93
- node_name,
94
- function_id,
95
- input_context,
96
- location,
97
- status,
98
- started_at,
99
- completed_at,
100
- full_output,
101
- error
104
+ id, node_instance_id, cascade_id, node_name, function_id,
105
+ input_context, location, status, started_at, completed_at, full_output, error
102
106
  )
103
107
  SELECT
104
- gen_random_uuid(),
105
- node_instance_id,
106
- ${e},
107
- node_name,
108
- function_id,
109
- input_context,
110
- location,
111
- status,
112
- started_at,
113
- completed_at,
114
- full_output,
115
- error
108
+ gen_random_uuid(), gen_random_uuid(), ${s},
109
+ node_name, function_id, input_context, location, status,
110
+ started_at, completed_at, full_output, error
116
111
  FROM node_executions
117
- WHERE cascade_id = ${n}
118
- AND function_id < ${t}
119
- `,await a`
120
- INSERT INTO context_events (
121
- key,
122
- value,
123
- function_id,
124
- cascade_id,
125
- created_at
126
- )
112
+ WHERE cascade_id = ${i}
113
+ AND function_id < ${o}
114
+ `,await e`
115
+ INSERT INTO context_events (key, value, function_id, cascade_id, created_at)
127
116
  SELECT
128
- key,
117
+ CASE WHEN key = ${i} THEN ${s} ELSE key END,
129
118
  value,
130
119
  function_id,
131
- ${e},
120
+ ${s},
132
121
  created_at
133
122
  FROM context_events
134
- WHERE cascade_id = ${n}
135
- AND function_id < ${t}
136
- `});let s=performance.now()-c;return console.log(`forkCascade latency: ${s.toFixed(2)}ms`,{sourceCascadeId:n,newCascadeId:e,upToFunctionId:t}),{newCascadeId:e,status:"SUCCESS"}}};export{u as PostgresPersistor};
123
+ WHERE cascade_id = ${i}
124
+ AND function_id < ${o}
125
+ RETURNING key, value, function_id, created_at
126
+ `)),a={};for(let e of n){let{key:t,value:c}=e;a[t]||(a[t]=[]),typeof c=="object"&&c!==null&&!Array.isArray(c)&&"index"in c?a[t][c.index]=c:a[t].push(c)}return{newCascadeId:s,status:"SUCCESS",context:a}}};export{u as PostgresPersistor};
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "@cascaide-ts/postgres-js",
3
- "version": "0.1.0",
3
+ "version": "0.5.1",
4
+ "license": "MIT",
4
5
  "files": [
5
- "dist"
6
+ "dist",
7
+ "LICENSE",
8
+ "README.md"
6
9
  ],
7
10
  "type": "module",
8
11
  "main": "./dist/index.cjs",
@@ -20,12 +23,12 @@
20
23
  },
21
24
  "peerDependencies": {
22
25
  "postgres": "^3.4.0",
23
- "@cascaide-ts/core": "0.1.0"
26
+ "@cascaide-ts/core": "0.5.1"
24
27
  },
25
28
  "devDependencies": {
26
29
  "postgres": "^3.4.0",
27
30
  "tsup": "^8.0.0",
28
- "@cascaide-ts/core": "0.1.0"
31
+ "@cascaide-ts/core": "0.5.1"
29
32
  },
30
33
  "scripts": {
31
34
  "build": "tsup",