@sensigo/realm 0.1.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 (222) hide show
  1. package/README.md +150 -0
  2. package/dist/adapters/adapter-utils.d.ts +14 -0
  3. package/dist/adapters/adapter-utils.d.ts.map +1 -0
  4. package/dist/adapters/adapter-utils.js +18 -0
  5. package/dist/adapters/adapter-utils.js.map +1 -0
  6. package/dist/adapters/airtable-adapter.d.ts +51 -0
  7. package/dist/adapters/airtable-adapter.d.ts.map +1 -0
  8. package/dist/adapters/airtable-adapter.js +425 -0
  9. package/dist/adapters/airtable-adapter.js.map +1 -0
  10. package/dist/adapters/file-adapter.d.ts +14 -0
  11. package/dist/adapters/file-adapter.d.ts.map +1 -0
  12. package/dist/adapters/file-adapter.js +89 -0
  13. package/dist/adapters/file-adapter.js.map +1 -0
  14. package/dist/adapters/github-adapter.d.ts +40 -0
  15. package/dist/adapters/github-adapter.d.ts.map +1 -0
  16. package/dist/adapters/github-adapter.js +286 -0
  17. package/dist/adapters/github-adapter.js.map +1 -0
  18. package/dist/adapters/gorgias-adapter.d.ts +40 -0
  19. package/dist/adapters/gorgias-adapter.d.ts.map +1 -0
  20. package/dist/adapters/gorgias-adapter.js +300 -0
  21. package/dist/adapters/gorgias-adapter.js.map +1 -0
  22. package/dist/adapters/http-adapter.d.ts +28 -0
  23. package/dist/adapters/http-adapter.d.ts.map +1 -0
  24. package/dist/adapters/http-adapter.js +97 -0
  25. package/dist/adapters/http-adapter.js.map +1 -0
  26. package/dist/adapters/mock-adapter.d.ts +16 -0
  27. package/dist/adapters/mock-adapter.d.ts.map +1 -0
  28. package/dist/adapters/mock-adapter.js +61 -0
  29. package/dist/adapters/mock-adapter.js.map +1 -0
  30. package/dist/adapters/notion-adapter.d.ts +54 -0
  31. package/dist/adapters/notion-adapter.d.ts.map +1 -0
  32. package/dist/adapters/notion-adapter.js +751 -0
  33. package/dist/adapters/notion-adapter.js.map +1 -0
  34. package/dist/adapters/parcelpanel-adapter.d.ts +60 -0
  35. package/dist/adapters/parcelpanel-adapter.d.ts.map +1 -0
  36. package/dist/adapters/parcelpanel-adapter.js +251 -0
  37. package/dist/adapters/parcelpanel-adapter.js.map +1 -0
  38. package/dist/adapters/rate-limiter.d.ts +26 -0
  39. package/dist/adapters/rate-limiter.d.ts.map +1 -0
  40. package/dist/adapters/rate-limiter.js +3 -0
  41. package/dist/adapters/rate-limiter.js.map +1 -0
  42. package/dist/adapters/shopify-adapter.d.ts +92 -0
  43. package/dist/adapters/shopify-adapter.d.ts.map +1 -0
  44. package/dist/adapters/shopify-adapter.js +415 -0
  45. package/dist/adapters/shopify-adapter.js.map +1 -0
  46. package/dist/adapters/slack-adapter.d.ts +18 -0
  47. package/dist/adapters/slack-adapter.d.ts.map +1 -0
  48. package/dist/adapters/slack-adapter.js +81 -0
  49. package/dist/adapters/slack-adapter.js.map +1 -0
  50. package/dist/adapters/token-bucket.d.ts +27 -0
  51. package/dist/adapters/token-bucket.d.ts.map +1 -0
  52. package/dist/adapters/token-bucket.js +109 -0
  53. package/dist/adapters/token-bucket.js.map +1 -0
  54. package/dist/config/secrets.d.ts +15 -0
  55. package/dist/config/secrets.d.ts.map +1 -0
  56. package/dist/config/secrets.js +33 -0
  57. package/dist/config/secrets.js.map +1 -0
  58. package/dist/engine/eligibility.d.ts +50 -0
  59. package/dist/engine/eligibility.d.ts.map +1 -0
  60. package/dist/engine/eligibility.js +267 -0
  61. package/dist/engine/eligibility.js.map +1 -0
  62. package/dist/engine/error-resolution.d.ts +20 -0
  63. package/dist/engine/error-resolution.d.ts.map +1 -0
  64. package/dist/engine/error-resolution.js +32 -0
  65. package/dist/engine/error-resolution.js.map +1 -0
  66. package/dist/engine/execution-loop.d.ts +101 -0
  67. package/dist/engine/execution-loop.d.ts.map +1 -0
  68. package/dist/engine/execution-loop.js +1156 -0
  69. package/dist/engine/execution-loop.js.map +1 -0
  70. package/dist/engine/lifecycle.d.ts +14 -0
  71. package/dist/engine/lifecycle.d.ts.map +1 -0
  72. package/dist/engine/lifecycle.js +17 -0
  73. package/dist/engine/lifecycle.js.map +1 -0
  74. package/dist/engine/precondition.d.ts +30 -0
  75. package/dist/engine/precondition.d.ts.map +1 -0
  76. package/dist/engine/precondition.js +125 -0
  77. package/dist/engine/precondition.js.map +1 -0
  78. package/dist/engine/prompt-template.d.ts +25 -0
  79. package/dist/engine/prompt-template.d.ts.map +1 -0
  80. package/dist/engine/prompt-template.js +66 -0
  81. package/dist/engine/prompt-template.js.map +1 -0
  82. package/dist/engine/render-template.d.ts +52 -0
  83. package/dist/engine/render-template.d.ts.map +1 -0
  84. package/dist/engine/render-template.js +548 -0
  85. package/dist/engine/render-template.js.map +1 -0
  86. package/dist/engine/state-guard.d.ts +15 -0
  87. package/dist/engine/state-guard.d.ts.map +1 -0
  88. package/dist/engine/state-guard.js +40 -0
  89. package/dist/engine/state-guard.js.map +1 -0
  90. package/dist/engine/trace-normalizer.d.ts +36 -0
  91. package/dist/engine/trace-normalizer.d.ts.map +1 -0
  92. package/dist/engine/trace-normalizer.js +146 -0
  93. package/dist/engine/trace-normalizer.js.map +1 -0
  94. package/dist/engine/trace-policy.d.ts +53 -0
  95. package/dist/engine/trace-policy.d.ts.map +1 -0
  96. package/dist/engine/trace-policy.js +35 -0
  97. package/dist/engine/trace-policy.js.map +1 -0
  98. package/dist/engine/workflow-context-loader.d.ts +9 -0
  99. package/dist/engine/workflow-context-loader.d.ts.map +1 -0
  100. package/dist/engine/workflow-context-loader.js +41 -0
  101. package/dist/engine/workflow-context-loader.js.map +1 -0
  102. package/dist/evidence/snapshot.d.ts +38 -0
  103. package/dist/evidence/snapshot.d.ts.map +1 -0
  104. package/dist/evidence/snapshot.js +53 -0
  105. package/dist/evidence/snapshot.js.map +1 -0
  106. package/dist/extensions/default-registry.d.ts +19 -0
  107. package/dist/extensions/default-registry.d.ts.map +1 -0
  108. package/dist/extensions/default-registry.js +31 -0
  109. package/dist/extensions/default-registry.js.map +1 -0
  110. package/dist/extensions/processor.d.ts +13 -0
  111. package/dist/extensions/processor.d.ts.map +1 -0
  112. package/dist/extensions/processor.js +3 -0
  113. package/dist/extensions/processor.js.map +1 -0
  114. package/dist/extensions/registry.d.ts +25 -0
  115. package/dist/extensions/registry.d.ts.map +1 -0
  116. package/dist/extensions/registry.js +43 -0
  117. package/dist/extensions/registry.js.map +1 -0
  118. package/dist/extensions/service-adapter.d.ts +35 -0
  119. package/dist/extensions/service-adapter.d.ts.map +1 -0
  120. package/dist/extensions/service-adapter.js +3 -0
  121. package/dist/extensions/service-adapter.js.map +1 -0
  122. package/dist/extensions/step-handler.d.ts +28 -0
  123. package/dist/extensions/step-handler.d.ts.map +1 -0
  124. package/dist/extensions/step-handler.js +3 -0
  125. package/dist/extensions/step-handler.js.map +1 -0
  126. package/dist/handlers/primitives/compare-strings.d.ts +13 -0
  127. package/dist/handlers/primitives/compare-strings.d.ts.map +1 -0
  128. package/dist/handlers/primitives/compare-strings.js +28 -0
  129. package/dist/handlers/primitives/compare-strings.js.map +1 -0
  130. package/dist/handlers/primitives/count-results.d.ts +21 -0
  131. package/dist/handlers/primitives/count-results.d.ts.map +1 -0
  132. package/dist/handlers/primitives/count-results.js +23 -0
  133. package/dist/handlers/primitives/count-results.js.map +1 -0
  134. package/dist/handlers/primitives/partition-by-substring.d.ts +18 -0
  135. package/dist/handlers/primitives/partition-by-substring.d.ts.map +1 -0
  136. package/dist/handlers/primitives/partition-by-substring.js +28 -0
  137. package/dist/handlers/primitives/partition-by-substring.js.map +1 -0
  138. package/dist/handlers/primitives/resolve-resource.d.ts +13 -0
  139. package/dist/handlers/primitives/resolve-resource.d.ts.map +1 -0
  140. package/dist/handlers/primitives/resolve-resource.js +21 -0
  141. package/dist/handlers/primitives/resolve-resource.js.map +1 -0
  142. package/dist/handlers/primitives/walk-field.d.ts +11 -0
  143. package/dist/handlers/primitives/walk-field.d.ts.map +1 -0
  144. package/dist/handlers/primitives/walk-field.js +31 -0
  145. package/dist/handlers/primitives/walk-field.js.map +1 -0
  146. package/dist/handlers/validate-field-match.d.ts +11 -0
  147. package/dist/handlers/validate-field-match.d.ts.map +1 -0
  148. package/dist/handlers/validate-field-match.js +39 -0
  149. package/dist/handlers/validate-field-match.js.map +1 -0
  150. package/dist/handlers/validate-verbatim-quotes.d.ts +11 -0
  151. package/dist/handlers/validate-verbatim-quotes.d.ts.map +1 -0
  152. package/dist/handlers/validate-verbatim-quotes.js +37 -0
  153. package/dist/handlers/validate-verbatim-quotes.js.map +1 -0
  154. package/dist/index.d.ts +57 -0
  155. package/dist/index.d.ts.map +1 -0
  156. package/dist/index.js +45 -0
  157. package/dist/index.js.map +1 -0
  158. package/dist/pipeline/processing-pipeline.d.ts +24 -0
  159. package/dist/pipeline/processing-pipeline.d.ts.map +1 -0
  160. package/dist/pipeline/processing-pipeline.js +53 -0
  161. package/dist/pipeline/processing-pipeline.js.map +1 -0
  162. package/dist/processors/compute-hash.d.ts +4 -0
  163. package/dist/processors/compute-hash.d.ts.map +1 -0
  164. package/dist/processors/compute-hash.js +14 -0
  165. package/dist/processors/compute-hash.js.map +1 -0
  166. package/dist/processors/normalize-text.d.ts +8 -0
  167. package/dist/processors/normalize-text.d.ts.map +1 -0
  168. package/dist/processors/normalize-text.js +47 -0
  169. package/dist/processors/normalize-text.js.map +1 -0
  170. package/dist/store/json-file-store.d.ts +24 -0
  171. package/dist/store/json-file-store.d.ts.map +1 -0
  172. package/dist/store/json-file-store.js +210 -0
  173. package/dist/store/json-file-store.js.map +1 -0
  174. package/dist/store/store-interface.d.ts +33 -0
  175. package/dist/store/store-interface.d.ts.map +1 -0
  176. package/dist/store/store-interface.js +2 -0
  177. package/dist/store/store-interface.js.map +1 -0
  178. package/dist/store/trace-buffer-store.d.ts +55 -0
  179. package/dist/store/trace-buffer-store.d.ts.map +1 -0
  180. package/dist/store/trace-buffer-store.js +113 -0
  181. package/dist/store/trace-buffer-store.js.map +1 -0
  182. package/dist/types/mcp-types.d.ts +17 -0
  183. package/dist/types/mcp-types.d.ts.map +1 -0
  184. package/dist/types/mcp-types.js +5 -0
  185. package/dist/types/mcp-types.js.map +1 -0
  186. package/dist/types/response-envelope.d.ts +96 -0
  187. package/dist/types/response-envelope.d.ts.map +1 -0
  188. package/dist/types/response-envelope.js +2 -0
  189. package/dist/types/response-envelope.js.map +1 -0
  190. package/dist/types/run-record.d.ts +169 -0
  191. package/dist/types/run-record.d.ts.map +1 -0
  192. package/dist/types/run-record.js +2 -0
  193. package/dist/types/run-record.js.map +1 -0
  194. package/dist/types/workflow-definition.d.ts +292 -0
  195. package/dist/types/workflow-definition.d.ts.map +1 -0
  196. package/dist/types/workflow-definition.js +2 -0
  197. package/dist/types/workflow-definition.js.map +1 -0
  198. package/dist/types/workflow-error.d.ts +26 -0
  199. package/dist/types/workflow-error.d.ts.map +1 -0
  200. package/dist/types/workflow-error.js +28 -0
  201. package/dist/types/workflow-error.js.map +1 -0
  202. package/dist/utils/schema-skeleton.d.ts +11 -0
  203. package/dist/utils/schema-skeleton.d.ts.map +1 -0
  204. package/dist/utils/schema-skeleton.js +40 -0
  205. package/dist/utils/schema-skeleton.js.map +1 -0
  206. package/dist/validation/input-schema.d.ts +26 -0
  207. package/dist/validation/input-schema.d.ts.map +1 -0
  208. package/dist/validation/input-schema.js +67 -0
  209. package/dist/validation/input-schema.js.map +1 -0
  210. package/dist/workflow/registrar.d.ts +20 -0
  211. package/dist/workflow/registrar.d.ts.map +1 -0
  212. package/dist/workflow/registrar.js +61 -0
  213. package/dist/workflow/registrar.js.map +1 -0
  214. package/dist/workflow/template-resolver.d.ts +25 -0
  215. package/dist/workflow/template-resolver.d.ts.map +1 -0
  216. package/dist/workflow/template-resolver.js +112 -0
  217. package/dist/workflow/template-resolver.js.map +1 -0
  218. package/dist/workflow/yaml-loader.d.ts +15 -0
  219. package/dist/workflow/yaml-loader.d.ts.map +1 -0
  220. package/dist/workflow/yaml-loader.js +408 -0
  221. package/dist/workflow/yaml-loader.js.map +1 -0
  222. package/package.json +61 -0
