@q1k-oss/btree-workflows 0.0.1 → 0.0.2

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.
Files changed (206) hide show
  1. package/README.md +13 -13
  2. package/dist/index.cjs +5011 -0
  3. package/dist/index.d.cts +3320 -0
  4. package/dist/index.d.ts +3320 -0
  5. package/dist/index.js +4879 -0
  6. package/package.json +33 -3
  7. package/.claude/settings.local.json +0 -31
  8. package/CLAUDE.md +0 -181
  9. package/behaviour-tree-workflows-landing/index.html +0 -16
  10. package/behaviour-tree-workflows-landing/package-lock.json +0 -2074
  11. package/behaviour-tree-workflows-landing/package.json +0 -31
  12. package/behaviour-tree-workflows-landing/public/favicon.svg +0 -17
  13. package/behaviour-tree-workflows-landing/src/App.css +0 -103
  14. package/behaviour-tree-workflows-landing/src/App.tsx +0 -176
  15. package/behaviour-tree-workflows-landing/src/components/BlackboardInspector.css +0 -89
  16. package/behaviour-tree-workflows-landing/src/components/BlackboardInspector.tsx +0 -64
  17. package/behaviour-tree-workflows-landing/src/components/ExampleSelector.css +0 -64
  18. package/behaviour-tree-workflows-landing/src/components/ExampleSelector.tsx +0 -34
  19. package/behaviour-tree-workflows-landing/src/components/ExecutionLog.css +0 -107
  20. package/behaviour-tree-workflows-landing/src/components/ExecutionLog.tsx +0 -85
  21. package/behaviour-tree-workflows-landing/src/components/Header.css +0 -50
  22. package/behaviour-tree-workflows-landing/src/components/Header.tsx +0 -26
  23. package/behaviour-tree-workflows-landing/src/components/StatusBadge.css +0 -45
  24. package/behaviour-tree-workflows-landing/src/components/StatusBadge.tsx +0 -15
  25. package/behaviour-tree-workflows-landing/src/components/Toolbar.css +0 -74
  26. package/behaviour-tree-workflows-landing/src/components/Toolbar.tsx +0 -53
  27. package/behaviour-tree-workflows-landing/src/components/TreeVisualizer.css +0 -67
  28. package/behaviour-tree-workflows-landing/src/components/TreeVisualizer.tsx +0 -192
  29. package/behaviour-tree-workflows-landing/src/components/YamlEditor.css +0 -18
  30. package/behaviour-tree-workflows-landing/src/components/YamlEditor.tsx +0 -96
  31. package/behaviour-tree-workflows-landing/src/lib/count-nodes.ts +0 -11
  32. package/behaviour-tree-workflows-landing/src/lib/execution-engine.ts +0 -96
  33. package/behaviour-tree-workflows-landing/src/lib/tree-layout.ts +0 -136
  34. package/behaviour-tree-workflows-landing/src/lib/yaml-examples.ts +0 -549
  35. package/behaviour-tree-workflows-landing/src/main.tsx +0 -9
  36. package/behaviour-tree-workflows-landing/src/stubs/activepieces.ts +0 -18
  37. package/behaviour-tree-workflows-landing/src/stubs/fs.ts +0 -24
  38. package/behaviour-tree-workflows-landing/src/stubs/path.ts +0 -16
  39. package/behaviour-tree-workflows-landing/src/stubs/temporal-activity.ts +0 -6
  40. package/behaviour-tree-workflows-landing/src/stubs/temporal-workflow.ts +0 -22
  41. package/behaviour-tree-workflows-landing/tsconfig.json +0 -25
  42. package/behaviour-tree-workflows-landing/vite.config.ts +0 -40
  43. package/demo-google-sheets.ts +0 -181
  44. package/demo-runtime-variables.ts +0 -174
  45. package/demo-template.ts +0 -208
  46. package/docs/ARCHITECTURE_SUMMARY.md +0 -613
  47. package/docs/NODE_REFERENCE.md +0 -504
  48. package/docs/README.md +0 -53
  49. package/docs/custom-nodes-architecture.md +0 -826
  50. package/docs/observability.md +0 -175
  51. package/docs/yaml-specification.md +0 -990
  52. package/examples/temporal/README.md +0 -117
  53. package/examples/temporal/activities.ts +0 -373
  54. package/examples/temporal/client.ts +0 -115
  55. package/examples/temporal/python-worker/activities.py +0 -339
  56. package/examples/temporal/python-worker/requirements.txt +0 -12
  57. package/examples/temporal/python-worker/worker.py +0 -106
  58. package/examples/temporal/worker.ts +0 -66
  59. package/examples/temporal/workflows.ts +0 -6
  60. package/examples/temporal/yaml-workflow-loader.ts +0 -105
  61. package/examples/yaml-test.ts +0 -97
  62. package/examples/yaml-workflows/01-simple-sequence.yaml +0 -25
  63. package/examples/yaml-workflows/02-parallel-timeout.yaml +0 -45
  64. package/examples/yaml-workflows/03-ecommerce-checkout.yaml +0 -94
  65. package/examples/yaml-workflows/04-ai-agent-workflow.yaml +0 -346
  66. package/examples/yaml-workflows/05-order-processing.yaml +0 -146
  67. package/examples/yaml-workflows/06-activity-test.yaml +0 -71
  68. package/examples/yaml-workflows/07-activity-simple-test.yaml +0 -43
  69. package/examples/yaml-workflows/08-file-processing.yaml +0 -141
  70. package/examples/yaml-workflows/09-http-request.yaml +0 -137
  71. package/examples/yaml-workflows/README.md +0 -211
  72. package/src/actions/code-execution.schema.ts +0 -27
  73. package/src/actions/code-execution.ts +0 -218
  74. package/src/actions/generate-file.test.ts +0 -516
  75. package/src/actions/generate-file.ts +0 -166
  76. package/src/actions/http-request.test.ts +0 -784
  77. package/src/actions/http-request.ts +0 -228
  78. package/src/actions/index.ts +0 -20
  79. package/src/actions/parse-file.test.ts +0 -448
  80. package/src/actions/parse-file.ts +0 -139
  81. package/src/actions/python-script.test.ts +0 -439
  82. package/src/actions/python-script.ts +0 -154
  83. package/src/base-node.test.ts +0 -511
  84. package/src/base-node.ts +0 -605
  85. package/src/behavior-tree.test.ts +0 -431
  86. package/src/behavior-tree.ts +0 -283
  87. package/src/blackboard.test.ts +0 -222
  88. package/src/blackboard.ts +0 -192
  89. package/src/composites/conditional.schema.ts +0 -19
  90. package/src/composites/conditional.test.ts +0 -309
  91. package/src/composites/conditional.ts +0 -129
  92. package/src/composites/for-each.schema.ts +0 -23
  93. package/src/composites/for-each.test.ts +0 -254
  94. package/src/composites/for-each.ts +0 -132
  95. package/src/composites/index.ts +0 -15
  96. package/src/composites/memory-sequence.schema.ts +0 -19
  97. package/src/composites/memory-sequence.test.ts +0 -223
  98. package/src/composites/memory-sequence.ts +0 -98
  99. package/src/composites/parallel.schema.ts +0 -28
  100. package/src/composites/parallel.test.ts +0 -502
  101. package/src/composites/parallel.ts +0 -157
  102. package/src/composites/reactive-sequence.schema.ts +0 -19
  103. package/src/composites/reactive-sequence.test.ts +0 -170
  104. package/src/composites/reactive-sequence.ts +0 -85
  105. package/src/composites/recovery.schema.ts +0 -19
  106. package/src/composites/recovery.test.ts +0 -366
  107. package/src/composites/recovery.ts +0 -90
  108. package/src/composites/selector.schema.ts +0 -19
  109. package/src/composites/selector.test.ts +0 -387
  110. package/src/composites/selector.ts +0 -85
  111. package/src/composites/sequence.schema.ts +0 -19
  112. package/src/composites/sequence.test.ts +0 -337
  113. package/src/composites/sequence.ts +0 -72
  114. package/src/composites/sub-tree.schema.ts +0 -21
  115. package/src/composites/sub-tree.test.ts +0 -893
  116. package/src/composites/sub-tree.ts +0 -177
  117. package/src/composites/while.schema.ts +0 -24
  118. package/src/composites/while.test.ts +0 -381
  119. package/src/composites/while.ts +0 -149
  120. package/src/data-store/index.ts +0 -10
  121. package/src/data-store/memory-store.ts +0 -161
  122. package/src/data-store/types.ts +0 -94
  123. package/src/debug/breakpoint.test.ts +0 -47
  124. package/src/debug/breakpoint.ts +0 -30
  125. package/src/debug/index.ts +0 -17
  126. package/src/debug/resume-point.test.ts +0 -49
  127. package/src/debug/resume-point.ts +0 -29
  128. package/src/decorators/delay.schema.ts +0 -21
  129. package/src/decorators/delay.test.ts +0 -261
  130. package/src/decorators/delay.ts +0 -140
  131. package/src/decorators/force-result.schema.ts +0 -32
  132. package/src/decorators/force-result.test.ts +0 -133
  133. package/src/decorators/force-result.ts +0 -63
  134. package/src/decorators/index.ts +0 -13
  135. package/src/decorators/invert.schema.ts +0 -19
  136. package/src/decorators/invert.test.ts +0 -135
  137. package/src/decorators/invert.ts +0 -42
  138. package/src/decorators/keep-running.schema.ts +0 -20
  139. package/src/decorators/keep-running.test.ts +0 -105
  140. package/src/decorators/keep-running.ts +0 -49
  141. package/src/decorators/precondition.schema.ts +0 -19
  142. package/src/decorators/precondition.test.ts +0 -351
  143. package/src/decorators/precondition.ts +0 -139
  144. package/src/decorators/repeat.schema.ts +0 -21
  145. package/src/decorators/repeat.test.ts +0 -187
  146. package/src/decorators/repeat.ts +0 -94
  147. package/src/decorators/run-once.schema.ts +0 -19
  148. package/src/decorators/run-once.test.ts +0 -140
  149. package/src/decorators/run-once.ts +0 -61
  150. package/src/decorators/soft-assert.schema.ts +0 -19
  151. package/src/decorators/soft-assert.test.ts +0 -107
  152. package/src/decorators/soft-assert.ts +0 -68
  153. package/src/decorators/timeout.schema.ts +0 -21
  154. package/src/decorators/timeout.test.ts +0 -274
  155. package/src/decorators/timeout.ts +0 -159
  156. package/src/errors.test.ts +0 -63
  157. package/src/errors.ts +0 -34
  158. package/src/events.test.ts +0 -347
  159. package/src/events.ts +0 -183
  160. package/src/index.ts +0 -80
  161. package/src/integrations/index.ts +0 -30
  162. package/src/integrations/integration-action.test.ts +0 -571
  163. package/src/integrations/integration-action.ts +0 -233
  164. package/src/integrations/piece-executor.ts +0 -320
  165. package/src/observability/execution-tracker.ts +0 -320
  166. package/src/observability/index.ts +0 -23
  167. package/src/observability/sinks.ts +0 -138
  168. package/src/observability/types.ts +0 -130
  169. package/src/registry-utils.ts +0 -147
  170. package/src/registry.test.ts +0 -466
  171. package/src/registry.ts +0 -334
  172. package/src/schemas/base.schema.ts +0 -104
  173. package/src/schemas/index.ts +0 -223
  174. package/src/schemas/integration.test.ts +0 -238
  175. package/src/schemas/tree-definition.schema.ts +0 -170
  176. package/src/schemas/validation.test.ts +0 -146
  177. package/src/schemas/validation.ts +0 -122
  178. package/src/scripting/index.ts +0 -22
  179. package/src/templates/template-loader.test.ts +0 -281
  180. package/src/templates/template-loader.ts +0 -152
  181. package/src/temporal-integration.test.ts +0 -213
  182. package/src/test-nodes.ts +0 -259
  183. package/src/types.ts +0 -503
  184. package/src/utilities/index.ts +0 -17
  185. package/src/utilities/log-message.test.ts +0 -275
  186. package/src/utilities/log-message.ts +0 -134
  187. package/src/utilities/regex-extract.test.ts +0 -138
  188. package/src/utilities/regex-extract.ts +0 -108
  189. package/src/utilities/variable-resolver.test.ts +0 -416
  190. package/src/utilities/variable-resolver.ts +0 -318
  191. package/src/utils/error-handler.test.ts +0 -117
  192. package/src/utils/error-handler.ts +0 -48
  193. package/src/utils/signal-check.test.ts +0 -234
  194. package/src/utils/signal-check.ts +0 -140
  195. package/src/yaml/errors.ts +0 -143
  196. package/src/yaml/index.ts +0 -30
  197. package/src/yaml/loader.ts +0 -39
  198. package/src/yaml/parser.ts +0 -286
  199. package/src/yaml/validation/semantic-validator.ts +0 -196
  200. package/templates/google-sheets/insert-row.yaml +0 -76
  201. package/templates/notification-sender.yaml +0 -33
  202. package/templates/order-validation.yaml +0 -44
  203. package/tsconfig.json +0 -24
  204. package/vitest.config.ts +0 -25
  205. package/workflows/order-processor.yaml +0 -59
  206. package/workflows/process-order-workflow.yaml +0 -142
