@agenticflow/cli 0.0.1-beta.13
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/README.md +125 -0
- package/TECHNICAL_DEBT.md +121 -0
- package/dist/builder/bundler.d.ts +17 -0
- package/dist/builder/bundler.d.ts.map +1 -0
- package/dist/builder/bundler.js +170 -0
- package/dist/builder/bundler.js.map +1 -0
- package/dist/builder/index.d.ts +6 -0
- package/dist/builder/index.d.ts.map +1 -0
- package/dist/builder/index.js +6 -0
- package/dist/builder/index.js.map +1 -0
- package/dist/builder/packager.d.ts +41 -0
- package/dist/builder/packager.d.ts.map +1 -0
- package/dist/builder/packager.js +145 -0
- package/dist/builder/packager.js.map +1 -0
- package/dist/builder/security.d.ts +26 -0
- package/dist/builder/security.d.ts.map +1 -0
- package/dist/builder/security.js +204 -0
- package/dist/builder/security.js.map +1 -0
- package/dist/builder/stripper.d.ts +19 -0
- package/dist/builder/stripper.d.ts.map +1 -0
- package/dist/builder/stripper.js +100 -0
- package/dist/builder/stripper.js.map +1 -0
- package/dist/builder/validator.d.ts +33 -0
- package/dist/builder/validator.d.ts.map +1 -0
- package/dist/builder/validator.js +150 -0
- package/dist/builder/validator.js.map +1 -0
- package/dist/cli/build.d.ts +3 -0
- package/dist/cli/build.d.ts.map +1 -0
- package/dist/cli/build.js +167 -0
- package/dist/cli/build.js.map +1 -0
- package/dist/cli/categories.d.ts +40 -0
- package/dist/cli/categories.d.ts.map +1 -0
- package/dist/cli/categories.js +101 -0
- package/dist/cli/categories.js.map +1 -0
- package/dist/cli/dev.d.ts +3 -0
- package/dist/cli/dev.d.ts.map +1 -0
- package/dist/cli/dev.js +226 -0
- package/dist/cli/dev.js.map +1 -0
- package/dist/cli/handler-types.d.ts +34 -0
- package/dist/cli/handler-types.d.ts.map +1 -0
- package/dist/cli/handler-types.js +67 -0
- package/dist/cli/handler-types.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +24 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +3 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +264 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/login.d.ts +3 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/login.js +10 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/cli/publish.d.ts +5 -0
- package/dist/cli/publish.d.ts.map +1 -0
- package/dist/cli/publish.js +120 -0
- package/dist/cli/publish.js.map +1 -0
- package/dist/cli/template-processor.d.ts +35 -0
- package/dist/cli/template-processor.d.ts.map +1 -0
- package/dist/cli/template-processor.js +82 -0
- package/dist/cli/template-processor.js.map +1 -0
- package/dist/cli/test.d.ts +3 -0
- package/dist/cli/test.d.ts.map +1 -0
- package/dist/cli/test.js +12 -0
- package/dist/cli/test.js.map +1 -0
- package/dist/dev/decorators.d.ts +10 -0
- package/dist/dev/decorators.d.ts.map +1 -0
- package/dist/dev/decorators.js +26 -0
- package/dist/dev/decorators.js.map +1 -0
- package/dist/dev/executor.d.ts +22 -0
- package/dist/dev/executor.d.ts.map +1 -0
- package/dist/dev/executor.js +243 -0
- package/dist/dev/executor.js.map +1 -0
- package/dist/dev/extractor.d.ts +15 -0
- package/dist/dev/extractor.d.ts.map +1 -0
- package/dist/dev/extractor.js +224 -0
- package/dist/dev/extractor.js.map +1 -0
- package/dist/dev/index.d.ts +3 -0
- package/dist/dev/index.d.ts.map +1 -0
- package/dist/dev/index.js +4 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/dev/server.d.ts +91 -0
- package/dist/dev/server.d.ts.map +1 -0
- package/dist/dev/server.js +507 -0
- package/dist/dev/server.js.map +1 -0
- package/dist/dev/ui-dist/assets/index-BkKxvzfq.js +246 -0
- package/dist/dev/ui-dist/assets/index-DTO1qt7B.css +1 -0
- package/dist/dev/ui-dist/index.html +14 -0
- package/dist/dev/ui-dist/monkey.svg +3 -0
- package/dist/dev/ui-dist/package.json +27 -0
- package/dist/templates/_shared/.env.template +16 -0
- package/dist/templates/_shared/.gitignore.template +46 -0
- package/dist/templates/_shared/LICENSE.template +21 -0
- package/dist/templates/_shared/src/utils.ts.template +29 -0
- package/dist/templates/_shared/tsconfig.json.template +23 -0
- package/dist/templates/stateful/manifest.json.template +63 -0
- package/dist/templates/stateful/package.json.template +23 -0
- package/dist/templates/stateful/src/index.ts.template +147 -0
- package/dist/templates/stateless/docs/README.md.template +102 -0
- package/dist/templates/stateless/manifest.json.template +63 -0
- package/dist/templates/stateless/package.json.template +23 -0
- package/dist/templates/stateless/src/index.ts.template +103 -0
- package/package.json +51 -0
- package/vitest.config.ts +15 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.absolute{position:absolute}.relative{position:relative}.bottom-0{bottom:0}.left-2\.5{left:.625rem}.left-4{left:1rem}.top-0{top:0}.col-span-2{grid-column:span 2 / span 2}.mx-auto{margin-left:auto;margin-right:auto}.-mb-px{margin-bottom:-1px}.-ml-1{margin-left:-.25rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-4{margin-left:1rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.flex{display:flex}.table{display:table}.grid{display:grid}.h-12{height:3rem}.h-2{height:.5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-4{height:1rem}.h-8{height:2rem}.h-full{height:100%}.max-h-32{max-height:8rem}.max-h-40{max-height:10rem}.max-h-64{max-height:16rem}.min-h-screen{min-height:100vh}.w-0\.5{width:.125rem}.w-1\/2{width:50%}.w-12{width:3rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-64{width:16rem}.w-8{width:2rem}.w-80{width:20rem}.w-full{width:100%}.max-w-3xl{max-width:48rem}.max-w-none{max-width:none}.flex-1{flex:1 1 0%}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-slate-100>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(241 245 249 / var(--tw-divide-opacity, 1))}.divide-slate-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(226 232 240 / var(--tw-divide-opacity, 1))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-2{border-width:2px}.border-4{border-width:4px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-none{border-style:none}.border-amber-200{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1))}.border-green-200{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.border-green-600{--tw-border-opacity: 1;border-color:rgb(22 163 74 / var(--tw-border-opacity, 1))}.border-primary-500{--tw-border-opacity: 1;border-color:rgb(14 165 233 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-slate-100{--tw-border-opacity: 1;border-color:rgb(241 245 249 / var(--tw-border-opacity, 1))}.border-slate-200{--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity, 1))}.border-slate-300{--tw-border-opacity: 1;border-color:rgb(203 213 225 / var(--tw-border-opacity, 1))}.border-slate-400{--tw-border-opacity: 1;border-color:rgb(148 163 184 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-white{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.border-t-transparent{border-top-color:transparent}.bg-amber-100{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-emerald-400{--tw-bg-opacity: 1;background-color:rgb(52 211 153 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-primary-100{--tw-bg-opacity: 1;background-color:rgb(224 242 254 / var(--tw-bg-opacity, 1))}.bg-primary-50{--tw-bg-opacity: 1;background-color:rgb(240 249 255 / var(--tw-bg-opacity, 1))}.bg-primary-600{--tw-bg-opacity: 1;background-color:rgb(2 132 199 / var(--tw-bg-opacity, 1))}.bg-red-400{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-slate-100{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.bg-slate-200{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity, 1))}.bg-slate-400{--tw-bg-opacity: 1;background-color:rgb(148 163 184 / var(--tw-bg-opacity, 1))}.bg-slate-50{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.bg-slate-700{--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity, 1))}.bg-slate-900{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-slate-900{--tw-gradient-from: #0f172a var(--tw-gradient-from-position);--tw-gradient-to: rgb(15 23 42 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-violet-500{--tw-gradient-from: #8b5cf6 var(--tw-gradient-from-position);--tw-gradient-to: rgb(139 92 246 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-purple-600{--tw-gradient-to: #9333ea var(--tw-gradient-to-position)}.to-slate-800{--tw-gradient-to: #1e293b var(--tw-gradient-to-position)}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-10{padding-left:2.5rem}.pl-2{padding-left:.5rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.tracking-tight{letter-spacing:-.025em}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-primary-600{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.text-primary-700{--tw-text-opacity: 1;color:rgb(3 105 161 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-red-800{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.text-slate-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-slate-700{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.text-slate-800{--tw-text-opacity: 1;color:rgb(30 41 59 / var(--tw-text-opacity, 1))}.text-violet-400{--tw-text-opacity: 1;color:rgb(167 139 250 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}:root{font-family:Inter,system-ui,Avenir,Helvetica,Arial,sans-serif;line-height:1.5;font-weight:400;color:#213547;background-color:#f8fafc}body{margin:0;min-width:320px;min-height:100vh}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:#f1f5f9;border-radius:4px}::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#94a3b8}.json-tree{font-family:Fira Code,Consolas,monospace;font-size:13px;line-height:1.4}.json-key{color:#0369a1}.json-string{color:#047857}.json-number{color:#b45309}.json-boolean{color:#7c3aed}.json-null{color:#6b7280}pre{background-color:#1e293b;color:#e2e8f0;padding:1rem;border-radius:.5rem;overflow-x:auto}code{font-family:Fira Code,Consolas,monospace;font-size:.875rem}.status-dot{width:8px;height:8px;border-radius:50%;display:inline-block}.status-connected{background-color:#22c55e;box-shadow:0 0 8px #22c55e}.status-disconnected{background-color:#ef4444}.status-loading{background-color:#f59e0b;animation:pulse 1.5s ease-in-out infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.hover\:border-slate-300:hover{--tw-border-opacity: 1;border-color:rgb(203 213 225 / var(--tw-border-opacity, 1))}.hover\:bg-green-50:hover{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.hover\:bg-green-700:hover{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.hover\:bg-primary-700:hover{--tw-bg-opacity: 1;background-color:rgb(3 105 161 / var(--tw-bg-opacity, 1))}.hover\:bg-red-50:hover{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-100:hover{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-50:hover{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-600:hover{--tw-bg-opacity: 1;background-color:rgb(71 85 105 / var(--tw-bg-opacity, 1))}.hover\:text-red-500:hover{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.hover\:text-slate-800:hover{--tw-text-opacity: 1;color:rgb(30 41 59 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.focus\:border-transparent:focus{border-color:transparent}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-primary-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(14 165 233 / var(--tw-ring-opacity, 1))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<link rel="icon" type="image/svg+xml" href="/monkey.svg" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
+
<title>afh dev</title>
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-BkKxvzfq.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/assets/index-DTO1qt7B.css">
|
|
10
|
+
</head>
|
|
11
|
+
<body>
|
|
12
|
+
<div id="root"></div>
|
|
13
|
+
</body>
|
|
14
|
+
</html>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "afh-dev-ui",
|
|
3
|
+
"private": true,
|
|
4
|
+
"version": "0.0.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "vite",
|
|
8
|
+
"build": "tsc && vite build",
|
|
9
|
+
"preview": "vite preview"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"lucide-react": "^0.300.0",
|
|
13
|
+
"react": "^18.2.0",
|
|
14
|
+
"react-dom": "^18.2.0",
|
|
15
|
+
"react-markdown": "^9.0.1"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@types/react": "^18.2.0",
|
|
19
|
+
"@types/react-dom": "^18.2.0",
|
|
20
|
+
"@vitejs/plugin-react": "^4.2.0",
|
|
21
|
+
"autoprefixer": "^10.4.16",
|
|
22
|
+
"postcss": "^8.4.32",
|
|
23
|
+
"tailwindcss": "^3.4.0",
|
|
24
|
+
"typescript": "^5.3.0",
|
|
25
|
+
"vite": "^5.0.0"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Environment variables for development
|
|
2
|
+
# This file is gitignored - add your secrets here
|
|
3
|
+
|
|
4
|
+
# Example API keys (uncomment and fill in as needed):
|
|
5
|
+
# API_KEY=your-api-key-here
|
|
6
|
+
# STRIPE_SECRET_KEY=sk_test_...
|
|
7
|
+
# SENDGRID_API_KEY=SG....
|
|
8
|
+
# OPENAI_API_KEY=sk-...
|
|
9
|
+
|
|
10
|
+
# Database URLs:
|
|
11
|
+
# DATABASE_URL=postgresql://user:pass@localhost/db
|
|
12
|
+
# REDIS_URL=redis://localhost:6379
|
|
13
|
+
|
|
14
|
+
# Other configuration:
|
|
15
|
+
# DEBUG=true
|
|
16
|
+
# LOG_LEVEL=info
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Dependencies
|
|
2
|
+
node_modules/
|
|
3
|
+
|
|
4
|
+
# Build output
|
|
5
|
+
dist/
|
|
6
|
+
*.tsbuildinfo
|
|
7
|
+
|
|
8
|
+
# Environment
|
|
9
|
+
.env
|
|
10
|
+
.env.local
|
|
11
|
+
.env.*.local
|
|
12
|
+
|
|
13
|
+
# afh development data
|
|
14
|
+
.afh/
|
|
15
|
+
|
|
16
|
+
# Logs
|
|
17
|
+
*.log
|
|
18
|
+
npm-debug.log*
|
|
19
|
+
yarn-debug.log*
|
|
20
|
+
yarn-error.log*
|
|
21
|
+
|
|
22
|
+
# Runtime data
|
|
23
|
+
pids
|
|
24
|
+
*.pid
|
|
25
|
+
*.seed
|
|
26
|
+
*.pid.lock
|
|
27
|
+
|
|
28
|
+
# Coverage directory used by tools like istanbul
|
|
29
|
+
coverage/
|
|
30
|
+
|
|
31
|
+
# nyc test coverage
|
|
32
|
+
.nyc_output
|
|
33
|
+
|
|
34
|
+
# OS generated files
|
|
35
|
+
.DS_Store
|
|
36
|
+
Thumbs.db
|
|
37
|
+
|
|
38
|
+
# Editor directories and files
|
|
39
|
+
.vscode/
|
|
40
|
+
.idea/
|
|
41
|
+
*.swp
|
|
42
|
+
*.swo
|
|
43
|
+
|
|
44
|
+
# Temporary files
|
|
45
|
+
*.tmp
|
|
46
|
+
*.temp
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) {{currentYear}} {{authorName}}
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Development utilities for {{displayName}}
|
|
3
|
+
*
|
|
4
|
+
* This file contains development-only code that is stripped at build time.
|
|
5
|
+
* The @TestValue decorator and this entire file are removed by `afh build`.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @TestValue decorator - provides default values for handler inputs during development.
|
|
10
|
+
*
|
|
11
|
+
* Use this to set test values that will be used when running `afh dev`.
|
|
12
|
+
* These decorators are automatically stripped from production builds.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* @Input({ type: 'string', source: 'vault', required: true })
|
|
17
|
+
* @TestValue(process.env.API_KEY || 'test-key')
|
|
18
|
+
* apiKey!: string;
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export function TestValue(value: any): PropertyDecorator {
|
|
22
|
+
return (target: any, propertyKey: string | symbol) => {
|
|
23
|
+
// Store test values on the constructor for runtime access during development
|
|
24
|
+
if (!target.constructor.__testValues) {
|
|
25
|
+
target.constructor.__testValues = {};
|
|
26
|
+
}
|
|
27
|
+
target.constructor.__testValues[propertyKey] = value;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "ES2022",
|
|
5
|
+
"moduleResolution": "bundler",
|
|
6
|
+
"lib": ["ES2022"],
|
|
7
|
+
"outDir": "dist",
|
|
8
|
+
"rootDir": "src",
|
|
9
|
+
"strict": true,
|
|
10
|
+
"esModuleInterop": true,
|
|
11
|
+
"allowSyntheticDefaultImports": true,
|
|
12
|
+
"skipLibCheck": true,
|
|
13
|
+
"forceConsistentCasingInFileNames": true,
|
|
14
|
+
"experimentalDecorators": true,
|
|
15
|
+
"emitDecoratorMetadata": true,
|
|
16
|
+
"resolveJsonModule": true,
|
|
17
|
+
"declaration": true,
|
|
18
|
+
"declarationMap": true,
|
|
19
|
+
"sourceMap": true
|
|
20
|
+
},
|
|
21
|
+
"include": ["src/**/*"],
|
|
22
|
+
"exclude": ["node_modules", "dist", ".afh"]
|
|
23
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://agenticflow.com/schemas/handler-manifest-v1.json",
|
|
3
|
+
"id": "{{handlerType}}",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"name": "{{displayName}}",
|
|
6
|
+
"description": "{{description}}",
|
|
7
|
+
"longDescription": "# {{displayName}}\n\n{{description}}\n\n## Features\n\n- Easy to configure\n- Reliable processing\n- Well documented\n- Stateful execution with checkpoints\n- Pause and resume capabilities\n\n## Usage\n\nAdd detailed usage instructions here.",
|
|
8
|
+
|
|
9
|
+
"author": {
|
|
10
|
+
"name": "{{authorName}}",
|
|
11
|
+
"email": "{{authorEmail}}"
|
|
12
|
+
},
|
|
13
|
+
|
|
14
|
+
"handler": {
|
|
15
|
+
"type": "{{handlerType}}",
|
|
16
|
+
"category": "{{category}}",
|
|
17
|
+
"stateful": true,
|
|
18
|
+
"timeout": 30000,
|
|
19
|
+
"retryable": true
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
"inputs": [
|
|
23
|
+
{
|
|
24
|
+
"property": "exampleInput",
|
|
25
|
+
"type": "string",
|
|
26
|
+
"source": "config",
|
|
27
|
+
"required": true,
|
|
28
|
+
"description": "An example input parameter",
|
|
29
|
+
"placeholder": "Enter your value here"
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
|
|
33
|
+
"outputs": [
|
|
34
|
+
{
|
|
35
|
+
"property": "result",
|
|
36
|
+
"type": "string",
|
|
37
|
+
"description": "The processing result"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"property": "status",
|
|
41
|
+
"type": "string",
|
|
42
|
+
"description": "Processing status"
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
|
|
46
|
+
"visual": {
|
|
47
|
+
"icon": "assets/icon.png",
|
|
48
|
+
"color": "{{categoryColor}}",
|
|
49
|
+
"tags": ["{{handlerTypeFirstWord}}", "{{category}}", "stateful"]
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
"marketplace": {
|
|
53
|
+
"pricing": "free",
|
|
54
|
+
"license": "MIT",
|
|
55
|
+
"repository": "https://github.com/{{authorGitHub}}/{{handlerType}}",
|
|
56
|
+
"homepage": "https://docs.example.com/{{handlerType}}"
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
"requirements": {
|
|
60
|
+
"agenticflow": ">=0.0.1",
|
|
61
|
+
"node": ">=18.0.0"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{handlerType}}",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "{{description}}",
|
|
5
|
+
"main": "src/index.ts",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"dev": "afh dev",
|
|
9
|
+
"test": "afh test",
|
|
10
|
+
"build": "afh build",
|
|
11
|
+
"publish": "afh publish"
|
|
12
|
+
},
|
|
13
|
+
"keywords": ["{{handlerTypeFirstWord}}", "{{category}}", "agenticflow", "handler", "stateful"],
|
|
14
|
+
"author": "{{authorName}} <{{authorEmail}}>",
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@flowmonkey/core": "^0.0.1"
|
|
18
|
+
},
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"typescript": "^5.0.0",
|
|
21
|
+
"@types/node": "^20.0.0"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { Handler, Input, StatefulHandler, StepResult } from '@flowmonkey/core';
|
|
2
|
+
import { TestValue } from './utils'; // Local re-export, stripped at build time
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Input interface for {{displayName}}
|
|
6
|
+
* Define all your input properties here
|
|
7
|
+
*/
|
|
8
|
+
interface {{handlerClassName}}Input {
|
|
9
|
+
exampleInput: string;
|
|
10
|
+
// Add more inputs as needed
|
|
11
|
+
// apiKey?: string;
|
|
12
|
+
// amount?: number;
|
|
13
|
+
// options?: { [key: string]: any };
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Output interface for {{displayName}}
|
|
18
|
+
* Define all your output properties here
|
|
19
|
+
*/
|
|
20
|
+
interface {{handlerClassName}}Output {
|
|
21
|
+
result: string;
|
|
22
|
+
status: string;
|
|
23
|
+
// Add more outputs as needed
|
|
24
|
+
// processedAt?: string;
|
|
25
|
+
// metadata?: { [key: string]: any };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Checkpoint interface for {{displayName}}
|
|
30
|
+
* Define your checkpoint data structure here
|
|
31
|
+
*/
|
|
32
|
+
interface {{handlerClassName}}Checkpoint {
|
|
33
|
+
step: string;
|
|
34
|
+
processedData?: string;
|
|
35
|
+
// Add more checkpoint properties as needed
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* {{displayName}}
|
|
40
|
+
*
|
|
41
|
+
* {{description}}
|
|
42
|
+
*
|
|
43
|
+
* This handler maintains state via checkpoints and can be paused/resumed.
|
|
44
|
+
*/
|
|
45
|
+
@Handler({
|
|
46
|
+
type: '{{handlerType}}',
|
|
47
|
+
name: '{{displayName}}',
|
|
48
|
+
category: '{{categoryApi}}',
|
|
49
|
+
stateful: true,
|
|
50
|
+
})
|
|
51
|
+
export class {{handlerClassName}} extends StatefulHandler<{{handlerClassName}}Input, {{handlerClassName}}Output, unknown, {{handlerClassName}}Checkpoint> {
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Example input with test value for development
|
|
55
|
+
* The @TestValue decorator provides a default value during development
|
|
56
|
+
* and is automatically stripped from production builds
|
|
57
|
+
*/
|
|
58
|
+
@Input({
|
|
59
|
+
type: 'string',
|
|
60
|
+
source: 'config',
|
|
61
|
+
required: true,
|
|
62
|
+
description: 'An example input parameter'
|
|
63
|
+
})
|
|
64
|
+
@TestValue('example-test-value') // This will be stripped at build time
|
|
65
|
+
exampleInput!: string;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Example for API key from vault
|
|
69
|
+
* Uncomment and modify as needed
|
|
70
|
+
*/
|
|
71
|
+
// @Input({
|
|
72
|
+
// type: 'string',
|
|
73
|
+
// source: 'vault',
|
|
74
|
+
// vaultPath: 'secrets.myservice.apiKey',
|
|
75
|
+
// required: true,
|
|
76
|
+
// description: 'API key for external service'
|
|
77
|
+
// })
|
|
78
|
+
// @TestValue(process.env.API_KEY || 'test-api-key')
|
|
79
|
+
// apiKey!: string;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Main execution method
|
|
83
|
+
* This is where your handler logic goes
|
|
84
|
+
*/
|
|
85
|
+
async execute(): Promise<StepResult> {
|
|
86
|
+
try {
|
|
87
|
+
// Restore checkpoint if one exists
|
|
88
|
+
const checkpoint = await this.getCheckpoint();
|
|
89
|
+
const currentStep = checkpoint?.step ?? 'processing';
|
|
90
|
+
|
|
91
|
+
// Your handler logic here
|
|
92
|
+
console.log(`Processing input: ${this.exampleInput}`);
|
|
93
|
+
console.log(`Current step: ${currentStep}`);
|
|
94
|
+
|
|
95
|
+
// Example multi-step processing
|
|
96
|
+
switch (currentStep) {
|
|
97
|
+
case 'processing': {
|
|
98
|
+
// Step 1: Process the input
|
|
99
|
+
const processedData = `Processed: ${this.exampleInput}`;
|
|
100
|
+
|
|
101
|
+
// Report progress
|
|
102
|
+
await this.reportProgress(50, 'Processing complete, finalizing...');
|
|
103
|
+
|
|
104
|
+
// Save checkpoint before continuing
|
|
105
|
+
await this.checkpoint({
|
|
106
|
+
step: 'finalizing',
|
|
107
|
+
processedData
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// Return success to continue to next tick
|
|
111
|
+
return this.success({ result: 'processing', status: 'in_progress' });
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
case 'finalizing': {
|
|
115
|
+
// Step 2: Finalize the result
|
|
116
|
+
const result = `Final: ${checkpoint?.processedData}`;
|
|
117
|
+
|
|
118
|
+
// Report completion
|
|
119
|
+
await this.reportProgress(100, 'Complete');
|
|
120
|
+
|
|
121
|
+
// Return success with final output
|
|
122
|
+
return this.success({
|
|
123
|
+
result: result,
|
|
124
|
+
status: 'completed'
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
default:
|
|
129
|
+
throw new Error(`Unknown step: ${currentStep}`);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
} catch (error) {
|
|
133
|
+
// Return failure with error information
|
|
134
|
+
// failure(code, message, details?)
|
|
135
|
+
return this.failure(
|
|
136
|
+
'EXECUTION_ERROR',
|
|
137
|
+
error instanceof Error ? error.message : 'Unknown error occurred',
|
|
138
|
+
{
|
|
139
|
+
input: this.exampleInput
|
|
140
|
+
}
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Export an instance for the AgenticFlow runtime
|
|
147
|
+
export default new {{handlerClassName}}();
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# {{displayName}}
|
|
2
|
+
|
|
3
|
+
{{description}}
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
This stateless handler {{description}}
|
|
8
|
+
|
|
9
|
+
## Development
|
|
10
|
+
|
|
11
|
+
### Prerequisites
|
|
12
|
+
|
|
13
|
+
- Node.js 18+
|
|
14
|
+
- npm or yarn
|
|
15
|
+
|
|
16
|
+
### Getting Started
|
|
17
|
+
|
|
18
|
+
1. Install dependencies:
|
|
19
|
+
```bash
|
|
20
|
+
npm install
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
2. Set up environment variables:
|
|
24
|
+
```bash
|
|
25
|
+
cp .env .env.local
|
|
26
|
+
# Edit .env.local with your API keys
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
3. Start development server:
|
|
30
|
+
```bash
|
|
31
|
+
afh dev
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
4. Open http://localhost:3000 to access the development UI
|
|
35
|
+
|
|
36
|
+
### Configuration
|
|
37
|
+
|
|
38
|
+
The handler accepts the following inputs:
|
|
39
|
+
|
|
40
|
+
- **exampleInput** (string, required): An example input parameter
|
|
41
|
+
|
|
42
|
+
Add your specific inputs in `manifest.json` and update the TypeScript interfaces in `src/index.ts`.
|
|
43
|
+
|
|
44
|
+
### Testing
|
|
45
|
+
|
|
46
|
+
Run tests with:
|
|
47
|
+
```bash
|
|
48
|
+
afh test
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Building
|
|
52
|
+
|
|
53
|
+
Create a production build:
|
|
54
|
+
```bash
|
|
55
|
+
afh build
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
This will create a `.afh` package file ready for deployment.
|
|
59
|
+
|
|
60
|
+
### Publishing
|
|
61
|
+
|
|
62
|
+
Publish to the AgenticFlow marketplace:
|
|
63
|
+
```bash
|
|
64
|
+
afh login
|
|
65
|
+
afh publish
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Project Structure
|
|
69
|
+
|
|
70
|
+
- `src/index.ts` - Main handler implementation
|
|
71
|
+
- `manifest.json` - Handler metadata and configuration
|
|
72
|
+
- `assets/` - Icons and visual resources
|
|
73
|
+
- `docs/` - Documentation
|
|
74
|
+
- `examples/` - Test configurations
|
|
75
|
+
- `.env` - Environment variables (gitignored)
|
|
76
|
+
|
|
77
|
+
## API Reference
|
|
78
|
+
|
|
79
|
+
### Inputs
|
|
80
|
+
|
|
81
|
+
| Property | Type | Source | Required | Description |
|
|
82
|
+
|----------|------|--------|----------|-------------|
|
|
83
|
+
| exampleInput | string | config | ✅ | An example input parameter |
|
|
84
|
+
|
|
85
|
+
### Outputs
|
|
86
|
+
|
|
87
|
+
| Property | Type | Description |
|
|
88
|
+
|----------|------|-------------|
|
|
89
|
+
| result | string | The processing result |
|
|
90
|
+
| status | string | Processing status |
|
|
91
|
+
|
|
92
|
+
## Contributing
|
|
93
|
+
|
|
94
|
+
1. Fork the repository
|
|
95
|
+
2. Create a feature branch
|
|
96
|
+
3. Make your changes
|
|
97
|
+
4. Add tests
|
|
98
|
+
5. Submit a pull request
|
|
99
|
+
|
|
100
|
+
## License
|
|
101
|
+
|
|
102
|
+
MIT - see LICENSE file for details
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://agenticflow.com/schemas/handler-manifest-v1.json",
|
|
3
|
+
"id": "{{handlerType}}",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"name": "{{displayName}}",
|
|
6
|
+
"description": "{{description}}",
|
|
7
|
+
"longDescription": "# {{displayName}}\n\n{{description}}\n\n## Features\n\n- Easy to configure\n- Reliable processing\n- Well documented\n\n## Usage\n\nAdd detailed usage instructions here.",
|
|
8
|
+
|
|
9
|
+
"author": {
|
|
10
|
+
"name": "{{authorName}}",
|
|
11
|
+
"email": "{{authorEmail}}"
|
|
12
|
+
},
|
|
13
|
+
|
|
14
|
+
"handler": {
|
|
15
|
+
"type": "{{handlerType}}",
|
|
16
|
+
"category": "{{category}}",
|
|
17
|
+
"stateful": {{isStateful}},
|
|
18
|
+
"timeout": 30000,
|
|
19
|
+
"retryable": true
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
"inputs": [
|
|
23
|
+
{
|
|
24
|
+
"property": "exampleInput",
|
|
25
|
+
"type": "string",
|
|
26
|
+
"source": "config",
|
|
27
|
+
"required": true,
|
|
28
|
+
"description": "An example input parameter",
|
|
29
|
+
"placeholder": "Enter your value here"
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
|
|
33
|
+
"outputs": [
|
|
34
|
+
{
|
|
35
|
+
"property": "result",
|
|
36
|
+
"type": "string",
|
|
37
|
+
"description": "The processing result"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"property": "status",
|
|
41
|
+
"type": "string",
|
|
42
|
+
"description": "Processing status"
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
|
|
46
|
+
"visual": {
|
|
47
|
+
"icon": "assets/icon.png",
|
|
48
|
+
"color": "{{categoryColor}}",
|
|
49
|
+
"tags": ["{{handlerTypeFirstWord}}", "{{category}}"]
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
"marketplace": {
|
|
53
|
+
"pricing": "free",
|
|
54
|
+
"license": "MIT",
|
|
55
|
+
"repository": "https://github.com/{{authorGitHub}}/{{handlerType}}",
|
|
56
|
+
"homepage": "https://docs.example.com/{{handlerType}}"
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
"requirements": {
|
|
60
|
+
"agenticflow": ">=0.0.1",
|
|
61
|
+
"node": ">=18.0.0"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{handlerType}}",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "{{description}}",
|
|
5
|
+
"main": "src/index.ts",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"dev": "afh dev",
|
|
9
|
+
"test": "afh test",
|
|
10
|
+
"build": "afh build",
|
|
11
|
+
"publish": "afh publish"
|
|
12
|
+
},
|
|
13
|
+
"keywords": ["{{handlerTypeFirstWord}}", "{{category}}", "agenticflow", "handler"],
|
|
14
|
+
"author": "{{authorName}} <{{authorEmail}}>",
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@flowmonkey/core": "^0.0.1"
|
|
18
|
+
},
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"typescript": "^5.0.0",
|
|
21
|
+
"@types/node": "^20.0.0"
|
|
22
|
+
}
|
|
23
|
+
}
|