@@ -0,0 +1,548 @@
1
+ /**
2
+ * Resolves a dot-path like "context.resources.review_security.findings"
3
+ * against the given root object. Returns undefined if any segment is missing.
4
+ */
5
+ export function resolvePath(path, root) {
6
+ const parts = path.trim().split('.');
7
+ let current = root;
8
+ for (const part of parts) {
9
+ if (typeof current !== 'object' || current === null)
10
+ return undefined;
11
+ current = current[part];
12
+ }
13
+ return current;
14
+ }
15
+ /** Thrown by renderTemplate when strict mode is on and an unknown filter is encountered. */
16
+ export class UnknownFilterError extends Error {
17
+ filterName;
18
+ constructor(filterName) {
19
+ super(`Unknown filter: '${filterName}'`);
20
+ this.filterName = filterName;
21
+ this.name = 'UnknownFilterError';
22
+ }
23
+ }
24
+ // Static lookup table for date formatting presets used by the `date` filter.
25
+ const DATE_PRESETS = {
26
+ short: (d) => new Intl.DateTimeFormat('en-US', {
27
+ month: 'short',
28
+ day: 'numeric',
29
+ year: 'numeric',
30
+ timeZone: 'UTC',
31
+ }).format(d),
32
+ long: (d) => new Intl.DateTimeFormat('en-US', {
33
+ month: 'long',
34
+ day: 'numeric',
35
+ year: 'numeric',
36
+ timeZone: 'UTC',
37
+ }).format(d),
38
+ iso: (d) => d.toISOString().slice(0, 10),
39
+ time: (d) => new Intl.DateTimeFormat('en-US', {
40
+ hour: '2-digit',
41
+ minute: '2-digit',
42
+ hourCycle: 'h23',
43
+ timeZone: 'UTC',
44
+ }).format(d),
45
+ datetime: (d) => new Intl.DateTimeFormat('en-US', {
46
+ month: 'short',
47
+ day: 'numeric',
48
+ year: 'numeric',
49
+ hour: '2-digit',
50
+ minute: '2-digit',
51
+ hourCycle: 'h23',
52
+ timeZone: 'UTC',
53
+ }).format(d),
54
+ };
55
+ /**
56
+ * Applies a single named filter to a value and returns a FilterResult.
57
+ * Exported for direct testing of individual filter behaviour.
58
+ */
59
+ export function applyFilter(value, filterName, args) {
60
+ switch (filterName) {
61
+ case 'bullets': {
62
+ if (!Array.isArray(value))
63
+ return { ok: false, reason: 'type_mismatch' };
64
+ if (value.length === 0)
65
+ return { ok: true, value: undefined };
66
+ return { ok: true, value: value.map((item) => `• ${String(item)}`).join('\n') };
67
+ }
68
+ case 'join': {
69
+ if (!Array.isArray(value))
70
+ return { ok: false, reason: 'type_mismatch' };
71
+ const sep = args[0] ?? ', ';
72
+ return { ok: true, value: value.map((item) => String(item)).join(sep) };
73
+ }
74
+ case 'default': {
75
+ const fallback = args[0] ?? '';
76
+ if (value === null || value === undefined)
77
+ return { ok: true, value: fallback };
78
+ return { ok: true, value };
79
+ }
80
+ case 'upper': {
81
+ if (typeof value !== 'string')
82
+ return { ok: false, reason: 'type_mismatch' };
83
+ return { ok: true, value: value.toUpperCase() };
84
+ }
85
+ case 'lower': {
86
+ if (typeof value !== 'string')
87
+ return { ok: false, reason: 'type_mismatch' };
88
+ return { ok: true, value: value.toLowerCase() };
89
+ }
90
+ case 'capitalize': {
91
+ if (typeof value !== 'string')
92
+ return { ok: false, reason: 'type_mismatch' };
93
+ if (value.length === 0)
94
+ return { ok: true, value: '' };
95
+ return { ok: true, value: value.charAt(0).toUpperCase() + value.slice(1) };
96
+ }
97
+ case 'truncate': {
98
+ if (typeof value !== 'string')
99
+ return { ok: false, reason: 'type_mismatch' };
100
+ const rawArg = args[0];
101
+ if (rawArg === undefined)
102
+ return { ok: false, reason: 'type_mismatch' };
103
+ const limit = parseInt(rawArg, 10);
104
+ if (isNaN(limit))
105
+ return { ok: false, reason: 'type_mismatch' };
106
+ if (value.length <= limit)
107
+ return { ok: true, value };
108
+ // Find last word boundary at or before limit.
109
+ const sub = value.slice(0, limit);
110
+ const boundary = sub.lastIndexOf(' ');
111
+ const cut = boundary > 0 ? sub.slice(0, boundary) : sub;
112
+ return { ok: true, value: `${cut}…` };
113
+ }
114
+ // ─── Tier 2 filters ───────────────────────────────────────────────────
115
+ case 'pluck': {
116
+ if (!Array.isArray(value))
117
+ return { ok: false, reason: 'type_mismatch' };
118
+ const key = args[0];
119
+ if (!key)
120
+ return { ok: false, reason: 'type_mismatch' };
121
+ const result = [];
122
+ for (const item of value) {
123
+ if (typeof item !== 'object' || item === null)
124
+ continue;
125
+ const record = item;
126
+ if (Object.prototype.hasOwnProperty.call(record, key)) {
127
+ result.push(record[key]);
128
+ }
129
+ }
130
+ return { ok: true, value: result };
131
+ }
132
+ case 'count': {
133
+ if (!Array.isArray(value))
134
+ return { ok: false, reason: 'type_mismatch' };
135
+ return { ok: true, value: String(value.length) };
136
+ }
137
+ case 'limit': {
138
+ if (!Array.isArray(value))
139
+ return { ok: false, reason: 'type_mismatch' };
140
+ const rawLimit = args[0];
141
+ if (rawLimit === undefined)
142
+ return { ok: false, reason: 'type_mismatch' };
143
+ const n = parseInt(rawLimit, 10);
144
+ if (isNaN(n))
145
+ return { ok: false, reason: 'type_mismatch' };
146
+ return { ok: true, value: value.slice(0, n) };
147
+ }
148
+ case 'compact': {
149
+ if (!Array.isArray(value))
150
+ return { ok: false, reason: 'type_mismatch' };
151
+ return { ok: true, value: value.filter((item) => item !== null && item !== undefined) };
152
+ }
153
+ case 'round': {
154
+ if (typeof value !== 'number')
155
+ return { ok: false, reason: 'type_mismatch' };
156
+ const rawDecimals = args[0];
157
+ let decimals = 0;
158
+ if (rawDecimals !== undefined && rawDecimals !== '') {
159
+ const parsed = parseInt(rawDecimals, 10);
160
+ if (isNaN(parsed))
161
+ return { ok: false, reason: 'type_mismatch' };
162
+ decimals = parsed;
163
+ }
164
+ return { ok: true, value: value.toFixed(decimals) };
165
+ }
166
+ case 'floor': {
167
+ if (typeof value !== 'number')
168
+ return { ok: false, reason: 'type_mismatch' };
169
+ return { ok: true, value: String(Math.floor(value)) };
170
+ }
171
+ case 'ceil': {
172
+ if (typeof value !== 'number')
173
+ return { ok: false, reason: 'type_mismatch' };
174
+ return { ok: true, value: String(Math.ceil(value)) };
175
+ }
176
+ case 'abs': {
177
+ if (typeof value !== 'number')
178
+ return { ok: false, reason: 'type_mismatch' };
179
+ return { ok: true, value: String(Math.abs(value)) };
180
+ }
181
+ case 'number_format': {
182
+ if (typeof value !== 'number')
183
+ return { ok: false, reason: 'type_mismatch' };
184
+ const rawDecimals = args[0];
185
+ let decimals = 0;
186
+ if (rawDecimals !== undefined && rawDecimals !== '') {
187
+ const parsed = parseInt(rawDecimals, 10);
188
+ if (isNaN(parsed))
189
+ return { ok: false, reason: 'type_mismatch' };
190
+ decimals = parsed;
191
+ }
192
+ const opts = decimals === 0
193
+ ? { maximumFractionDigits: 0 }
194
+ : { minimumFractionDigits: decimals, maximumFractionDigits: decimals };
195
+ return { ok: true, value: new Intl.NumberFormat('en-US', opts).format(value) };
196
+ }
197
+ case 'percent': {
198
+ if (typeof value !== 'number')
199
+ return { ok: false, reason: 'type_mismatch' };
200
+ const rawDecimals = args[0];
201
+ let decimals = 0;
202
+ if (rawDecimals !== undefined && rawDecimals !== '') {
203
+ const parsed = parseInt(rawDecimals, 10);
204
+ if (isNaN(parsed))
205
+ return { ok: false, reason: 'type_mismatch' };
206
+ decimals = parsed;
207
+ }
208
+ return { ok: true, value: `${(value * 100).toFixed(decimals)}%` };
209
+ }
210
+ case 'replace': {
211
+ if (typeof value !== 'string')
212
+ return { ok: false, reason: 'type_mismatch' };
213
+ const search = args[0];
214
+ const replacement = args[1];
215
+ if (search === undefined || replacement === undefined)
216
+ return { ok: false, reason: 'type_mismatch' };
217
+ if (search === '')
218
+ return { ok: false, reason: 'type_mismatch' };
219
+ return { ok: true, value: value.replaceAll(search, replacement) };
220
+ }
221
+ case 'yesno': {
222
+ if (typeof value !== 'boolean')
223
+ return { ok: false, reason: 'type_mismatch' };
224
+ if (args.length >= 2) {
225
+ return { ok: true, value: value ? args[0] : args[1] };
226
+ }
227
+ // zero or one arg: fall back to defaults (preserves Phase 43b promise)
228
+ return { ok: true, value: value ? 'yes' : 'no' };
229
+ }
230
+ case 'and_join': {
231
+ if (!Array.isArray(value))
232
+ return { ok: false, reason: 'type_mismatch' };
233
+ if (value.length === 0)
234
+ return { ok: true, value: undefined };
235
+ const strs = value.map((item) => String(item));
236
+ if (strs.length === 1)
237
+ return { ok: true, value: strs[0] };
238
+ if (strs.length === 2)
239
+ return { ok: true, value: `${strs[0]} and ${strs[1]}` };
240
+ const last = strs[strs.length - 1];
241
+ const rest = strs.slice(0, -1);
242
+ return { ok: true, value: `${rest.join(', ')}, and ${last}` };
243
+ }
244
+ case 'trim': {
245
+ if (typeof value !== 'string')
246
+ return { ok: false, reason: 'type_mismatch' };
247
+ return { ok: true, value: value.trim() };
248
+ }
249
+ case 'first': {
250
+ if (!Array.isArray(value))
251
+ return { ok: false, reason: 'type_mismatch' };
252
+ if (value.length === 0)
253
+ return { ok: true, value: undefined };
254
+ return { ok: true, value: value[0] };
255
+ }
256
+ case 'last': {
257
+ if (!Array.isArray(value))
258
+ return { ok: false, reason: 'type_mismatch' };
259
+ if (value.length === 0)
260
+ return { ok: true, value: undefined };
261
+ return { ok: true, value: value[value.length - 1] };
262
+ }
263
+ case 'sum': {
264
+ if (!Array.isArray(value))
265
+ return { ok: false, reason: 'type_mismatch' };
266
+ if (value.length === 0)
267
+ return { ok: true, value: '0' };
268
+ let total = 0;
269
+ for (const item of value) {
270
+ if (typeof item !== 'number')
271
+ return { ok: false, reason: 'type_mismatch' };
272
+ total += item;
273
+ }
274
+ return { ok: true, value: String(total) };
275
+ }
276
+ case 'flatten': {
277
+ if (!Array.isArray(value))
278
+ return { ok: false, reason: 'type_mismatch' };
279
+ return { ok: true, value: value.flat(1) };
280
+ }
281
+ case 'split': {
282
+ if (typeof value !== 'string')
283
+ return { ok: false, reason: 'type_mismatch' };
284
+ const delimiter = args[0];
285
+ if (delimiter === undefined || delimiter === '')
286
+ return { ok: false, reason: 'type_mismatch' };
287
+ return { ok: true, value: value.split(delimiter) };
288
+ }
289
+ case 'sort': {
290
+ if (!Array.isArray(value))
291
+ return { ok: false, reason: 'type_mismatch' };
292
+ const sorted = [...value].sort((a, b) => String(a).localeCompare(String(b)));
293
+ return { ok: true, value: sorted };
294
+ }
295
+ case 'unique': {
296
+ if (!Array.isArray(value))
297
+ return { ok: false, reason: 'type_mismatch' };
298
+ const seen = new Set();
299
+ const result = [];
300
+ for (const item of value) {
301
+ const key = JSON.stringify(item);
302
+ if (!seen.has(key)) {
303
+ seen.add(key);
304
+ result.push(item);
305
+ }
306
+ }
307
+ return { ok: true, value: result };
308
+ }
309
+ case 'title': {
310
+ if (typeof value !== 'string')
311
+ return { ok: false, reason: 'type_mismatch' };
312
+ return {
313
+ ok: true,
314
+ value: value.replace(/\S+/g, (word) => word.charAt(0).toUpperCase() + word.slice(1)),
315
+ };
316
+ }
317
+ case 'code': {
318
+ if (typeof value !== 'string')
319
+ return { ok: false, reason: 'type_mismatch' };
320
+ return { ok: true, value: `\`${value}\`` };
321
+ }
322
+ case 'indent': {
323
+ if (typeof value !== 'string')
324
+ return { ok: false, reason: 'type_mismatch' };
325
+ const raw = args[0];
326
+ if (raw === undefined)
327
+ return { ok: false, reason: 'type_mismatch' };
328
+ const n = parseInt(raw, 10);
329
+ if (isNaN(n))
330
+ return { ok: false, reason: 'type_mismatch' };
331
+ if (n === 0)
332
+ return { ok: true, value };
333
+ const prefix = ' '.repeat(n);
334
+ return {
335
+ ok: true,
336
+ value: value
337
+ .split('\n')
338
+ .map((line) => (line.length > 0 ? prefix + line : line))
339
+ .join('\n'),
340
+ };
341
+ }
342
+ case 'date': {
343
+ if (typeof value !== 'string')
344
+ return { ok: false, reason: 'type_mismatch' };
345
+ const d = new Date(value);
346
+ if (isNaN(d.getTime()))
347
+ return { ok: false, reason: 'type_mismatch' };
348
+ const preset = args[0] ?? 'short';
349
+ const formatter = DATE_PRESETS[preset];
350
+ if (!formatter)
351
+ return { ok: false, reason: 'type_mismatch' };
352
+ return { ok: true, value: formatter(d) };
353
+ }
354
+ case 'from_now': {
355
+ if (typeof value !== 'string')
356
+ return { ok: false, reason: 'type_mismatch' };
357
+ const d = new Date(value);
358
+ if (isNaN(d.getTime()))
359
+ return { ok: false, reason: 'type_mismatch' };
360
+ const rtf = new Intl.RelativeTimeFormat('en', { numeric: 'auto' });
361
+ const diffMs = d.getTime() - Date.now();
362
+ const diffSec = Math.round(diffMs / 1000);
363
+ const absSec = Math.abs(diffSec);
364
+ if (absSec < 60)
365
+ return { ok: true, value: rtf.format(diffSec, 'second') };
366
+ const diffMin = Math.round(diffMs / 60000);
367
+ const absMin = Math.abs(diffMin);
368
+ if (absMin < 60)
369
+ return { ok: true, value: rtf.format(diffMin, 'minute') };
370
+ const diffHr = Math.round(diffMs / 3600000);
371
+ const absHr = Math.abs(diffHr);
372
+ if (absHr < 24)
373
+ return { ok: true, value: rtf.format(diffHr, 'hour') };
374
+ const diffDay = Math.round(diffMs / 86400000);
375
+ return { ok: true, value: rtf.format(diffDay, 'day') };
376
+ }
377
+ case 'duration': {
378
+ if (typeof value !== 'number')
379
+ return { ok: false, reason: 'type_mismatch' };
380
+ if (value < 0)
381
+ return { ok: false, reason: 'type_mismatch' };
382
+ const totalSec = Math.floor(value / 1000);
383
+ if (totalSec < 60)
384
+ return { ok: true, value: `${totalSec}s` };
385
+ const mins = Math.floor(totalSec / 60);
386
+ const secs = totalSec % 60;
387
+ return { ok: true, value: `${mins}m ${secs}s` };
388
+ }
389
+ default:
390
+ return { ok: false, reason: 'unknown_filter', filterName };
391
+ }
392
+ }
393
+ // Strip outer matching quotes from a single token.
394
+ function stripOuterQuotes(token) {
395
+ if ((token.startsWith('"') && token.endsWith('"')) ||
396
+ (token.startsWith("'") && token.endsWith("'"))) {
397
+ return token.slice(1, -1);
398
+ }
399
+ return token;
400
+ }
401
+ // Splits input on every occurrence of delimiter that is not inside a quoted string.
402
+ // Single or double quotes both open/close quote state; the other quote type is ignored
403
+ // while inside a quote. delimiter must be a single character.
404
+ // Returns raw substrings — no trimming, no quote stripping.
405
+ function splitOnUnquotedDelimiter(input, delimiter) {
406
+ const segments = [];
407
+ let current = '';
408
+ let inSingle = false;
409
+ let inDouble = false;
410
+ for (const ch of input) {
411
+ if (ch === '"' && !inSingle) {
412
+ inDouble = !inDouble;
413
+ current += ch;
414
+ continue;
415
+ }
416
+ if (ch === "'" && !inDouble) {
417
+ inSingle = !inSingle;
418
+ current += ch;
419
+ continue;
420
+ }
421
+ if (ch === delimiter && !inSingle && !inDouble) {
422
+ segments.push(current);
423
+ current = '';
424
+ continue;
425
+ }
426
+ current += ch;
427
+ }
428
+ segments.push(current);
429
+ return segments;
430
+ }
431
+ function splitOnUnquotedPipes(expr) {
432
+ return splitOnUnquotedDelimiter(expr, '|');
433
+ }
434
+ // Parses a comma-separated filter argument list with quote awareness.
435
+ // Calls splitOnUnquotedDelimiter, then strips outer quotes and trims each token.
436
+ // An empty or whitespace-only raw string returns [].
437
+ function parseFilterArgs(raw) {
438
+ if (!raw.trim())
439
+ return [];
440
+ return splitOnUnquotedDelimiter(raw, ',').map((token) => stripOuterQuotes(token.trim()));
441
+ }
442
+ // Parse the filter chain from the pipe-separated expression tail.
443
+ // Returns an array of { name, args } entries.
444
+ function parseFilters(expr) {
445
+ const segments = splitOnUnquotedPipes(expr).slice(1); // first segment is the path
446
+ return segments.map((seg) => {
447
+ const colonIdx = seg.indexOf(':');
448
+ if (colonIdx === -1) {
449
+ return { name: seg.trim(), args: [] };
450
+ }
451
+ const name = seg.slice(0, colonIdx).trim();
452
+ const args = parseFilterArgs(seg.slice(colonIdx + 1));
453
+ return { name, args };
454
+ });
455
+ }
456
+ // ─── renderTemplate ────────────────────────────────────────────────────────────
457
+ /**
458
+ * Renders all {{ ... }} expressions in a template string against the provided context.
459
+ * Supports pipe-filter syntax: {{ path | filter1: arg | filter2 }}
460
+ *
461
+ * - Strings: inserted as-is (after filter chain)
462
+ * - Objects/arrays: JSON.stringify with 2-space indent (no filters)
463
+ * - undefined/unresolvable or type_mismatch: left as {{ expression }}
464
+ * - unknown_filter in strict mode: throws UnknownFilterError
465
+ * - unknown_filter in lenient mode: leaves placeholder intact
466
+ *
467
+ * Handles the workflow.context.* namespace when workflowContext is provided.
468
+ */
469
+ export function renderTemplate(template, context, options) {
470
+ // Matches {{ path }} and {{ path | filter | filter: arg }} — allows any content except }}.
471
+ return template.replace(/\{\{\s*([^}]+?)\s*\}\}/g, (_match, expr) => {
472
+ const pipeIdx = expr.indexOf('|');
473
+ const hasFilters = pipeIdx !== -1;
474
+ // Extract just the path (the part before the first pipe, or the whole expr).
475
+ const rawPath = (hasFilters ? expr.slice(0, pipeIdx) : expr).trim();
476
+ const fullExpr = expr.trim();
477
+ // Workflow context namespace — handled before the generic path resolver.
478
+ if (rawPath.startsWith('workflow.context.') && context.workflowContext) {
479
+ if (!hasFilters) {
480
+ return resolveWorkflowContextRef(rawPath, context.workflowContext) ?? `{{ ${fullExpr} }}`;
481
+ }
482
+ }
483
+ // Generic path resolution — context.resources.* and run.params.*
484
+ const root = {
485
+ context: { resources: context.evidenceByStep },
486
+ run: { params: context.runParams },
487
+ };
488
+ const rawValue = rawPath.startsWith('workflow.context.') && context.workflowContext
489
+ ? resolveWorkflowContextRef(rawPath, context.workflowContext)
490
+ : resolvePath(rawPath, root);
491
+ if (!hasFilters) {
492
+ // Original coercion behaviour.
493
+ if (rawValue === undefined)
494
+ return `{{ ${fullExpr} }}`;
495
+ if (typeof rawValue === 'string')
496
+ return rawValue;
497
+ return JSON.stringify(rawValue, null, 2);
498
+ }
499
+ // Filter chain processing.
500
+ const filters = parseFilters(expr);
501
+ let current = rawValue;
502
+ for (const { name, args } of filters) {
503
+ const result = applyFilter(current, name, args);
504
+ if (!result.ok) {
505
+ if (result.reason === 'unknown_filter') {
506
+ if (options?.strict === true) {
507
+ throw new UnknownFilterError(result.filterName);
508
+ }
509
+ // Lenient: leave placeholder intact.
510
+ return `{{ ${fullExpr} }}`;
511
+ }
512
+ // type_mismatch: always leave placeholder intact.
513
+ return `{{ ${fullExpr} }}`;
514
+ }
515
+ current = result.value;
516
+ }
517
+ // After filter chain — coerce to string.
518
+ if (current === undefined || current === null)
519
+ return `{{ ${fullExpr} }}`;
520
+ if (typeof current === 'string')
521
+ return current;
522
+ return JSON.stringify(current, null, 2);
523
+ });
524
+ }
525
+ function resolveWorkflowContextRef(path, ctx) {
526
+ // path format: "workflow.context.NAME" or "workflow.context.NAME.raw"
527
+ const segments = path.split('.');
528
+ if (segments.length < 3)
529
+ return undefined;
530
+ const isRaw = segments[segments.length - 1] === 'raw';
531
+ // Name is everything between "workflow.context." and the optional ".raw"
532
+ const name = isRaw ? segments.slice(2, -1).join('.') : segments.slice(2).join('.');
533
+ const snapshot = ctx.snapshots[name];
534
+ if (!snapshot || snapshot.error !== undefined)
535
+ return undefined;
536
+ return isRaw ? snapshot.content : wrapContent(name, snapshot.content, ctx.wrapper);
537
+ }
538
+ function wrapContent(name, content, wrapper) {
539
+ switch (wrapper) {
540
+ case 'xml':
541
+ return `<${name}>\n${content}\n</${name}>`;
542
+ case 'brackets':
543
+ return `[${name}]\n${content}\n[/${name}]`;
544
+ case 'none':
545
+ return content;
546
+ }
547
+ }
548
+ //# sourceMappingURL=render-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-template.js","sourceRoot":"","sources":["../../src/engine/render-template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { WorkflowDefinition } from '../types/workflow-definition.js';
2
+ import type { BlockedReason } from '../types/response-envelope.js';
3
+ export declare class StateGuard {
4
+ private readonly allowed;
5
+ constructor(definition: WorkflowDefinition);
6
+ isAllowed(stepName: string, currentState: string): boolean;
7
+ getBlockedReason(stepName: string, currentState: string): BlockedReason;
8
+ getAllowedStates(stepName: string): string[];
9
+ /**
10
+ * Returns the names of all steps that are allowed from the given state.
11
+ * Used by the CLI to find which step to execute next.
12
+ */
13
+ getAllowedSteps(state: string): string[];
14
+ }
15
+ //# sourceMappingURL=state-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-guard.d.ts","sourceRoot":"","sources":["../../src/engine/state-guard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;gBAEvC,UAAU,EAAE,kBAAkB;IAO1C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO;IAM1D,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,aAAa;IAQvE,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAK5C;;;OAGG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CASzC"}
@@ -0,0 +1,40 @@
1
+ export class StateGuard {
2
+ allowed;
3
+ constructor(definition) {
4
+ this.allowed = new Map();
5
+ for (const [stepName, step] of Object.entries(definition.steps)) {
6
+ this.allowed.set(stepName, new Set(step.allowed_from_states));
7
+ }
8
+ }
9
+ isAllowed(stepName, currentState) {
10
+ const states = this.allowed.get(stepName);
11
+ if (states === undefined)
12
+ return false;
13
+ return states.has(currentState);
14
+ }
15
+ getBlockedReason(stepName, currentState) {
16
+ return {
17
+ current_state: currentState,
18
+ allowed_states: this.getAllowedStates(stepName),
19
+ suggestion: `Step '${stepName}' cannot execute from state '${currentState}'.`,
20
+ };
21
+ }
22
+ getAllowedStates(stepName) {
23
+ const states = this.allowed.get(stepName);
24
+ return states !== undefined ? [...states] : [];
25
+ }
26
+ /**
27
+ * Returns the names of all steps that are allowed from the given state.
28
+ * Used by the CLI to find which step to execute next.
29
+ */
30
+ getAllowedSteps(state) {
31
+ const allowed = [];
32
+ for (const [stepName, allowedSet] of this.allowed) {
33
+ if (allowedSet.has(state)) {
34
+ allowed.push(stepName);
35
+ }
36
+ }
37
+ return allowed;
38
+ }
39
+ }
40
+ //# sourceMappingURL=state-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-guard.js","sourceRoot":"","sources":["../../src/engine/state-guard.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,UAAU;IACJ,OAAO,CAA2B;IAEnD,YAAY,UAA8B;QACxC,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,SAAS,CAAC,QAAgB,EAAE,YAAoB;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACvC,OAAO,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC;IAED,gBAAgB,CAAC,QAAgB,EAAE,YAAoB;QACrD,OAAO;YACL,aAAa,EAAE,YAAY;YAC3B,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;YAC/C,UAAU,EAAE,SAAS,QAAQ,gCAAgC,YAAY,IAAI;SAC9E,CAAC;IACJ,CAAC;IAED,gBAAgB,CAAC,QAAgB;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,KAAa;QAC3B,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClD,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}