@@ -1,40 +0,0 @@
1
- import { defineConfig } from 'vite';
2
- import react from '@vitejs/plugin-react';
3
- import path from 'path';
4
-
5
- export default defineConfig({
6
- plugins: [react()],
7
- resolve: {
8
- alias: {
9
- // Map library source imports
10
- '@btree': path.resolve(__dirname, '../src'),
11
- // Stub out Node.js / Temporal modules that can't run in the browser
12
- '@temporalio/workflow': path.resolve(__dirname, 'src/stubs/temporal-workflow.ts'),
13
- '@temporalio/activity': path.resolve(__dirname, 'src/stubs/temporal-activity.ts'),
14
- 'fs/promises': path.resolve(__dirname, 'src/stubs/fs.ts'),
15
- 'fs': path.resolve(__dirname, 'src/stubs/fs.ts'),
16
- 'path': path.resolve(__dirname, 'src/stubs/path.ts'),
17
- '@activepieces/piece-google-sheets': path.resolve(__dirname, 'src/stubs/activepieces.ts'),
18
- '@activepieces/pieces-framework': path.resolve(__dirname, 'src/stubs/activepieces.ts'),
19
- },
20
- // Ensure dependencies imported by the library source are resolved
21
- // from the playground's node_modules (parent has no node_modules)
22
- dedupe: ['js-yaml', 'zod'],
23
- },
24
- // Allow Vite to serve files from the parent src/ directory
25
- server: {
26
- fs: {
27
- allow: ['.', '../src'],
28
- },
29
- },
30
- // Force Rollup to resolve bare imports from the playground's node_modules
31
- // even when processing files from the parent directory
32
- optimizeDeps: {
33
- include: ['js-yaml', 'zod'],
34
- },
35
- define: {
36
- 'process.env': '{}',
37
- 'process.versions': '{}',
38
- 'process.platform': '"browser"',
39
- },
40
- });
@@ -1,181 +0,0 @@
1
- /**
2
- * Demo: Google Sheets Integration with btree
3
- *
4
- * This demo shows how to use the IntegrationAction node to interact
5
- * with Google Sheets via Active Pieces.
6
- *
7
- * Prerequisites:
8
- * 1. OAuth connection established via controlplane
9
- * 2. Controlplane running at localhost:5001
10
- */
11
-
12
- import {
13
- Registry,
14
- registerStandardNodes,
15
- loadTreeFromYaml,
16
- ScopedBlackboard,
17
- NodeStatus,
18
- } from "./src/index.js";
19
- import type { IntegrationContext, TokenProvider } from "./src/integrations/integration-action.js";
20
-
21
- // Token provider that fetches from controlplane
22
- const controlplaneTokenProvider: TokenProvider = async (context, provider, connectionId) => {
23
- const integrationContext = context as IntegrationContext;
24
-
25
- const response = await fetch("http://localhost:5001/internal/integrations/token", {
26
- method: "POST",
27
- headers: {
28
- "Content-Type": "application/json",
29
- "x-internal-api-key": process.env.INTERNAL_API_KEY || "dev-internal-key-12345",
30
- },
31
- body: JSON.stringify({
32
- tenantId: integrationContext.tenantId,
33
- userId: integrationContext.userId,
34
- providerName: provider,
35
- }),
36
- });
37
-
38
- if (!response.ok) {
39
- const error = await response.text();
40
- throw new Error(`Failed to get token: ${error}`);
41
- }
42
-
43
- const data = await response.json() as { accessToken: string };
44
- return { access_token: data.accessToken };
45
- };
46
-
47
- async function main() {
48
- console.log("🚀 Google Sheets Integration Demo\n");
49
-
50
- // Create registry with standard nodes
51
- const registry = new Registry();
52
- registerStandardNodes(registry);
53
-
54
- // First, let's create a test spreadsheet
55
- console.log("Step 1: Creating a test spreadsheet...\n");
56
-
57
- const createSheetYaml = `
58
- type: IntegrationAction
59
- id: create-sheet
60
- props:
61
- provider: google
62
- action: create-spreadsheet
63
- inputs:
64
- title: "BTree Demo Sheet - \${bb.timestamp}"
65
- sheetName: "Orders"
66
- `;
67
-
68
- const createNode = loadTreeFromYaml(createSheetYaml, registry);
69
- const blackboard = new ScopedBlackboard();
70
- blackboard.set("timestamp", new Date().toISOString().slice(0, 19));
71
-
72
- const context: IntegrationContext = {
73
- blackboard,
74
- treeRegistry: registry,
75
- timestamp: Date.now(),
76
- deltaTime: 0,
77
- tokenProvider: controlplaneTokenProvider,
78
- tenantId: process.env.DEV_TENANT_ID || "00000000-0000-0000-0000-000000000000",
79
- userId: process.env.DEV_USER_ID || "00000000-0000-0000-0000-000000000001",
80
- };
81
-
82
- const createStatus = await createNode.tick(context);
83
-
84
- if (createStatus !== NodeStatus.SUCCESS) {
85
- console.log("❌ Failed to create spreadsheet");
86
- console.log("Error:", createNode.lastError);
87
- return;
88
- }
89
-
90
- const createResult = blackboard.get("create-sheet.result") as { id?: string; spreadsheetId?: string } | undefined;
91
- console.log("✅ Spreadsheet created!");
92
- console.log(" Result:", JSON.stringify(createResult, null, 2));
93
-
94
- const spreadsheetId = createResult?.id || createResult?.spreadsheetId;
95
- if (!spreadsheetId) {
96
- console.log("❌ No spreadsheet ID returned");
97
- return;
98
- }
99
-
100
- // Store spreadsheet ID for next steps
101
- blackboard.set("spreadsheetId", spreadsheetId);
102
- console.log(`\n📊 Spreadsheet URL: https://docs.google.com/spreadsheets/d/${spreadsheetId}`);
103
-
104
- // Test insert_row with correct Active Pieces format
105
- console.log("\nStep 2: Inserting rows (array mode)...\n");
106
-
107
- // Active Pieces expects { values: { values: [...] } } for first_row_headers=false
108
- const insertRowYaml = `
109
- type: Sequence
110
- id: insert-data
111
- children:
112
- - type: IntegrationAction
113
- id: insert-header
114
- props:
115
- provider: google
116
- action: insert_row
117
- inputs:
118
- spreadsheetId: "\${bb.spreadsheetId}"
119
- sheetId: 0
120
- first_row_headers: false
121
- as_string: true
122
- values:
123
- values:
124
- - "Order ID"
125
- - "Customer"
126
- - "Amount"
127
- - "Status"
128
- - type: IntegrationAction
129
- id: insert-row-1
130
- props:
131
- provider: google
132
- action: insert_row
133
- inputs:
134
- spreadsheetId: "\${bb.spreadsheetId}"
135
- sheetId: 0
136
- first_row_headers: false
137
- as_string: true
138
- values:
139
- values:
140
- - "ORD-001"
141
- - "John Doe"
142
- - "99.99"
143
- - "Completed"
144
- - type: IntegrationAction
145
- id: insert-row-2
146
- props:
147
- provider: google
148
- action: insert_row
149
- inputs:
150
- spreadsheetId: "\${bb.spreadsheetId}"
151
- sheetId: 0
152
- first_row_headers: false
153
- as_string: true
154
- values:
155
- values:
156
- - "ORD-002"
157
- - "Jane Smith"
158
- - "149.50"
159
- - "Pending"
160
- `;
161
-
162
- const insertNode = loadTreeFromYaml(insertRowYaml, registry);
163
- const insertStatus = await insertNode.tick(context);
164
-
165
- if (insertStatus === NodeStatus.SUCCESS) {
166
- console.log("✅ Rows inserted successfully!");
167
- } else {
168
- console.log("⚠️ Row insertion failed (see gap analysis doc)");
169
- console.log(" Error:", insertNode.lastError);
170
- }
171
-
172
- console.log("\n✅ Demo complete!");
173
- console.log("\n📋 Summary:");
174
- console.log(" - OAuth connection: Working");
175
- console.log(" - Token retrieval: Working");
176
- console.log(" - Google Sheets API: Working");
177
- console.log(` - Created spreadsheet: ${spreadsheetId}`);
178
- console.log(`\n📊 View: https://docs.google.com/spreadsheets/d/${spreadsheetId}`);
179
- }
180
-
181
- main().catch(console.error);
@@ -1,174 +0,0 @@
1
- /**
2
- * Demo: Runtime Variables & Input Parameters
3
- *
4
- * This demo showcases the unified variable resolution system:
5
- *
6
- * Variable Syntax:
7
- * - ${input.key} - Workflow input parameters (immutable)
8
- * - ${bb.key} - Blackboard values (mutable runtime state)
9
- * - ${env.KEY} - Environment variables
10
- * - ${param.key} - Test data parameters
11
- * - ${key} - Shorthand for ${bb.key} (backward compatible)
12
- *
13
- * Script Node Proxies:
14
- * - $input.key - Read-only workflow input
15
- * - $env.KEY - Read-only allowed environment variables
16
- * - $bb.key - Read/write blackboard
17
- *
18
- * SubTree Parameters:
19
- * - params: {} - Values passed to subtree (supports variable resolution)
20
- * - outputs: [] - Keys exported back to parent after execution
21
- *
22
- * Run with:
23
- * TAX_RATE=0.10 BASE_DISCOUNT=0.05 npx tsx demo-runtime-variables.ts
24
- */
25
-
26
- import * as fs from "fs";
27
- import * as path from "path";
28
- import {
29
- Registry,
30
- registerStandardNodes,
31
- loadTreeFromYaml,
32
- BehaviorTree,
33
- NodeStatus,
34
- } from "./src/index.js";
35
-
36
- async function main() {
37
- console.log("=".repeat(60));
38
- console.log(" Runtime Variables & Input Parameters Demo");
39
- console.log("=".repeat(60));
40
- console.log();
41
-
42
- // Show environment configuration
43
- console.log("Environment Configuration:");
44
- console.log(` TAX_RATE: ${process.env.TAX_RATE || "0.08 (default)"}`);
45
- console.log(` BASE_DISCOUNT: ${process.env.BASE_DISCOUNT || "0 (default)"}`);
46
- console.log();
47
-
48
- // 1. Setup registry
49
- const registry = new Registry();
50
- registerStandardNodes(registry);
51
-
52
- // 2. Load YAML workflow files from workflows/ directory
53
- const workflowsDir = path.join(import.meta.dirname, "workflows");
54
- console.log(`Loading workflows from: ${workflowsDir}`);
55
- console.log();
56
-
57
- // Load order-processor subtree
58
- const orderProcessorYaml = fs.readFileSync(
59
- path.join(workflowsDir, "order-processor.yaml"),
60
- "utf-8"
61
- );
62
- const orderProcessorTree = loadTreeFromYaml(orderProcessorYaml, registry);
63
- const orderProcessorBT = new BehaviorTree(orderProcessorTree);
64
- registry.registerTree("order-processor", orderProcessorBT, "order-processor.yaml");
65
- console.log(" Loaded: order-processor.yaml (SubTree)");
66
-
67
- // Load main workflow
68
- const mainWorkflowYaml = fs.readFileSync(
69
- path.join(workflowsDir, "process-order-workflow.yaml"),
70
- "utf-8"
71
- );
72
- const mainWorkflowTree = loadTreeFromYaml(mainWorkflowYaml, registry);
73
- const mainWorkflowBT = new BehaviorTree(mainWorkflowTree);
74
- console.log(" Loaded: process-order-workflow.yaml (Main)");
75
- console.log();
76
-
77
- // 3. Convert to workflow function (Temporal-compatible)
78
- const workflow = mainWorkflowBT.toWorkflow();
79
-
80
- // 4. Define workflow input (passed at runtime)
81
- const workflowInput = {
82
- orderId: "ORD-2024-0042",
83
- customerId: "CUST-001", // John Doe - gold tier
84
- items: [
85
- { name: "Widget Pro", price: 49.99, quantity: 2 },
86
- { name: "Gadget Plus", price: 29.99, quantity: 1 },
87
- { name: "Super Cable", price: 9.99, quantity: 3 },
88
- ],
89
- };
90
-
91
- console.log("Workflow Input:");
92
- console.log(` orderId: ${workflowInput.orderId}`);
93
- console.log(` customerId: ${workflowInput.customerId}`);
94
- console.log(` items: ${workflowInput.items.length} items`);
95
- for (const item of workflowInput.items) {
96
- console.log(` - ${item.name}: $${item.price} x ${item.quantity}`);
97
- }
98
- console.log();
99
-
100
- // 5. Execute workflow
101
- console.log("-".repeat(60));
102
- console.log("Workflow Execution:");
103
- console.log("-".repeat(60));
104
- console.log();
105
-
106
- const result = await workflow({
107
- input: workflowInput,
108
- treeRegistry: registry,
109
- sessionId: "demo-session-001",
110
- });
111
-
112
- console.log();
113
- console.log("-".repeat(60));
114
- console.log("Workflow Result:");
115
- console.log("-".repeat(60));
116
- console.log();
117
-
118
- console.log(`Status: ${result.status}`);
119
- console.log();
120
-
121
- if (result.status === NodeStatus.SUCCESS) {
122
- const output = result.output;
123
-
124
- console.log("Customer:");
125
- const customer = output.customer as Record<string, unknown>;
126
- console.log(` Name: ${customer?.name}`);
127
- console.log(` Email: ${customer?.email}`);
128
- console.log(` Tier: ${customer?.tier}`);
129
- console.log();
130
-
131
- console.log("Order Result (from SubTree):");
132
- const orderResult = output.orderResult as Record<string, unknown>;
133
- console.log(` Order ID: ${orderResult?.orderId}`);
134
- console.log(` Items: ${orderResult?.itemCount}`);
135
- console.log(` Subtotal: $${orderResult?.subtotal}`);
136
- console.log(` Tax Rate: ${((orderResult?.taxRate as number) * 100).toFixed(0)}%`);
137
- console.log(` Tax: $${orderResult?.tax}`);
138
- console.log(` Total: $${orderResult?.total}`);
139
- console.log();
140
-
141
- console.log("Final Order (with discount):");
142
- const finalOrder = output.finalOrder as Record<string, unknown>;
143
- console.log(` Discount: ${finalOrder?.discountPercent}% (${customer?.tier} tier + base)`);
144
- console.log(` Savings: $${finalOrder?.discountAmount}`);
145
- console.log(` Final: $${finalOrder?.finalTotal}`);
146
- console.log();
147
-
148
- console.log("Notification:");
149
- const notification = output.notification as Record<string, unknown>;
150
- console.log(` To: ${notification?.to}`);
151
- console.log(` Subject: ${notification?.subject}`);
152
- console.log(` Sent: ${notification?.sentAt}`);
153
- }
154
-
155
- console.log();
156
- console.log("=".repeat(60));
157
- console.log(" Demo Complete!");
158
- console.log("=".repeat(60));
159
- console.log();
160
- console.log("Key Features Demonstrated:");
161
- console.log(" 1. YAML workflows loaded from files (production-like)");
162
- console.log(" 2. ${input.key} - Immutable workflow input parameters");
163
- console.log(" 3. ${bb.key} - Mutable blackboard state");
164
- console.log(" 4. ${env.KEY} - Environment variable access");
165
- console.log(" 5. SubTree params - Pass values to subtrees with resolution");
166
- console.log(" 6. SubTree outputs - Export values back to parent");
167
- console.log(" 7. Script $input/$env/$bb - Full access in JavaScript");
168
- console.log(" 8. allowedEnvVars - Security-conscious env access");
169
- console.log();
170
- console.log("Try with different env vars:");
171
- console.log(" TAX_RATE=0.15 BASE_DISCOUNT=0.10 npx tsx demo-runtime-variables.ts");
172
- }
173
-
174
- main().catch(console.error);
package/demo-template.ts DELETED
@@ -1,208 +0,0 @@
1
- /**
2
- * Demo: Using GoogleSheets.InsertRow Template
3
- *
4
- * This demonstrates using templates for friendly Google Sheets integration.
5
- * The template handles data transformation automatically.
6
- */
7
-
8
- import {
9
- Registry,
10
- registerStandardNodes,
11
- loadTreeFromYaml,
12
- loadTemplatesFromDirectory,
13
- ScopedBlackboard,
14
- NodeStatus,
15
- } from "./src/index.js";
16
- import type { IntegrationContext, TokenProvider } from "./src/integrations/integration-action.js";
17
- import * as path from "path";
18
-
19
- // Token provider that fetches from controlplane
20
- const controlplaneTokenProvider: TokenProvider = async (context, provider) => {
21
- const integrationContext = context as IntegrationContext;
22
-
23
- const response = await fetch("http://localhost:5001/internal/integrations/token", {
24
- method: "POST",
25
- headers: {
26
- "Content-Type": "application/json",
27
- "x-internal-api-key": process.env.INTERNAL_API_KEY || "dev-internal-key-12345",
28
- },
29
- body: JSON.stringify({
30
- tenantId: integrationContext.tenantId,
31
- userId: integrationContext.userId,
32
- providerName: provider,
33
- }),
34
- });
35
-
36
- if (!response.ok) {
37
- const error = await response.text();
38
- throw new Error(`Failed to get token: ${error}`);
39
- }
40
-
41
- const data = await response.json() as { accessToken: string };
42
- return { access_token: data.accessToken };
43
- };
44
-
45
- async function main() {
46
- console.log("===========================================");
47
- console.log(" Google Sheets Template Demo");
48
- console.log("===========================================\n");
49
-
50
- // 1. Setup registry with standard nodes
51
- const registry = new Registry();
52
- registerStandardNodes(registry);
53
-
54
- // 2. Load templates
55
- console.log("Loading templates...\n");
56
- const templatesDir = path.join(import.meta.dirname, "templates/google-sheets");
57
- await loadTemplatesFromDirectory(registry, {
58
- templatesDir,
59
- idPrefix: "GoogleSheets."
60
- });
61
-
62
- // 3. Create context
63
- const blackboard = new ScopedBlackboard();
64
- const context: IntegrationContext = {
65
- blackboard,
66
- treeRegistry: registry,
67
- timestamp: Date.now(),
68
- deltaTime: 0,
69
- tokenProvider: controlplaneTokenProvider,
70
- tenantId: process.env.DEV_TENANT_ID || "00000000-0000-0000-0000-000000000000",
71
- userId: process.env.DEV_USER_ID || "00000000-0000-0000-0000-000000000001",
72
- };
73
-
74
- // 4. First, create a spreadsheet (direct action)
75
- console.log("Step 1: Creating spreadsheet...\n");
76
-
77
- const timestamp = new Date().toISOString().slice(0, 19);
78
- const createYaml = `
79
- type: IntegrationAction
80
- id: create-sheet
81
- props:
82
- provider: google
83
- action: create-spreadsheet
84
- inputs:
85
- title: "Template Demo - ${timestamp}"
86
- sheetName: "Orders"
87
- `;
88
-
89
- const createNode = loadTreeFromYaml(createYaml, registry);
90
- const createStatus = await createNode.tick(context);
91
-
92
- if (createStatus !== NodeStatus.SUCCESS) {
93
- console.log("Failed to create spreadsheet:", createNode.lastError);
94
- return;
95
- }
96
-
97
- const createResult = blackboard.get("create-sheet.result") as { id?: string };
98
- const spreadsheetId = createResult?.id;
99
- console.log(`Created spreadsheet: ${spreadsheetId}`);
100
- console.log(`URL: https://docs.google.com/spreadsheets/d/${spreadsheetId}\n`);
101
-
102
- // 5. Use TEMPLATE to insert rows with friendly syntax
103
- // The template reads from _tpl.* keys, transforms, and calls IntegrationAction
104
- console.log("Step 2: Inserting rows using template...\n");
105
-
106
- // Build workflow that uses SubTree to call template
107
- // Each insert: set _tpl.* inputs → call SubTree → template executes
108
- const insertYaml = `
109
- type: Sequence
110
- id: insert-orders
111
- children:
112
- # --- Insert Header Row ---
113
- - type: CodeExecution
114
- id: set-header-inputs
115
- props:
116
- language: javascript
117
- code: |
118
- setBB('tpl_spreadsheet', '${spreadsheetId}');
119
- setBB('tpl_sheet', 0);
120
- setBB('tpl_values', ['Order ID', 'Customer', 'Amount', 'Status']);
121
-
122
- - type: SubTree
123
- id: insert-header
124
- props:
125
- treeId: "GoogleSheets.insert-row"
126
-
127
- - type: LogMessage
128
- id: log-header-done
129
- props:
130
- message: "Header row inserted"
131
- level: info
132
-
133
- # --- Insert Data Row 1 ---
134
- - type: CodeExecution
135
- id: set-row1-inputs
136
- props:
137
- language: javascript
138
- code: |
139
- setBB('tpl_spreadsheet', '${spreadsheetId}');
140
- setBB('tpl_sheet', 0);
141
- setBB('tpl_values', {
142
- 'Order ID': 'ORD-001',
143
- 'Customer': 'John Doe',
144
- 'Amount': '99.99',
145
- 'Status': 'Completed'
146
- });
147
-
148
- - type: SubTree
149
- id: insert-row-1
150
- props:
151
- treeId: "GoogleSheets.insert-row"
152
-
153
- - type: LogMessage
154
- id: log-row1-done
155
- props:
156
- message: "Row 1 inserted"
157
- level: info
158
-
159
- # --- Insert Data Row 2 ---
160
- - type: CodeExecution
161
- id: set-row2-inputs
162
- props:
163
- language: javascript
164
- code: |
165
- setBB('tpl_spreadsheet', '${spreadsheetId}');
166
- setBB('tpl_sheet', 0);
167
- setBB('tpl_values', {
168
- 'Order ID': 'ORD-002',
169
- 'Customer': 'Jane Smith',
170
- 'Amount': '149.50',
171
- 'Status': 'Pending'
172
- });
173
-
174
- - type: SubTree
175
- id: insert-row-2
176
- props:
177
- treeId: "GoogleSheets.insert-row"
178
-
179
- - type: LogMessage
180
- id: log-row2-done
181
- props:
182
- message: "Row 2 inserted"
183
- level: info
184
- `;
185
-
186
- const insertNode = loadTreeFromYaml(insertYaml, registry);
187
- const insertStatus = await insertNode.tick(context);
188
-
189
- if (insertStatus === NodeStatus.SUCCESS) {
190
- console.log("\nAll rows inserted successfully!\n");
191
- } else {
192
- console.log("\nRow insertion failed:", insertNode.lastError);
193
- }
194
-
195
- // 6. Summary
196
- console.log("===========================================");
197
- console.log(" Demo Complete!");
198
- console.log("===========================================");
199
- console.log(`\nSpreadsheet: https://docs.google.com/spreadsheets/d/${spreadsheetId}`);
200
- console.log("\nWhat we demonstrated:");
201
- console.log(" - Template loaded from YAML file");
202
- console.log(" - Friendly input format (object with column names)");
203
- console.log(" - Template transformed to Active Pieces format");
204
- console.log(" - SubTree for reusable workflow execution");
205
- console.log(" - LogMessage for debugging");
206
- }
207
-
208
- main().catch(console.error);