@loopstack/hitl-examples 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +165 -0
- package/dist/hitl-examples.module.d.ts +3 -0
- package/dist/hitl-examples.module.d.ts.map +1 -0
- package/dist/hitl-examples.module.js +52 -0
- package/dist/hitl-examples.module.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/workflows/agent-ask-clarification/agent-ask-clarification-example.workflow.d.ts +9 -0
- package/dist/workflows/agent-ask-clarification/agent-ask-clarification-example.workflow.d.ts.map +1 -0
- package/dist/workflows/agent-ask-clarification/agent-ask-clarification-example.workflow.js +69 -0
- package/dist/workflows/agent-ask-clarification/agent-ask-clarification-example.workflow.js.map +1 -0
- package/dist/workflows/agent-ask-for-approval/agent-ask-for-approval-example.workflow.d.ts +9 -0
- package/dist/workflows/agent-ask-for-approval/agent-ask-for-approval-example.workflow.d.ts.map +1 -0
- package/dist/workflows/agent-ask-for-approval/agent-ask-for-approval-example.workflow.js +67 -0
- package/dist/workflows/agent-ask-for-approval/agent-ask-for-approval-example.workflow.js.map +1 -0
- package/dist/workflows/ask-user-confirm/ask-user-confirm-example.workflow.d.ts +11 -0
- package/dist/workflows/ask-user-confirm/ask-user-confirm-example.workflow.d.ts.map +1 -0
- package/dist/workflows/ask-user-confirm/ask-user-confirm-example.workflow.js +61 -0
- package/dist/workflows/ask-user-confirm/ask-user-confirm-example.workflow.js.map +1 -0
- package/dist/workflows/ask-user-options/ask-user-options-example.workflow.d.ts +11 -0
- package/dist/workflows/ask-user-options/ask-user-options-example.workflow.d.ts.map +1 -0
- package/dist/workflows/ask-user-options/ask-user-options-example.workflow.js +68 -0
- package/dist/workflows/ask-user-options/ask-user-options-example.workflow.js.map +1 -0
- package/dist/workflows/ask-user-text/ask-user-text-example.workflow.d.ts +11 -0
- package/dist/workflows/ask-user-text/ask-user-text-example.workflow.d.ts.map +1 -0
- package/dist/workflows/ask-user-text/ask-user-text-example.workflow.js +60 -0
- package/dist/workflows/ask-user-text/ask-user-text-example.workflow.js.map +1 -0
- package/dist/workflows/confirm-content/confirm-content-example.workflow.d.ts +16 -0
- package/dist/workflows/confirm-content/confirm-content-example.workflow.d.ts.map +1 -0
- package/dist/workflows/confirm-content/confirm-content-example.workflow.js +68 -0
- package/dist/workflows/confirm-content/confirm-content-example.workflow.js.map +1 -0
- package/dist/workflows/inline-form/feedback-form-document.d.ts +10 -0
- package/dist/workflows/inline-form/feedback-form-document.d.ts.map +1 -0
- package/dist/workflows/inline-form/feedback-form-document.js +27 -0
- package/dist/workflows/inline-form/feedback-form-document.js.map +1 -0
- package/dist/workflows/inline-form/feedback-form-document.yaml +13 -0
- package/dist/workflows/inline-form/inline-form-example.workflow.d.ts +11 -0
- package/dist/workflows/inline-form/inline-form-example.workflow.d.ts.map +1 -0
- package/dist/workflows/inline-form/inline-form-example.workflow.js +54 -0
- package/dist/workflows/inline-form/inline-form-example.workflow.js.map +1 -0
- package/dist/workflows/meeting-notes/documents/meeting-notes-document.d.ts +8 -0
- package/dist/workflows/meeting-notes/documents/meeting-notes-document.d.ts.map +1 -0
- package/dist/workflows/meeting-notes/documents/meeting-notes-document.js +25 -0
- package/dist/workflows/meeting-notes/documents/meeting-notes-document.js.map +1 -0
- package/dist/workflows/meeting-notes/documents/meeting-notes-document.yaml +10 -0
- package/dist/workflows/meeting-notes/documents/optimized-notes-document.d.ts +16 -0
- package/dist/workflows/meeting-notes/documents/optimized-notes-document.d.ts.map +1 -0
- package/dist/workflows/meeting-notes/documents/optimized-notes-document.js +33 -0
- package/dist/workflows/meeting-notes/documents/optimized-notes-document.js.map +1 -0
- package/dist/workflows/meeting-notes/documents/optimized-notes-document.yaml +33 -0
- package/dist/workflows/meeting-notes/meeting-notes-example.workflow.d.ts +24 -0
- package/dist/workflows/meeting-notes/meeting-notes-example.workflow.d.ts.map +1 -0
- package/dist/workflows/meeting-notes/meeting-notes-example.workflow.js +86 -0
- package/dist/workflows/meeting-notes/meeting-notes-example.workflow.js.map +1 -0
- package/dist/workflows/meeting-notes/templates/extract-notes.md +5 -0
- package/dist/workflows/prompt-input-chat/prompt-input-chat-example.workflow.d.ts +8 -0
- package/dist/workflows/prompt-input-chat/prompt-input-chat-example.workflow.d.ts.map +1 -0
- package/dist/workflows/prompt-input-chat/prompt-input-chat-example.workflow.js +56 -0
- package/dist/workflows/prompt-input-chat/prompt-input-chat-example.workflow.js.map +1 -0
- package/dist/workflows/prompt-input-chat/prompt-input-chat-example.workflow.yaml +6 -0
- package/package.json +55 -0
- package/src/hitl-examples.module.ts +40 -0
- package/src/index.ts +16 -0
- package/src/workflows/agent-ask-clarification/agent-ask-clarification-example.workflow.ts +48 -0
- package/src/workflows/agent-ask-for-approval/agent-ask-for-approval-example.workflow.ts +47 -0
- package/src/workflows/ask-user-confirm/ask-user-confirm-example.workflow.ts +40 -0
- package/src/workflows/ask-user-options/ask-user-options-example.workflow.ts +48 -0
- package/src/workflows/ask-user-text/ask-user-text-example.workflow.ts +39 -0
- package/src/workflows/confirm-content/confirm-content-example.workflow.ts +49 -0
- package/src/workflows/inline-form/feedback-form-document.ts +16 -0
- package/src/workflows/inline-form/feedback-form-document.yaml +13 -0
- package/src/workflows/inline-form/inline-form-example.workflow.ts +37 -0
- package/src/workflows/meeting-notes/documents/meeting-notes-document.ts +14 -0
- package/src/workflows/meeting-notes/documents/meeting-notes-document.yaml +10 -0
- package/src/workflows/meeting-notes/documents/optimized-notes-document.ts +22 -0
- package/src/workflows/meeting-notes/documents/optimized-notes-document.yaml +33 -0
- package/src/workflows/meeting-notes/meeting-notes-example.workflow.ts +75 -0
- package/src/workflows/meeting-notes/templates/extract-notes.md +5 -0
- package/src/workflows/prompt-input-chat/prompt-input-chat-example.workflow.ts +30 -0
- package/src/workflows/prompt-input-chat/prompt-input-chat-example.workflow.yaml +6 -0
package/README.md
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: HITL Examples
|
|
3
|
+
description: Workflow examples for Human-in-the-Loop patterns in Loopstack — custom Document with a form widget, AskUserWorkflow / ConfirmUserWorkflow sub-workflow shortcuts, LLM agent loops with ask_clarification / ask_for_approval, and an end-to-end meeting-notes review flow.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# @loopstack/hitl-examples
|
|
7
|
+
|
|
8
|
+
> Human-in-the-Loop workflow examples for the [Loopstack](https://loopstack.ai) automation framework.
|
|
9
|
+
|
|
10
|
+
Side-by-side examples of every way to pause a Loopstack workflow for the user. The point of this package is to answer one question: **when do I design a custom document with a widget, vs. delegate to a HITL sub-workflow, vs. let an LLM agent ask the user?**
|
|
11
|
+
|
|
12
|
+
## Decision matrix
|
|
13
|
+
|
|
14
|
+
| You are building... | Use | Examples |
|
|
15
|
+
| --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ |
|
|
16
|
+
| A predefined workflow with known user-input steps — form fields, structured data, a record the user edits | **Custom document with a widget** — your workflow owns the document and the `wait: true` transition | Inline Form, Prompt Input Chat, Meeting Notes |
|
|
17
|
+
| An LLM agent loop where the LLM dynamically decides to ask the user something or request approval | **Agent tools** `ask_clarification` / `ask_for_approval` from `@loopstack/hitl` | Agent Ask Clarification, Agent Ask For Approval |
|
|
18
|
+
| A predefined workflow that just needs a quick generic ask — one free-text field, yes/no, pick-one — and you don't want to design a form | **Sub-workflow shortcut** — `AskUserWorkflow` / `ConfirmUserWorkflow` from `@loopstack/hitl` | Ask User Text, Ask User Options, Ask User Confirm, Confirm Content |
|
|
19
|
+
|
|
20
|
+
## Install as Source (Recommended)
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npx giget@latest gh:loopstack-ai/loopstack/registry/examples/hitl-examples src/hitl-examples
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Then register the module in your app:
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
import { Module } from '@nestjs/common';
|
|
30
|
+
import { LoopstackModule } from '@loopstack/loopstack-module';
|
|
31
|
+
import { HitlExamplesModule } from './hitl-examples/hitl-examples.module';
|
|
32
|
+
|
|
33
|
+
@Module({
|
|
34
|
+
imports: [LoopstackModule.forRoot(), HitlExamplesModule],
|
|
35
|
+
})
|
|
36
|
+
export class AppModule {}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Install as a Dependency
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
npm install @loopstack/hitl-examples
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
import { HitlExamplesModule } from '@loopstack/hitl-examples';
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Environment
|
|
50
|
+
|
|
51
|
+
The agent and meeting-notes examples require Claude credentials:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
ANTHROPIC_API_KEY=sk-ant-...
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
The non-agent examples (Inline Form, Prompt Input Chat, Ask User \*, Confirm Content) work without any LLM provider.
|
|
58
|
+
|
|
59
|
+
## Examples
|
|
60
|
+
|
|
61
|
+
| Example | Studio title | Description |
|
|
62
|
+
| --------------------------------------------------- | ---------------------------------------- | ------------------------------------------------------------------------------------- |
|
|
63
|
+
| [Inline Form](#inline-form) | `HITL - Inline Form Example` | Custom Document with a form widget, `wait: true` payload typed by the document schema |
|
|
64
|
+
| [Prompt Input Chat](#prompt-input-chat) | `HITL - Prompt Input Chat Example` | Workflow-level prompt-input widget; loops on user messages without an LLM |
|
|
65
|
+
| [Ask User Text](#ask-user-text) | `HITL - Ask User Text Example` | `AskUserWorkflow` for a generic free-text question |
|
|
66
|
+
| [Ask User Options](#ask-user-options) | `HITL - Ask User Options Example` | `AskUserWorkflow` with `mode: 'options'` and `allowCustomAnswer` |
|
|
67
|
+
| [Ask User Confirm](#ask-user-confirm) | `HITL - Ask User Confirm Example` | `AskUserWorkflow` with `mode: 'confirm'` for yes/no decisions |
|
|
68
|
+
| [Confirm Content](#confirm-content) | `HITL - Confirm Content Example` | `ConfirmUserWorkflow` to show a pre-rendered markdown blob for explicit approval |
|
|
69
|
+
| [Agent Ask Clarification](#agent-ask-clarification) | `HITL - Agent Ask Clarification Example` | LLM agent with `ask_clarification` tool — pauses to request missing info |
|
|
70
|
+
| [Agent Ask For Approval](#agent-ask-for-approval) | `HITL - Agent Ask For Approval Example` | LLM agent with `ask_for_approval` tool — drafts content and pauses for confirm/deny |
|
|
71
|
+
| [Meeting Notes](#meeting-notes) | `HITL - Meeting Notes Example` | End-to-end document-review flow: user notes → LLM-extracted structure → user approval |
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Inline Form
|
|
76
|
+
|
|
77
|
+
The workflow owns a `FeedbackFormDocument` whose schema doubles as the `wait: true` transition payload. The form's Submit button triggers the transition with typed data — no wrapping or unpacking.
|
|
78
|
+
|
|
79
|
+
### Files
|
|
80
|
+
|
|
81
|
+
- `inline-form-example.workflow.ts` — workflow class
|
|
82
|
+
- `feedback-form-document.ts` — `@Document` with Zod schema
|
|
83
|
+
- `feedback-form-document.yaml` — form widget definition
|
|
84
|
+
|
|
85
|
+
## Prompt Input Chat
|
|
86
|
+
|
|
87
|
+
Workflow-level `widget: prompt-input` with `enabledWhen: [waiting_for_user]`. Loops on user messages and echoes them back — no LLM and no sub-workflow involved. Demonstrates the chat-style entry pattern that LLM agent loops are built on.
|
|
88
|
+
|
|
89
|
+
### Files
|
|
90
|
+
|
|
91
|
+
- `prompt-input-chat-example.workflow.ts` — workflow class
|
|
92
|
+
- `prompt-input-chat-example.workflow.yaml` — workflow-level prompt-input widget
|
|
93
|
+
|
|
94
|
+
## Ask User Text
|
|
95
|
+
|
|
96
|
+
Delegate a generic free-text question to `AskUserWorkflow`. The parent workflow only owns the callback transition that receives the answer. Use the inline-form pattern instead when you need a structured form.
|
|
97
|
+
|
|
98
|
+
### Files
|
|
99
|
+
|
|
100
|
+
- `ask-user-text-example.workflow.ts` — workflow class
|
|
101
|
+
|
|
102
|
+
## Ask User Options
|
|
103
|
+
|
|
104
|
+
Delegate a "pick one from a list" question to `AskUserWorkflow` with `mode: 'options'`. `allowCustomAnswer: true` adds a free-text field next to the choices.
|
|
105
|
+
|
|
106
|
+
### Files
|
|
107
|
+
|
|
108
|
+
- `ask-user-options-example.workflow.ts` — workflow class
|
|
109
|
+
|
|
110
|
+
## Ask User Confirm
|
|
111
|
+
|
|
112
|
+
Delegate a yes/no decision to `AskUserWorkflow` with `mode: 'confirm'`. The answer comes back as the literal string `'yes'` or `'no'`.
|
|
113
|
+
|
|
114
|
+
### Files
|
|
115
|
+
|
|
116
|
+
- `ask-user-confirm-example.workflow.ts` — workflow class
|
|
117
|
+
|
|
118
|
+
## Confirm Content
|
|
119
|
+
|
|
120
|
+
Hand a pre-rendered markdown blob to `ConfirmUserWorkflow` for a user-facing review. The callback receives `{ confirmed: boolean, markdown: string }`. Useful for showing a release plan, summary, or diff for explicit approval.
|
|
121
|
+
|
|
122
|
+
### Files
|
|
123
|
+
|
|
124
|
+
- `confirm-content-example.workflow.ts` — workflow class
|
|
125
|
+
|
|
126
|
+
## Agent Ask Clarification
|
|
127
|
+
|
|
128
|
+
Launches `AgentWorkflow` with `tools: ['ask_clarification']`. When the LLM lacks information, it issues an `ask_clarification` tool call — the loop pauses and prompts the user, then the answer flows back into the agent context.
|
|
129
|
+
|
|
130
|
+
### Files
|
|
131
|
+
|
|
132
|
+
- `agent-ask-clarification-example.workflow.ts` — workflow class
|
|
133
|
+
|
|
134
|
+
## Agent Ask For Approval
|
|
135
|
+
|
|
136
|
+
Launches `AgentWorkflow` with `tools: ['ask_for_approval']`. The LLM drafts content (release notes, in this example), then calls `ask_for_approval` with the markdown — the loop pauses until the user explicitly confirms or denies.
|
|
137
|
+
|
|
138
|
+
### Files
|
|
139
|
+
|
|
140
|
+
- `agent-ask-for-approval-example.workflow.ts` — workflow class
|
|
141
|
+
|
|
142
|
+
## Meeting Notes
|
|
143
|
+
|
|
144
|
+
A complete HITL document-review flow:
|
|
145
|
+
|
|
146
|
+
1. Save a `MeetingNotesDocument` with the user's raw notes (form widget for edits)
|
|
147
|
+
2. User reviews/edits and submits via `wait: true` transition
|
|
148
|
+
3. `LlmGenerateObjectTool` extracts structured data via Zod schema
|
|
149
|
+
4. Save `OptimizedNotesDocument` for the user to review/approve
|
|
150
|
+
5. Final approval via second `wait: true` transition
|
|
151
|
+
|
|
152
|
+
Combines custom documents, LLM-driven structured output, and two HITL review steps.
|
|
153
|
+
|
|
154
|
+
### Files
|
|
155
|
+
|
|
156
|
+
- `meeting-notes-example.workflow.ts` — workflow class
|
|
157
|
+
- `documents/meeting-notes-document.{ts,yaml}` — input form document
|
|
158
|
+
- `documents/optimized-notes-document.{ts,yaml}` — structured output document
|
|
159
|
+
- `templates/extract-notes.md` — LLM prompt template
|
|
160
|
+
|
|
161
|
+
## About
|
|
162
|
+
|
|
163
|
+
Author: [Jakob Klippel](https://www.linkedin.com/in/jakob-klippel/)
|
|
164
|
+
|
|
165
|
+
License: MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hitl-examples.module.d.ts","sourceRoot":"","sources":["../src/hitl-examples.module.ts"],"names":[],"mappings":"AA8BA,qBASa,kBAAkB;CAAG"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.HitlExamplesModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const agent_1 = require("@loopstack/agent");
|
|
12
|
+
const claude_module_1 = require("@loopstack/claude-module");
|
|
13
|
+
const common_2 = require("@loopstack/common");
|
|
14
|
+
const hitl_1 = require("@loopstack/hitl");
|
|
15
|
+
const agent_ask_clarification_example_workflow_1 = require("./workflows/agent-ask-clarification/agent-ask-clarification-example.workflow");
|
|
16
|
+
const agent_ask_for_approval_example_workflow_1 = require("./workflows/agent-ask-for-approval/agent-ask-for-approval-example.workflow");
|
|
17
|
+
const ask_user_confirm_example_workflow_1 = require("./workflows/ask-user-confirm/ask-user-confirm-example.workflow");
|
|
18
|
+
const ask_user_options_example_workflow_1 = require("./workflows/ask-user-options/ask-user-options-example.workflow");
|
|
19
|
+
const ask_user_text_example_workflow_1 = require("./workflows/ask-user-text/ask-user-text-example.workflow");
|
|
20
|
+
const confirm_content_example_workflow_1 = require("./workflows/confirm-content/confirm-content-example.workflow");
|
|
21
|
+
const feedback_form_document_1 = require("./workflows/inline-form/feedback-form-document");
|
|
22
|
+
const inline_form_example_workflow_1 = require("./workflows/inline-form/inline-form-example.workflow");
|
|
23
|
+
const meeting_notes_document_1 = require("./workflows/meeting-notes/documents/meeting-notes-document");
|
|
24
|
+
const optimized_notes_document_1 = require("./workflows/meeting-notes/documents/optimized-notes-document");
|
|
25
|
+
const meeting_notes_example_workflow_1 = require("./workflows/meeting-notes/meeting-notes-example.workflow");
|
|
26
|
+
const prompt_input_chat_example_workflow_1 = require("./workflows/prompt-input-chat/prompt-input-chat-example.workflow");
|
|
27
|
+
const WORKFLOWS = [
|
|
28
|
+
inline_form_example_workflow_1.InlineFormExampleWorkflow,
|
|
29
|
+
prompt_input_chat_example_workflow_1.PromptInputChatExampleWorkflow,
|
|
30
|
+
ask_user_text_example_workflow_1.AskUserTextExampleWorkflow,
|
|
31
|
+
ask_user_options_example_workflow_1.AskUserOptionsExampleWorkflow,
|
|
32
|
+
ask_user_confirm_example_workflow_1.AskUserConfirmExampleWorkflow,
|
|
33
|
+
confirm_content_example_workflow_1.ConfirmContentExampleWorkflow,
|
|
34
|
+
agent_ask_clarification_example_workflow_1.AgentAskClarificationExampleWorkflow,
|
|
35
|
+
agent_ask_for_approval_example_workflow_1.AgentAskForApprovalExampleWorkflow,
|
|
36
|
+
meeting_notes_example_workflow_1.MeetingNotesExampleWorkflow,
|
|
37
|
+
];
|
|
38
|
+
let HitlExamplesModule = class HitlExamplesModule {
|
|
39
|
+
};
|
|
40
|
+
exports.HitlExamplesModule = HitlExamplesModule;
|
|
41
|
+
exports.HitlExamplesModule = HitlExamplesModule = __decorate([
|
|
42
|
+
(0, common_2.StudioApp)({
|
|
43
|
+
title: 'HITL Examples',
|
|
44
|
+
workflows: WORKFLOWS,
|
|
45
|
+
}),
|
|
46
|
+
(0, common_1.Module)({
|
|
47
|
+
imports: [hitl_1.HitlModule, agent_1.AgentModule, claude_module_1.ClaudeModule],
|
|
48
|
+
providers: [feedback_form_document_1.FeedbackFormDocument, meeting_notes_document_1.MeetingNotesDocument, optimized_notes_document_1.OptimizedNotesDocument, ...WORKFLOWS],
|
|
49
|
+
exports: WORKFLOWS,
|
|
50
|
+
})
|
|
51
|
+
], HitlExamplesModule);
|
|
52
|
+
//# sourceMappingURL=hitl-examples.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hitl-examples.module.js","sourceRoot":"","sources":["../src/hitl-examples.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,4CAA+C;AAC/C,4DAAwD;AACxD,8CAA8C;AAC9C,0CAA6C;AAC7C,2IAAoI;AACpI,wIAAgI;AAChI,sHAA+G;AAC/G,sHAA+G;AAC/G,6GAAsG;AACtG,mHAA6G;AAC7G,2FAAsF;AACtF,uGAAiG;AACjG,uGAAkG;AAClG,2GAAsG;AACtG,6GAAuG;AACvG,yHAAkH;AAElH,MAAM,SAAS,GAAG;IAChB,wDAAyB;IACzB,mEAA8B;IAC9B,2DAA0B;IAC1B,iEAA6B;IAC7B,iEAA6B;IAC7B,gEAA6B;IAC7B,+EAAoC;IACpC,4EAAkC;IAClC,4DAA2B;CAC5B,CAAC;AAWK,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;CAAG,CAAA;AAArB,gDAAkB;6BAAlB,kBAAkB;IAT9B,IAAA,kBAAS,EAAC;QACT,KAAK,EAAE,eAAe;QACtB,SAAS,EAAE,SAAS;KACrB,CAAC;IACD,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,iBAAU,EAAE,mBAAW,EAAE,4BAAY,CAAC;QAChD,SAAS,EAAE,CAAC,6CAAoB,EAAE,6CAAoB,EAAE,iDAAsB,EAAE,GAAG,SAAS,CAAC;QAC7F,OAAO,EAAE,SAAS;KACnB,CAAC;GACW,kBAAkB,CAAG"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from './hitl-examples.module';
|
|
2
|
+
export * from './workflows/inline-form/inline-form-example.workflow';
|
|
3
|
+
export * from './workflows/inline-form/feedback-form-document';
|
|
4
|
+
export * from './workflows/prompt-input-chat/prompt-input-chat-example.workflow';
|
|
5
|
+
export * from './workflows/ask-user-text/ask-user-text-example.workflow';
|
|
6
|
+
export * from './workflows/ask-user-options/ask-user-options-example.workflow';
|
|
7
|
+
export * from './workflows/ask-user-confirm/ask-user-confirm-example.workflow';
|
|
8
|
+
export * from './workflows/confirm-content/confirm-content-example.workflow';
|
|
9
|
+
export * from './workflows/agent-ask-clarification/agent-ask-clarification-example.workflow';
|
|
10
|
+
export * from './workflows/agent-ask-for-approval/agent-ask-for-approval-example.workflow';
|
|
11
|
+
export * from './workflows/meeting-notes/meeting-notes-example.workflow';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AAEvC,cAAc,sDAAsD,CAAC;AACrE,cAAc,gDAAgD,CAAC;AAE/D,cAAc,kEAAkE,CAAC;AAEjF,cAAc,0DAA0D,CAAC;AACzE,cAAc,gEAAgE,CAAC;AAC/E,cAAc,gEAAgE,CAAC;AAC/E,cAAc,8DAA8D,CAAC;AAE7E,cAAc,8EAA8E,CAAC;AAC7F,cAAc,4EAA4E,CAAC;AAE3F,cAAc,0DAA0D,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./hitl-examples.module"), exports);
|
|
18
|
+
__exportStar(require("./workflows/inline-form/inline-form-example.workflow"), exports);
|
|
19
|
+
__exportStar(require("./workflows/inline-form/feedback-form-document"), exports);
|
|
20
|
+
__exportStar(require("./workflows/prompt-input-chat/prompt-input-chat-example.workflow"), exports);
|
|
21
|
+
__exportStar(require("./workflows/ask-user-text/ask-user-text-example.workflow"), exports);
|
|
22
|
+
__exportStar(require("./workflows/ask-user-options/ask-user-options-example.workflow"), exports);
|
|
23
|
+
__exportStar(require("./workflows/ask-user-confirm/ask-user-confirm-example.workflow"), exports);
|
|
24
|
+
__exportStar(require("./workflows/confirm-content/confirm-content-example.workflow"), exports);
|
|
25
|
+
__exportStar(require("./workflows/agent-ask-clarification/agent-ask-clarification-example.workflow"), exports);
|
|
26
|
+
__exportStar(require("./workflows/agent-ask-for-approval/agent-ask-for-approval-example.workflow"), exports);
|
|
27
|
+
__exportStar(require("./workflows/meeting-notes/meeting-notes-example.workflow"), exports);
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAuC;AAEvC,uFAAqE;AACrE,iFAA+D;AAE/D,mGAAiF;AAEjF,2FAAyE;AACzE,iGAA+E;AAC/E,iGAA+E;AAC/E,+FAA6E;AAE7E,+GAA6F;AAC7F,6GAA2F;AAE3F,2FAAyE"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type AgentResult, AgentWorkflow } from '@loopstack/agent';
|
|
2
|
+
import { BaseWorkflow, type TransitionInput } from '@loopstack/common';
|
|
3
|
+
export declare class AgentAskClarificationExampleWorkflow extends BaseWorkflow {
|
|
4
|
+
private readonly agentWorkflow;
|
|
5
|
+
constructor(agentWorkflow: AgentWorkflow);
|
|
6
|
+
start(_state: Record<string, unknown>): Promise<void>;
|
|
7
|
+
agentComplete(_state: Record<string, unknown>, input: TransitionInput<AgentResult>): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=agent-ask-clarification-example.workflow.d.ts.map
|
package/dist/workflows/agent-ask-clarification/agent-ask-clarification-example.workflow.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-ask-clarification-example.workflow.d.ts","sourceRoot":"","sources":["../../../src/workflows/agent-ask-clarification/agent-ask-clarification-example.workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAqB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,EAAE,YAAY,EAA+B,KAAK,eAAe,EAAY,MAAM,mBAAmB,CAAC;AAU9G,qBAMa,oCAAqC,SAAQ,YAAY;IACxD,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAKnD,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAiBrC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,WAAW,CAAC;CAOzF"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.AgentAskClarificationExampleWorkflow = void 0;
|
|
13
|
+
const agent_1 = require("@loopstack/agent");
|
|
14
|
+
const common_1 = require("@loopstack/common");
|
|
15
|
+
const SYSTEM_PROMPT = `You are a trip-planning assistant.
|
|
16
|
+
|
|
17
|
+
CRITICAL RULES — your response MUST follow these:
|
|
18
|
+
- Before recommending a destination, you MUST know BOTH the user's budget AND their preferred climate.
|
|
19
|
+
- If EITHER is missing from the conversation, your response MUST be exactly ONE tool call to "ask_clarification".
|
|
20
|
+
- Do NOT guess. Do NOT recommend a destination based on partial info.
|
|
21
|
+
- Only after you have received BOTH pieces of information, recommend a single destination as a short paragraph.`;
|
|
22
|
+
let AgentAskClarificationExampleWorkflow = class AgentAskClarificationExampleWorkflow extends common_1.BaseWorkflow {
|
|
23
|
+
agentWorkflow;
|
|
24
|
+
constructor(agentWorkflow) {
|
|
25
|
+
super();
|
|
26
|
+
this.agentWorkflow = agentWorkflow;
|
|
27
|
+
}
|
|
28
|
+
async start(_state) {
|
|
29
|
+
await this.agentWorkflow.run({
|
|
30
|
+
system: SYSTEM_PROMPT,
|
|
31
|
+
tools: ['ask_clarification'],
|
|
32
|
+
userMessage: 'Where should I go on holiday next month?',
|
|
33
|
+
}, { callback: { transition: 'agentComplete' }, show: 'inline', label: 'Trip planner working...' });
|
|
34
|
+
}
|
|
35
|
+
async agentComplete(_state, input) {
|
|
36
|
+
await this.documentStore.save(common_1.MessageDocument, {
|
|
37
|
+
role: 'assistant',
|
|
38
|
+
text: input.data.response,
|
|
39
|
+
});
|
|
40
|
+
this.setResult(input.data);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
exports.AgentAskClarificationExampleWorkflow = AgentAskClarificationExampleWorkflow;
|
|
44
|
+
__decorate([
|
|
45
|
+
(0, common_1.Transition)({ to: 'running' }),
|
|
46
|
+
__metadata("design:type", Function),
|
|
47
|
+
__metadata("design:paramtypes", [Object]),
|
|
48
|
+
__metadata("design:returntype", Promise)
|
|
49
|
+
], AgentAskClarificationExampleWorkflow.prototype, "start", null);
|
|
50
|
+
__decorate([
|
|
51
|
+
(0, common_1.Transition)({
|
|
52
|
+
from: 'running',
|
|
53
|
+
to: 'end',
|
|
54
|
+
wait: true,
|
|
55
|
+
schema: agent_1.AgentResultSchema,
|
|
56
|
+
}),
|
|
57
|
+
__metadata("design:type", Function),
|
|
58
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
59
|
+
__metadata("design:returntype", Promise)
|
|
60
|
+
], AgentAskClarificationExampleWorkflow.prototype, "agentComplete", null);
|
|
61
|
+
exports.AgentAskClarificationExampleWorkflow = AgentAskClarificationExampleWorkflow = __decorate([
|
|
62
|
+
(0, common_1.Workflow)({
|
|
63
|
+
title: 'HITL - Agent Ask Clarification Example',
|
|
64
|
+
description: 'Agent HITL: an LLM agent runs with the ask_clarification tool. When it lacks information, ' +
|
|
65
|
+
'it pauses the loop and prompts the user; the answer flows back into the agent context.',
|
|
66
|
+
}),
|
|
67
|
+
__metadata("design:paramtypes", [agent_1.AgentWorkflow])
|
|
68
|
+
], AgentAskClarificationExampleWorkflow);
|
|
69
|
+
//# sourceMappingURL=agent-ask-clarification-example.workflow.js.map
|
package/dist/workflows/agent-ask-clarification/agent-ask-clarification-example.workflow.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-ask-clarification-example.workflow.js","sourceRoot":"","sources":["../../../src/workflows/agent-ask-clarification/agent-ask-clarification-example.workflow.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,4CAAsF;AACtF,8CAA8G;AAE9G,MAAM,aAAa,GAAG;;;;;;gHAM0F,CAAC;AAQ1G,IAAM,oCAAoC,GAA1C,MAAM,oCAAqC,SAAQ,qBAAY;IACvC;IAA7B,YAA6B,aAA4B;QACvD,KAAK,EAAE,CAAC;QADmB,kBAAa,GAAb,aAAa,CAAe;IAEzD,CAAC;IAGK,AAAN,KAAK,CAAC,KAAK,CAAC,MAA+B;QACzC,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAC1B;YACE,MAAM,EAAE,aAAa;YACrB,KAAK,EAAE,CAAC,mBAAmB,CAAC;YAC5B,WAAW,EAAE,0CAA0C;SACxD,EACD,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAChG,CAAC;IACJ,CAAC;IAQK,AAAN,KAAK,CAAC,aAAa,CAAC,MAA+B,EAAE,KAAmC;QACtF,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,wBAAe,EAAE;YAC7C,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ;SAC1B,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF,CAAA;AA9BY,oFAAoC;AAMzC;IADL,IAAA,mBAAU,EAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;;;;iEAU7B;AAQK;IANL,IAAA,mBAAU,EAAC;QACV,IAAI,EAAE,SAAS;QACf,EAAE,EAAE,KAAK;QACT,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,yBAAiB;KAC1B,CAAC;;;;yEAOD;+CA7BU,oCAAoC;IANhD,IAAA,iBAAQ,EAAC;QACR,KAAK,EAAE,wCAAwC;QAC/C,WAAW,EACT,4FAA4F;YAC5F,wFAAwF;KAC3F,CAAC;qCAE4C,qBAAa;GAD9C,oCAAoC,CA8BhD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type AgentResult, AgentWorkflow } from '@loopstack/agent';
|
|
2
|
+
import { BaseWorkflow, type TransitionInput } from '@loopstack/common';
|
|
3
|
+
export declare class AgentAskForApprovalExampleWorkflow extends BaseWorkflow {
|
|
4
|
+
private readonly agentWorkflow;
|
|
5
|
+
constructor(agentWorkflow: AgentWorkflow);
|
|
6
|
+
start(_state: Record<string, unknown>): Promise<void>;
|
|
7
|
+
agentComplete(_state: Record<string, unknown>, input: TransitionInput<AgentResult>): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=agent-ask-for-approval-example.workflow.d.ts.map
|
package/dist/workflows/agent-ask-for-approval/agent-ask-for-approval-example.workflow.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-ask-for-approval-example.workflow.d.ts","sourceRoot":"","sources":["../../../src/workflows/agent-ask-for-approval/agent-ask-for-approval-example.workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAqB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,EAAE,YAAY,EAAgC,KAAK,eAAe,EAAY,MAAM,mBAAmB,CAAC;AAW/G,qBAMa,kCAAmC,SAAQ,YAAY;IACtD,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAKnD,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAkBrC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,WAAW,CAAC;CAIzF"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.AgentAskForApprovalExampleWorkflow = void 0;
|
|
13
|
+
const agent_1 = require("@loopstack/agent");
|
|
14
|
+
const common_1 = require("@loopstack/common");
|
|
15
|
+
const SYSTEM_PROMPT = `You are a release-notes drafting assistant.
|
|
16
|
+
|
|
17
|
+
Your task: produce a concise release-notes markdown draft, get explicit user approval via the "ask_for_approval" tool, then output the approved markdown as your final response.
|
|
18
|
+
|
|
19
|
+
CRITICAL RULES — your response MUST follow these:
|
|
20
|
+
- First turn: respond with exactly ONE tool call to "ask_for_approval". The "concept" argument IS the markdown draft. Do NOT write the draft as plain text in this turn.
|
|
21
|
+
- After approval: your final text response MUST be the approved markdown verbatim, with no preamble, commentary, or trailing text.
|
|
22
|
+
- After denial: respond with a brief one-line note that the draft was rejected.`;
|
|
23
|
+
let AgentAskForApprovalExampleWorkflow = class AgentAskForApprovalExampleWorkflow extends common_1.BaseWorkflow {
|
|
24
|
+
agentWorkflow;
|
|
25
|
+
constructor(agentWorkflow) {
|
|
26
|
+
super();
|
|
27
|
+
this.agentWorkflow = agentWorkflow;
|
|
28
|
+
}
|
|
29
|
+
async start(_state) {
|
|
30
|
+
await this.agentWorkflow.run({
|
|
31
|
+
system: SYSTEM_PROMPT,
|
|
32
|
+
tools: ['ask_for_approval'],
|
|
33
|
+
userMessage: 'Draft release notes for v1.2.3: added webhook signature verification; fixed a date-parsing bug in the importer.',
|
|
34
|
+
}, { callback: { transition: 'agentComplete' }, show: 'inline', label: 'Drafting release notes...' });
|
|
35
|
+
}
|
|
36
|
+
async agentComplete(_state, input) {
|
|
37
|
+
await this.documentStore.save(common_1.MarkdownDocument, { markdown: input.data.response });
|
|
38
|
+
this.setResult(input.data);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
exports.AgentAskForApprovalExampleWorkflow = AgentAskForApprovalExampleWorkflow;
|
|
42
|
+
__decorate([
|
|
43
|
+
(0, common_1.Transition)({ to: 'running' }),
|
|
44
|
+
__metadata("design:type", Function),
|
|
45
|
+
__metadata("design:paramtypes", [Object]),
|
|
46
|
+
__metadata("design:returntype", Promise)
|
|
47
|
+
], AgentAskForApprovalExampleWorkflow.prototype, "start", null);
|
|
48
|
+
__decorate([
|
|
49
|
+
(0, common_1.Transition)({
|
|
50
|
+
from: 'running',
|
|
51
|
+
to: 'end',
|
|
52
|
+
wait: true,
|
|
53
|
+
schema: agent_1.AgentResultSchema,
|
|
54
|
+
}),
|
|
55
|
+
__metadata("design:type", Function),
|
|
56
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
57
|
+
__metadata("design:returntype", Promise)
|
|
58
|
+
], AgentAskForApprovalExampleWorkflow.prototype, "agentComplete", null);
|
|
59
|
+
exports.AgentAskForApprovalExampleWorkflow = AgentAskForApprovalExampleWorkflow = __decorate([
|
|
60
|
+
(0, common_1.Workflow)({
|
|
61
|
+
title: 'HITL - Agent Ask For Approval Example',
|
|
62
|
+
description: 'Agent HITL: an LLM agent drafts content, then calls the ask_for_approval tool to show the markdown ' +
|
|
63
|
+
'to the user and pause until they confirm or deny.',
|
|
64
|
+
}),
|
|
65
|
+
__metadata("design:paramtypes", [agent_1.AgentWorkflow])
|
|
66
|
+
], AgentAskForApprovalExampleWorkflow);
|
|
67
|
+
//# sourceMappingURL=agent-ask-for-approval-example.workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-ask-for-approval-example.workflow.js","sourceRoot":"","sources":["../../../src/workflows/agent-ask-for-approval/agent-ask-for-approval-example.workflow.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,4CAAsF;AACtF,8CAA+G;AAE/G,MAAM,aAAa,GAAG;;;;;;;gFAO0D,CAAC;AAQ1E,IAAM,kCAAkC,GAAxC,MAAM,kCAAmC,SAAQ,qBAAY;IACrC;IAA7B,YAA6B,aAA4B;QACvD,KAAK,EAAE,CAAC;QADmB,kBAAa,GAAb,aAAa,CAAe;IAEzD,CAAC;IAGK,AAAN,KAAK,CAAC,KAAK,CAAC,MAA+B;QACzC,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAC1B;YACE,MAAM,EAAE,aAAa;YACrB,KAAK,EAAE,CAAC,kBAAkB,CAAC;YAC3B,WAAW,EACT,iHAAiH;SACpH,EACD,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAClG,CAAC;IACJ,CAAC;IAQK,AAAN,KAAK,CAAC,aAAa,CAAC,MAA+B,EAAE,KAAmC;QACtF,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,yBAAgB,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF,CAAA;AA5BY,gFAAkC;AAMvC;IADL,IAAA,mBAAU,EAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;;;;+DAW7B;AAQK;IANL,IAAA,mBAAU,EAAC;QACV,IAAI,EAAE,SAAS;QACf,EAAE,EAAE,KAAK;QACT,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,yBAAiB;KAC1B,CAAC;;;;uEAID;6CA3BU,kCAAkC;IAN9C,IAAA,iBAAQ,EAAC;QACR,KAAK,EAAE,uCAAuC;QAC9C,WAAW,EACT,qGAAqG;YACrG,mDAAmD;KACtD,CAAC;qCAE4C,qBAAa;GAD9C,kCAAkC,CA4B9C"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BaseWorkflow, type TransitionInput } from '@loopstack/common';
|
|
2
|
+
import { AskUserWorkflow } from '@loopstack/hitl';
|
|
3
|
+
export declare class AskUserConfirmExampleWorkflow extends BaseWorkflow {
|
|
4
|
+
private readonly askUserWorkflow;
|
|
5
|
+
constructor(askUserWorkflow: AskUserWorkflow);
|
|
6
|
+
askToSend(_state: Record<string, unknown>): Promise<void>;
|
|
7
|
+
decisionReceived(state: Record<string, unknown>, input: TransitionInput<{
|
|
8
|
+
answer: string;
|
|
9
|
+
}>): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=ask-user-confirm-example.workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-user-confirm-example.workflow.d.ts","sourceRoot":"","sources":["../../../src/workflows/ask-user-confirm/ask-user-confirm-example.workflow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAA+B,KAAK,eAAe,EAAY,MAAM,mBAAmB,CAAC;AAC9G,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAIlD,qBAMa,6BAA8B,SAAQ,YAAY;IACjD,OAAO,CAAC,QAAQ,CAAC,eAAe;gBAAf,eAAe,EAAE,eAAe;IAKvD,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAazC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAQlG"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.AskUserConfirmExampleWorkflow = void 0;
|
|
13
|
+
const zod_1 = require("zod");
|
|
14
|
+
const common_1 = require("@loopstack/common");
|
|
15
|
+
const hitl_1 = require("@loopstack/hitl");
|
|
16
|
+
const AnswerSchema = zod_1.z.object({ answer: zod_1.z.string() });
|
|
17
|
+
let AskUserConfirmExampleWorkflow = class AskUserConfirmExampleWorkflow extends common_1.BaseWorkflow {
|
|
18
|
+
askUserWorkflow;
|
|
19
|
+
constructor(askUserWorkflow) {
|
|
20
|
+
super();
|
|
21
|
+
this.askUserWorkflow = askUserWorkflow;
|
|
22
|
+
}
|
|
23
|
+
async askToSend(_state) {
|
|
24
|
+
await this.askUserWorkflow.run({ question: 'Send the email now?', mode: 'confirm' }, { callback: { transition: 'decisionReceived' }, show: 'inline', label: 'Waiting for yes/no...' });
|
|
25
|
+
}
|
|
26
|
+
async decisionReceived(state, input) {
|
|
27
|
+
const accepted = input.data.answer === 'yes';
|
|
28
|
+
await this.documentStore.save(common_1.MessageDocument, {
|
|
29
|
+
role: 'assistant',
|
|
30
|
+
text: accepted ? 'Sending the email now.' : 'Skipping — email was not sent.',
|
|
31
|
+
});
|
|
32
|
+
this.setResult({ sent: accepted });
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
exports.AskUserConfirmExampleWorkflow = AskUserConfirmExampleWorkflow;
|
|
36
|
+
__decorate([
|
|
37
|
+
(0, common_1.Transition)({ to: 'waiting_for_yes_no' }),
|
|
38
|
+
__metadata("design:type", Function),
|
|
39
|
+
__metadata("design:paramtypes", [Object]),
|
|
40
|
+
__metadata("design:returntype", Promise)
|
|
41
|
+
], AskUserConfirmExampleWorkflow.prototype, "askToSend", null);
|
|
42
|
+
__decorate([
|
|
43
|
+
(0, common_1.Transition)({
|
|
44
|
+
from: 'waiting_for_yes_no',
|
|
45
|
+
to: 'end',
|
|
46
|
+
wait: true,
|
|
47
|
+
schema: AnswerSchema,
|
|
48
|
+
}),
|
|
49
|
+
__metadata("design:type", Function),
|
|
50
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
51
|
+
__metadata("design:returntype", Promise)
|
|
52
|
+
], AskUserConfirmExampleWorkflow.prototype, "decisionReceived", null);
|
|
53
|
+
exports.AskUserConfirmExampleWorkflow = AskUserConfirmExampleWorkflow = __decorate([
|
|
54
|
+
(0, common_1.Workflow)({
|
|
55
|
+
title: 'HITL - Ask User Confirm Example',
|
|
56
|
+
description: 'Shortcut HITL: delegate a yes/no decision to AskUserWorkflow with mode "confirm". ' +
|
|
57
|
+
'The answer comes back as the literal string "yes" or "no".',
|
|
58
|
+
}),
|
|
59
|
+
__metadata("design:paramtypes", [hitl_1.AskUserWorkflow])
|
|
60
|
+
], AskUserConfirmExampleWorkflow);
|
|
61
|
+
//# sourceMappingURL=ask-user-confirm-example.workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-user-confirm-example.workflow.js","sourceRoot":"","sources":["../../../src/workflows/ask-user-confirm/ask-user-confirm-example.workflow.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6BAAwB;AACxB,8CAA8G;AAC9G,0CAAkD;AAElD,MAAM,YAAY,GAAG,OAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAQ/C,IAAM,6BAA6B,GAAnC,MAAM,6BAA8B,SAAQ,qBAAY;IAChC;IAA7B,YAA6B,eAAgC;QAC3D,KAAK,EAAE,CAAC;QADmB,oBAAe,GAAf,eAAe,CAAiB;IAE7D,CAAC;IAGK,AAAN,KAAK,CAAC,SAAS,CAAC,MAA+B;QAC7C,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAC5B,EAAE,QAAQ,EAAE,qBAAqB,EAAE,IAAI,EAAE,SAAS,EAAE,EACpD,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,uBAAuB,EAAE,CACjG,CAAC;IACJ,CAAC;IAQK,AAAN,KAAK,CAAC,gBAAgB,CAAC,KAA8B,EAAE,KAA0C;QAC/F,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC;QAC7C,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,wBAAe,EAAE;YAC7C,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,gCAAgC;SAC7E,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAwC,CAAC,CAAC;IAC3E,CAAC;CACF,CAAA;AA3BY,sEAA6B;AAMlC;IADL,IAAA,mBAAU,EAAC,EAAE,EAAE,EAAE,oBAAoB,EAAE,CAAC;;;;8DAMxC;AAQK;IANL,IAAA,mBAAU,EAAC;QACV,IAAI,EAAE,oBAAoB;QAC1B,EAAE,EAAE,KAAK;QACT,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,YAAY;KACrB,CAAC;;;;qEAQD;wCA1BU,6BAA6B;IANzC,IAAA,iBAAQ,EAAC;QACR,KAAK,EAAE,iCAAiC;QACxC,WAAW,EACT,oFAAoF;YACpF,4DAA4D;KAC/D,CAAC;qCAE8C,sBAAe;GADlD,6BAA6B,CA2BzC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BaseWorkflow, type TransitionInput } from '@loopstack/common';
|
|
2
|
+
import { AskUserWorkflow } from '@loopstack/hitl';
|
|
3
|
+
export declare class AskUserOptionsExampleWorkflow extends BaseWorkflow {
|
|
4
|
+
private readonly askUserWorkflow;
|
|
5
|
+
constructor(askUserWorkflow: AskUserWorkflow);
|
|
6
|
+
askEnvironment(_state: Record<string, unknown>): Promise<void>;
|
|
7
|
+
choiceReceived(state: Record<string, unknown>, input: TransitionInput<{
|
|
8
|
+
answer: string;
|
|
9
|
+
}>): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=ask-user-options-example.workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-user-options-example.workflow.d.ts","sourceRoot":"","sources":["../../../src/workflows/ask-user-options/ask-user-options-example.workflow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAA+B,KAAK,eAAe,EAAY,MAAM,mBAAmB,CAAC;AAC9G,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAMlD,qBAMa,6BAA8B,SAAQ,YAAY;IACjD,OAAO,CAAC,QAAQ,CAAC,eAAe;gBAAf,eAAe,EAAE,eAAe;IAKvD,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAkB9C,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAShG"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.AskUserOptionsExampleWorkflow = void 0;
|
|
13
|
+
const zod_1 = require("zod");
|
|
14
|
+
const common_1 = require("@loopstack/common");
|
|
15
|
+
const hitl_1 = require("@loopstack/hitl");
|
|
16
|
+
const AnswerSchema = zod_1.z.object({ answer: zod_1.z.string() });
|
|
17
|
+
const ENV_OPTIONS = ['staging', 'production'];
|
|
18
|
+
let AskUserOptionsExampleWorkflow = class AskUserOptionsExampleWorkflow extends common_1.BaseWorkflow {
|
|
19
|
+
askUserWorkflow;
|
|
20
|
+
constructor(askUserWorkflow) {
|
|
21
|
+
super();
|
|
22
|
+
this.askUserWorkflow = askUserWorkflow;
|
|
23
|
+
}
|
|
24
|
+
async askEnvironment(_state) {
|
|
25
|
+
await this.askUserWorkflow.run({
|
|
26
|
+
question: 'Which environment should we deploy to?',
|
|
27
|
+
mode: 'options',
|
|
28
|
+
options: ENV_OPTIONS,
|
|
29
|
+
allowCustomAnswer: true,
|
|
30
|
+
}, { callback: { transition: 'choiceReceived' }, show: 'inline', label: 'Waiting for choice...' });
|
|
31
|
+
}
|
|
32
|
+
async choiceReceived(state, input) {
|
|
33
|
+
const choice = input.data.answer;
|
|
34
|
+
const isCustom = !ENV_OPTIONS.includes(choice);
|
|
35
|
+
await this.documentStore.save(common_1.MessageDocument, {
|
|
36
|
+
role: 'assistant',
|
|
37
|
+
text: isCustom ? `Custom environment selected: ${choice}` : `Deploying to ${choice}.`,
|
|
38
|
+
});
|
|
39
|
+
this.setResult({ environment: choice, custom: isCustom });
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
exports.AskUserOptionsExampleWorkflow = AskUserOptionsExampleWorkflow;
|
|
43
|
+
__decorate([
|
|
44
|
+
(0, common_1.Transition)({ to: 'waiting_for_choice' }),
|
|
45
|
+
__metadata("design:type", Function),
|
|
46
|
+
__metadata("design:paramtypes", [Object]),
|
|
47
|
+
__metadata("design:returntype", Promise)
|
|
48
|
+
], AskUserOptionsExampleWorkflow.prototype, "askEnvironment", null);
|
|
49
|
+
__decorate([
|
|
50
|
+
(0, common_1.Transition)({
|
|
51
|
+
from: 'waiting_for_choice',
|
|
52
|
+
to: 'end',
|
|
53
|
+
wait: true,
|
|
54
|
+
schema: AnswerSchema,
|
|
55
|
+
}),
|
|
56
|
+
__metadata("design:type", Function),
|
|
57
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
58
|
+
__metadata("design:returntype", Promise)
|
|
59
|
+
], AskUserOptionsExampleWorkflow.prototype, "choiceReceived", null);
|
|
60
|
+
exports.AskUserOptionsExampleWorkflow = AskUserOptionsExampleWorkflow = __decorate([
|
|
61
|
+
(0, common_1.Workflow)({
|
|
62
|
+
title: 'HITL - Ask User Options Example',
|
|
63
|
+
description: 'Shortcut HITL: delegate a generic "pick from a list" ask to AskUserWorkflow with mode "options". ' +
|
|
64
|
+
'allowCustomAnswer adds a free-text field next to the choices.',
|
|
65
|
+
}),
|
|
66
|
+
__metadata("design:paramtypes", [hitl_1.AskUserWorkflow])
|
|
67
|
+
], AskUserOptionsExampleWorkflow);
|
|
68
|
+
//# sourceMappingURL=ask-user-options-example.workflow.js.map
|