@pikku/inspector 0.11.1 → 0.12.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.
Files changed (189) hide show
  1. package/CHANGELOG.md +26 -1
  2. package/OPTIMIZATION-PLAN.md +195 -0
  3. package/dist/add/add-ai-agent.d.ts +2 -0
  4. package/dist/add/add-ai-agent.js +314 -0
  5. package/dist/add/add-channel.js +69 -61
  6. package/dist/add/add-cli.js +36 -18
  7. package/dist/add/add-file-with-factory.js +2 -0
  8. package/dist/add/add-functions.js +327 -59
  9. package/dist/add/add-http-route.d.ts +19 -10
  10. package/dist/add/add-http-route.js +153 -44
  11. package/dist/add/add-http-routes.d.ts +5 -0
  12. package/dist/add/add-http-routes.js +159 -0
  13. package/dist/add/add-keyed-wiring.d.ts +12 -0
  14. package/dist/add/add-keyed-wiring.js +97 -0
  15. package/dist/add/add-mcp-prompt.js +14 -9
  16. package/dist/add/add-mcp-resource.js +14 -9
  17. package/dist/add/add-middleware.d.ts +1 -4
  18. package/dist/add/add-middleware.js +364 -79
  19. package/dist/add/add-permission.d.ts +1 -1
  20. package/dist/add/add-permission.js +152 -40
  21. package/dist/add/add-queue-worker.js +18 -12
  22. package/dist/add/add-rpc-invocations.d.ts +3 -0
  23. package/dist/add/add-rpc-invocations.js +65 -25
  24. package/dist/add/add-schedule.js +11 -5
  25. package/dist/add/add-secret.d.ts +3 -0
  26. package/dist/add/add-secret.js +82 -0
  27. package/dist/add/add-trigger.d.ts +2 -0
  28. package/dist/add/add-trigger.js +87 -0
  29. package/dist/add/add-variable.d.ts +1 -0
  30. package/dist/add/add-variable.js +8 -0
  31. package/dist/add/add-workflow-graph.d.ts +7 -0
  32. package/dist/add/add-workflow-graph.js +396 -0
  33. package/dist/add/add-workflow.js +124 -26
  34. package/dist/error-codes.d.ts +16 -1
  35. package/dist/error-codes.js +21 -1
  36. package/dist/index.d.ts +9 -5
  37. package/dist/index.js +5 -2
  38. package/dist/inspector.d.ts +1 -1
  39. package/dist/inspector.js +106 -13
  40. package/dist/schema-generator.d.ts +1 -0
  41. package/dist/schema-generator.js +1 -0
  42. package/dist/types-map.js +10 -1
  43. package/dist/types.d.ts +180 -30
  44. package/dist/utils/compute-required-schemas.d.ts +4 -0
  45. package/dist/utils/compute-required-schemas.js +41 -0
  46. package/dist/utils/contract-hashes.d.ts +35 -0
  47. package/dist/utils/contract-hashes.js +202 -0
  48. package/dist/utils/custom-types-generator.d.ts +9 -0
  49. package/dist/utils/custom-types-generator.js +71 -0
  50. package/dist/utils/detect-schema-vendor.d.ts +22 -0
  51. package/dist/utils/detect-schema-vendor.js +76 -0
  52. package/dist/utils/ensure-function-metadata.d.ts +5 -2
  53. package/dist/utils/ensure-function-metadata.js +220 -6
  54. package/dist/utils/extract-function-name.d.ts +5 -16
  55. package/dist/utils/extract-function-name.js +93 -298
  56. package/dist/utils/extract-services.d.ts +2 -1
  57. package/dist/utils/extract-services.js +25 -1
  58. package/dist/utils/filter-inspector-state.js +107 -23
  59. package/dist/utils/get-property-value.d.ts +8 -2
  60. package/dist/utils/get-property-value.js +33 -4
  61. package/dist/utils/hash.d.ts +2 -0
  62. package/dist/utils/hash.js +23 -0
  63. package/dist/utils/middleware.d.ts +7 -30
  64. package/dist/utils/middleware.js +80 -66
  65. package/dist/utils/permissions.d.ts +2 -2
  66. package/dist/utils/permissions.js +10 -10
  67. package/dist/utils/post-process.d.ts +9 -10
  68. package/dist/utils/post-process.js +231 -24
  69. package/dist/utils/resolve-external-package.d.ts +12 -0
  70. package/dist/utils/resolve-external-package.js +34 -0
  71. package/dist/utils/resolve-function-types.d.ts +6 -0
  72. package/dist/utils/resolve-function-types.js +29 -0
  73. package/dist/utils/resolve-identifier.d.ts +10 -0
  74. package/dist/utils/resolve-identifier.js +36 -0
  75. package/dist/utils/resolve-versions.d.ts +2 -0
  76. package/dist/utils/resolve-versions.js +78 -0
  77. package/dist/utils/schema-generator.d.ts +9 -0
  78. package/dist/utils/schema-generator.js +209 -0
  79. package/dist/utils/serialize-inspector-state.d.ts +73 -13
  80. package/dist/utils/serialize-inspector-state.js +102 -6
  81. package/dist/utils/serialize-mcp-json.d.ts +2 -0
  82. package/dist/utils/serialize-mcp-json.js +99 -0
  83. package/dist/utils/serialize-middleware-groups-meta.d.ts +12 -0
  84. package/dist/utils/serialize-middleware-groups-meta.js +28 -0
  85. package/dist/utils/serialize-openapi-json.d.ts +85 -0
  86. package/dist/utils/serialize-openapi-json.js +151 -0
  87. package/dist/utils/serialize-permissions-groups-meta.d.ts +6 -0
  88. package/dist/utils/serialize-permissions-groups-meta.js +31 -0
  89. package/dist/utils/workflow/dsl/deserialize-dsl-workflow.d.ts +24 -0
  90. package/dist/utils/workflow/dsl/deserialize-dsl-workflow.js +830 -0
  91. package/dist/{workflow/extract-simple-workflow.d.ts → utils/workflow/dsl/extract-dsl-workflow.d.ts} +4 -2
  92. package/dist/{workflow/extract-simple-workflow.js → utils/workflow/dsl/extract-dsl-workflow.js} +572 -72
  93. package/dist/utils/workflow/dsl/index.d.ts +7 -0
  94. package/dist/utils/workflow/dsl/index.js +7 -0
  95. package/dist/{workflow → utils/workflow/dsl}/patterns.d.ts +21 -0
  96. package/dist/{workflow → utils/workflow/dsl}/patterns.js +90 -10
  97. package/dist/{workflow → utils/workflow/dsl}/validation.d.ts +2 -0
  98. package/dist/{workflow → utils/workflow/dsl}/validation.js +25 -7
  99. package/dist/utils/workflow/graph/convert-dsl-to-graph.d.ts +13 -0
  100. package/dist/utils/workflow/graph/convert-dsl-to-graph.js +318 -0
  101. package/dist/utils/workflow/graph/finalize-workflow-wires.d.ts +3 -0
  102. package/dist/utils/workflow/graph/finalize-workflow-wires.js +276 -0
  103. package/dist/utils/workflow/graph/finalize-workflows.d.ts +2 -0
  104. package/dist/utils/workflow/graph/finalize-workflows.js +75 -0
  105. package/dist/utils/workflow/graph/index.d.ts +8 -0
  106. package/dist/utils/workflow/graph/index.js +8 -0
  107. package/dist/utils/workflow/graph/serialize-workflow-graph.d.ts +35 -0
  108. package/dist/utils/workflow/graph/serialize-workflow-graph.js +150 -0
  109. package/dist/utils/workflow/graph/workflow-graph.types.d.ts +203 -0
  110. package/dist/utils/workflow/graph/workflow-graph.types.js +38 -0
  111. package/dist/visit.js +13 -2
  112. package/package.json +26 -4
  113. package/src/add/add-ai-agent.ts +468 -0
  114. package/src/add/add-channel.ts +82 -79
  115. package/src/add/add-cli.ts +49 -20
  116. package/src/add/add-file-with-factory.ts +2 -0
  117. package/src/add/add-functions.ts +429 -71
  118. package/src/add/add-http-route.ts +246 -65
  119. package/src/add/add-http-routes.ts +228 -0
  120. package/src/add/add-keyed-wiring.ts +151 -0
  121. package/src/add/add-mcp-prompt.ts +26 -15
  122. package/src/add/add-mcp-resource.ts +27 -15
  123. package/src/add/add-middleware.ts +482 -80
  124. package/src/add/add-permission.ts +199 -40
  125. package/src/add/add-queue-worker.ts +24 -19
  126. package/src/add/add-rpc-invocations.ts +78 -31
  127. package/src/add/add-schedule.ts +16 -11
  128. package/src/add/add-secret.ts +140 -0
  129. package/src/add/add-trigger.ts +154 -0
  130. package/src/add/add-variable.ts +9 -0
  131. package/src/add/add-workflow-graph.ts +522 -0
  132. package/src/add/add-workflow.ts +117 -30
  133. package/src/error-codes.ts +26 -1
  134. package/src/index.ts +27 -8
  135. package/src/inspector.ts +145 -17
  136. package/src/schema-generator.ts +1 -0
  137. package/src/types-map.ts +12 -1
  138. package/src/types.ts +192 -51
  139. package/src/utils/compute-required-schemas.ts +49 -0
  140. package/src/utils/contract-hashes.test.ts +528 -0
  141. package/src/utils/contract-hashes.ts +290 -0
  142. package/src/utils/custom-types-generator.ts +88 -0
  143. package/src/utils/detect-schema-vendor.ts +90 -0
  144. package/src/utils/ensure-function-metadata.ts +324 -7
  145. package/src/utils/extract-function-name.ts +108 -358
  146. package/src/utils/extract-services.ts +35 -2
  147. package/src/utils/filter-inspector-state.test.ts +34 -20
  148. package/src/utils/filter-inspector-state.ts +140 -31
  149. package/src/utils/get-property-value.ts +50 -5
  150. package/src/utils/hash.ts +26 -0
  151. package/src/utils/middleware.test.ts +204 -0
  152. package/src/utils/middleware.ts +129 -67
  153. package/src/utils/permissions.test.ts +35 -12
  154. package/src/utils/permissions.ts +10 -10
  155. package/src/utils/post-process.ts +283 -43
  156. package/src/utils/resolve-external-package.ts +42 -0
  157. package/src/utils/resolve-function-types.ts +42 -0
  158. package/src/utils/resolve-identifier.ts +46 -0
  159. package/src/utils/resolve-versions.test.ts +249 -0
  160. package/src/utils/resolve-versions.ts +105 -0
  161. package/src/utils/schema-generator.ts +329 -0
  162. package/src/utils/serialize-inspector-state.ts +181 -20
  163. package/src/utils/serialize-mcp-json.ts +145 -0
  164. package/src/utils/serialize-middleware-groups-meta.ts +33 -0
  165. package/src/utils/serialize-openapi-json.ts +277 -0
  166. package/src/utils/serialize-permissions-groups-meta.ts +35 -0
  167. package/src/utils/test-data/inspector-state.json +69 -66
  168. package/src/utils/workflow/dsl/deserialize-dsl-workflow.ts +1104 -0
  169. package/src/{workflow/extract-simple-workflow.ts → utils/workflow/dsl/extract-dsl-workflow.ts} +678 -85
  170. package/src/utils/workflow/dsl/index.ts +11 -0
  171. package/src/{workflow → utils/workflow/dsl}/patterns.ts +108 -11
  172. package/src/{workflow → utils/workflow/dsl}/validation.ts +34 -7
  173. package/src/utils/workflow/graph/convert-dsl-to-graph.ts +422 -0
  174. package/src/utils/workflow/graph/finalize-workflow-wires.ts +310 -0
  175. package/src/utils/workflow/graph/finalize-workflows.ts +100 -0
  176. package/src/utils/workflow/graph/index.ts +11 -0
  177. package/src/utils/workflow/graph/serialize-workflow-graph.ts +216 -0
  178. package/src/utils/workflow/graph/workflow-graph.types.ts +231 -0
  179. package/src/visit.ts +14 -2
  180. package/tsconfig.tsbuildinfo +1 -1
  181. package/dist/add/add-mcp-tool.d.ts +0 -2
  182. package/dist/add/add-mcp-tool.js +0 -81
  183. package/dist/utils/extract-service-metadata.d.ts +0 -19
  184. package/dist/utils/extract-service-metadata.js +0 -244
  185. package/dist/utils/write-service-metadata.d.ts +0 -13
  186. package/dist/utils/write-service-metadata.js +0 -37
  187. package/src/add/add-mcp-tool.ts +0 -141
  188. package/src/utils/extract-service-metadata.ts +0 -353
  189. package/src/utils/write-service-metadata.ts +0 -51
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Serialized types for workflow graphs
3
+ * These are extracted by the inspector and stored as JSON
4
+ * Can be created from code (pikkuWorkflowGraph) or UI
5
+ */
6
+
7
+ /**
8
+ * Reference to data from another node or trigger
9
+ */
10
+ export interface DataRef {
11
+ /** Source: 'trigger' for trigger input, or node ID for node output */
12
+ $ref: string
13
+ /** Optional path into the data (dot notation: 'body.orderId') */
14
+ path?: string
15
+ }
16
+
17
+ /**
18
+ * Check if value is a DataRef
19
+ */
20
+ export const isDataRef = (value: unknown): value is DataRef =>
21
+ typeof value === 'object' &&
22
+ value !== null &&
23
+ '$ref' in value &&
24
+ typeof (value as DataRef).$ref === 'string'
25
+
26
+ /**
27
+ * Reference to a context/state variable
28
+ */
29
+ export interface StateRef {
30
+ /** Context variable name */
31
+ $state: string
32
+ /** Optional path into the value (dot notation for nested objects) */
33
+ path?: string
34
+ }
35
+
36
+ /**
37
+ * Check if value is a StateRef
38
+ */
39
+ export const isStateRef = (value: unknown): value is StateRef =>
40
+ typeof value === 'object' &&
41
+ value !== null &&
42
+ '$state' in value &&
43
+ typeof (value as StateRef).$state === 'string'
44
+
45
+ /**
46
+ * Helper functions for building input mappings
47
+ */
48
+ export const ref = (nodeId: string, path?: string): DataRef => ({
49
+ $ref: nodeId,
50
+ path,
51
+ })
52
+ export const state = (name: string, path?: string): StateRef => ({
53
+ $state: name,
54
+ path,
55
+ })
56
+
57
+ /**
58
+ * Condition for branching
59
+ */
60
+ export interface BranchCondition {
61
+ /** Expression to evaluate (uses node output references) */
62
+ expression: string
63
+ /** Target node(s) if condition is true */
64
+ target: string | string[]
65
+ }
66
+
67
+ /**
68
+ * Next node configuration
69
+ */
70
+ export type SerializedNext =
71
+ | string // Single next node
72
+ | string[] // Parallel execution
73
+ | {
74
+ /** Conditions evaluated in order, first match wins */
75
+ conditions: BranchCondition[]
76
+ /** Default target if no conditions match */
77
+ default?: string | string[]
78
+ }
79
+
80
+ /**
81
+ * Node execution options
82
+ */
83
+ export interface NodeOptions {
84
+ /** Number of retry attempts on failure */
85
+ retries?: number
86
+ /** Delay between retries (e.g., '1s', '5s') */
87
+ retryDelay?: string
88
+ /** Timeout for node execution (e.g., '30s', '5m') */
89
+ timeout?: string
90
+ /** If true, execute via queue (async). Default: false (inline) */
91
+ async?: boolean
92
+ }
93
+
94
+ /**
95
+ * Flow node types for control flow (no RPC call)
96
+ */
97
+ export type FlowType =
98
+ | 'sleep'
99
+ | 'branch'
100
+ | 'parallel'
101
+ | 'fanout'
102
+ | 'inline'
103
+ | 'switch'
104
+ | 'filter'
105
+ | 'arrayPredicate'
106
+ | 'return'
107
+ | 'cancel'
108
+ | 'set'
109
+
110
+ // Import and re-export context types from core
111
+ import type { ContextVariable, WorkflowContext } from '@pikku/core/workflow'
112
+
113
+ export type { ContextVariable, WorkflowContext }
114
+
115
+ /**
116
+ * Base node properties shared by all node types
117
+ */
118
+ interface BaseNode {
119
+ /** Node ID */
120
+ nodeId: string
121
+ /** Step name/description */
122
+ stepName?: string
123
+ /** Next node(s) - simple, parallel, or conditional */
124
+ next?: SerializedNext
125
+ /** Error routing - node(s) to execute on error */
126
+ onError?: string | string[]
127
+ /** Execution options */
128
+ options?: NodeOptions
129
+ }
130
+
131
+ /**
132
+ * Function node - calls an RPC
133
+ */
134
+ export interface FunctionNode extends BaseNode {
135
+ /** RPC function name */
136
+ rpcName: string
137
+ /** Input mapping - values can be literals or DataRefs */
138
+ input?: Record<string, unknown | DataRef>
139
+ /** Output variable name for storing result */
140
+ outputVar?: string
141
+ /** Hash of nodeId + RPC input/output schemas for version detection */
142
+ stepHash?: string
143
+ }
144
+
145
+ /**
146
+ * Flow node - control flow only, no RPC call
147
+ */
148
+ export interface FlowNode extends BaseNode {
149
+ /** Flow type */
150
+ flow: FlowType
151
+ /** Flow-specific properties */
152
+ [key: string]: unknown
153
+ }
154
+
155
+ /**
156
+ * Serialized graph node - either a function node or flow node
157
+ */
158
+ export type SerializedGraphNode = FunctionNode | FlowNode
159
+
160
+ /**
161
+ * Type guard for function nodes
162
+ */
163
+ export const isFunctionNode = (
164
+ node: SerializedGraphNode
165
+ ): node is FunctionNode => 'rpcName' in node
166
+
167
+ /**
168
+ * Type guard for flow nodes
169
+ */
170
+ export const isFlowNode = (node: SerializedGraphNode): node is FlowNode =>
171
+ 'flow' in node
172
+
173
+ /**
174
+ * Workflow source type
175
+ * - 'dsl': Pure DSL workflow (pikkuWorkflowFunc) - can be round-tripped to code
176
+ * - 'complex': Complex workflow (pikkuWorkflowComplexFunc) - contains inline steps, not serializable
177
+ * - 'graph': Graph-based workflow (pikkuWorkflowGraph)
178
+ */
179
+ export type WorkflowSourceType = 'dsl' | 'complex' | 'graph'
180
+
181
+ /**
182
+ * Serialized workflow graph - the canonical JSON format
183
+ */
184
+ export interface SerializedWorkflowGraph {
185
+ /** Workflow name */
186
+ name: string
187
+ /** Pikku function name (for runtime registration) */
188
+ pikkuFuncId: string
189
+ /** Source type: 'dsl' for pikkuWorkflowFunc, 'graph' for pikkuWorkflowGraph */
190
+ source: WorkflowSourceType
191
+ /** Optional description */
192
+ description?: string
193
+ /** Tags for organization */
194
+ tags?: string[]
195
+ /** Workflow context/state variables (from Zod schema) */
196
+ context?: WorkflowContext
197
+ /** Serialized nodes */
198
+ nodes: Record<string, SerializedGraphNode>
199
+ /** Entry node(s) - first nodes to execute */
200
+ entryNodeIds: string[]
201
+ /** Hash of graph topology (nodes, edges, input mappings) */
202
+ graphHash?: string
203
+ /** Wire entry points (HTTP, channel, queue, etc.) that trigger this workflow */
204
+ wires?: WorkflowWires
205
+ }
206
+
207
+ export interface WorkflowWires {
208
+ http?: Array<{ route: string; method: string; startNode: string }>
209
+ channel?: Array<{
210
+ name: string
211
+ route: string
212
+ onConnect?: string
213
+ onMessage?: string
214
+ onDisconnect?: string
215
+ onMessageRoute?: Record<string, string>
216
+ }>
217
+ queue?: Array<{ name: string; startNode: string }>
218
+ cli?: Array<{ command: string; startNode: string }>
219
+ mcp?: {
220
+ tool?: Array<{ name: string; startNode: string }>
221
+ prompt?: Array<{ name: string; startNode: string }>
222
+ resource?: Array<{ uri: string; startNode: string }>
223
+ }
224
+ schedule?: Array<{ cron: string; startNode: string }>
225
+ trigger?: Array<{ name: string; startNode: string }>
226
+ }
227
+
228
+ /**
229
+ * All workflow graphs (serialized)
230
+ */
231
+ export type SerializedWorkflowGraphs = Record<string, SerializedWorkflowGraph>
package/src/visit.ts CHANGED
@@ -2,11 +2,12 @@ import * as ts from 'typescript'
2
2
  import { addFileWithFactory } from './add/add-file-with-factory.js'
3
3
  import { addFileExtendsCoreType } from './add/add-file-extends-core-type.js'
4
4
  import { addHTTPRoute } from './add/add-http-route.js'
5
+ import { addHTTPRoutes } from './add/add-http-routes.js'
5
6
  import { addSchedule } from './add/add-schedule.js'
7
+ import { addTrigger } from './add/add-trigger.js'
6
8
  import { addQueueWorker } from './add/add-queue-worker.js'
7
9
  import { addWorkflow } from './add/add-workflow.js'
8
10
  import { addMCPResource } from './add/add-mcp-resource.js'
9
- import { addMCPTool } from './add/add-mcp-tool.js'
10
11
  import { addMCPPrompt } from './add/add-mcp-prompt.js'
11
12
  import { InspectorState, InspectorLogger, InspectorOptions } from './types.js'
12
13
  import { addFunctions } from './add/add-functions.js'
@@ -15,6 +16,10 @@ import { addRPCInvocations } from './add/add-rpc-invocations.js'
15
16
  import { addMiddleware } from './add/add-middleware.js'
16
17
  import { addPermission } from './add/add-permission.js'
17
18
  import { addCLI, addCLIRenderers } from './add/add-cli.js'
19
+ import { addSecret, addOAuth2Credential } from './add/add-secret.js'
20
+ import { addVariable } from './add/add-variable.js'
21
+ import { addWorkflowGraph } from './add/add-workflow-graph.js'
22
+ import { addAIAgent } from './add/add-ai-agent.js'
18
23
 
19
24
  export const visitSetup = (
20
25
  logger: InspectorLogger,
@@ -90,15 +95,22 @@ export const visitRoutes = (
90
95
  options: InspectorOptions
91
96
  ) => {
92
97
  addFunctions(logger, node, checker, state, options)
98
+ addSecret(logger, node, checker, state, options)
99
+ addOAuth2Credential(logger, node, checker, state, options)
100
+ addVariable(logger, node, checker, state, options)
101
+
93
102
  addHTTPRoute(logger, node, checker, state, options)
103
+ addHTTPRoutes(logger, node, checker, state, options)
94
104
  addSchedule(logger, node, checker, state, options)
105
+ addTrigger(logger, node, checker, state, options)
95
106
  addQueueWorker(logger, node, checker, state, options)
96
107
  addChannel(logger, node, checker, state, options)
97
108
  addCLI(logger, node, checker, state, options)
98
109
  addCLIRenderers(logger, node, checker, state, options)
99
110
  addMCPResource(logger, node, checker, state, options)
100
- addMCPTool(logger, node, checker, state, options)
101
111
  addMCPPrompt(logger, node, checker, state, options)
112
+ addWorkflowGraph(logger, node, checker, state, options)
113
+ addAIAgent(logger, node, checker, state, options)
102
114
 
103
115
  ts.forEachChild(node, (child) =>
104
116
  visitRoutes(logger, checker, child, state, options)