@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.
Files changed (82) hide show
  1. package/README.md +165 -0
  2. package/dist/hitl-examples.module.d.ts +3 -0
  3. package/dist/hitl-examples.module.d.ts.map +1 -0
  4. package/dist/hitl-examples.module.js +52 -0
  5. package/dist/hitl-examples.module.js.map +1 -0
  6. package/dist/index.d.ts +12 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +28 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/workflows/agent-ask-clarification/agent-ask-clarification-example.workflow.d.ts +9 -0
  11. package/dist/workflows/agent-ask-clarification/agent-ask-clarification-example.workflow.d.ts.map +1 -0
  12. package/dist/workflows/agent-ask-clarification/agent-ask-clarification-example.workflow.js +69 -0
  13. package/dist/workflows/agent-ask-clarification/agent-ask-clarification-example.workflow.js.map +1 -0
  14. package/dist/workflows/agent-ask-for-approval/agent-ask-for-approval-example.workflow.d.ts +9 -0
  15. package/dist/workflows/agent-ask-for-approval/agent-ask-for-approval-example.workflow.d.ts.map +1 -0
  16. package/dist/workflows/agent-ask-for-approval/agent-ask-for-approval-example.workflow.js +67 -0
  17. package/dist/workflows/agent-ask-for-approval/agent-ask-for-approval-example.workflow.js.map +1 -0
  18. package/dist/workflows/ask-user-confirm/ask-user-confirm-example.workflow.d.ts +11 -0
  19. package/dist/workflows/ask-user-confirm/ask-user-confirm-example.workflow.d.ts.map +1 -0
  20. package/dist/workflows/ask-user-confirm/ask-user-confirm-example.workflow.js +61 -0
  21. package/dist/workflows/ask-user-confirm/ask-user-confirm-example.workflow.js.map +1 -0
  22. package/dist/workflows/ask-user-options/ask-user-options-example.workflow.d.ts +11 -0
  23. package/dist/workflows/ask-user-options/ask-user-options-example.workflow.d.ts.map +1 -0
  24. package/dist/workflows/ask-user-options/ask-user-options-example.workflow.js +68 -0
  25. package/dist/workflows/ask-user-options/ask-user-options-example.workflow.js.map +1 -0
  26. package/dist/workflows/ask-user-text/ask-user-text-example.workflow.d.ts +11 -0
  27. package/dist/workflows/ask-user-text/ask-user-text-example.workflow.d.ts.map +1 -0
  28. package/dist/workflows/ask-user-text/ask-user-text-example.workflow.js +60 -0
  29. package/dist/workflows/ask-user-text/ask-user-text-example.workflow.js.map +1 -0
  30. package/dist/workflows/confirm-content/confirm-content-example.workflow.d.ts +16 -0
  31. package/dist/workflows/confirm-content/confirm-content-example.workflow.d.ts.map +1 -0
  32. package/dist/workflows/confirm-content/confirm-content-example.workflow.js +68 -0
  33. package/dist/workflows/confirm-content/confirm-content-example.workflow.js.map +1 -0
  34. package/dist/workflows/inline-form/feedback-form-document.d.ts +10 -0
  35. package/dist/workflows/inline-form/feedback-form-document.d.ts.map +1 -0
  36. package/dist/workflows/inline-form/feedback-form-document.js +27 -0
  37. package/dist/workflows/inline-form/feedback-form-document.js.map +1 -0
  38. package/dist/workflows/inline-form/feedback-form-document.yaml +13 -0
  39. package/dist/workflows/inline-form/inline-form-example.workflow.d.ts +11 -0
  40. package/dist/workflows/inline-form/inline-form-example.workflow.d.ts.map +1 -0
  41. package/dist/workflows/inline-form/inline-form-example.workflow.js +54 -0
  42. package/dist/workflows/inline-form/inline-form-example.workflow.js.map +1 -0
  43. package/dist/workflows/meeting-notes/documents/meeting-notes-document.d.ts +8 -0
  44. package/dist/workflows/meeting-notes/documents/meeting-notes-document.d.ts.map +1 -0
  45. package/dist/workflows/meeting-notes/documents/meeting-notes-document.js +25 -0
  46. package/dist/workflows/meeting-notes/documents/meeting-notes-document.js.map +1 -0
  47. package/dist/workflows/meeting-notes/documents/meeting-notes-document.yaml +10 -0
  48. package/dist/workflows/meeting-notes/documents/optimized-notes-document.d.ts +16 -0
  49. package/dist/workflows/meeting-notes/documents/optimized-notes-document.d.ts.map +1 -0
  50. package/dist/workflows/meeting-notes/documents/optimized-notes-document.js +33 -0
  51. package/dist/workflows/meeting-notes/documents/optimized-notes-document.js.map +1 -0
  52. package/dist/workflows/meeting-notes/documents/optimized-notes-document.yaml +33 -0
  53. package/dist/workflows/meeting-notes/meeting-notes-example.workflow.d.ts +24 -0
  54. package/dist/workflows/meeting-notes/meeting-notes-example.workflow.d.ts.map +1 -0
  55. package/dist/workflows/meeting-notes/meeting-notes-example.workflow.js +86 -0
  56. package/dist/workflows/meeting-notes/meeting-notes-example.workflow.js.map +1 -0
  57. package/dist/workflows/meeting-notes/templates/extract-notes.md +5 -0
  58. package/dist/workflows/prompt-input-chat/prompt-input-chat-example.workflow.d.ts +8 -0
  59. package/dist/workflows/prompt-input-chat/prompt-input-chat-example.workflow.d.ts.map +1 -0
  60. package/dist/workflows/prompt-input-chat/prompt-input-chat-example.workflow.js +56 -0
  61. package/dist/workflows/prompt-input-chat/prompt-input-chat-example.workflow.js.map +1 -0
  62. package/dist/workflows/prompt-input-chat/prompt-input-chat-example.workflow.yaml +6 -0
  63. package/package.json +55 -0
  64. package/src/hitl-examples.module.ts +40 -0
  65. package/src/index.ts +16 -0
  66. package/src/workflows/agent-ask-clarification/agent-ask-clarification-example.workflow.ts +48 -0
  67. package/src/workflows/agent-ask-for-approval/agent-ask-for-approval-example.workflow.ts +47 -0
  68. package/src/workflows/ask-user-confirm/ask-user-confirm-example.workflow.ts +40 -0
  69. package/src/workflows/ask-user-options/ask-user-options-example.workflow.ts +48 -0
  70. package/src/workflows/ask-user-text/ask-user-text-example.workflow.ts +39 -0
  71. package/src/workflows/confirm-content/confirm-content-example.workflow.ts +49 -0
  72. package/src/workflows/inline-form/feedback-form-document.ts +16 -0
  73. package/src/workflows/inline-form/feedback-form-document.yaml +13 -0
  74. package/src/workflows/inline-form/inline-form-example.workflow.ts +37 -0
  75. package/src/workflows/meeting-notes/documents/meeting-notes-document.ts +14 -0
  76. package/src/workflows/meeting-notes/documents/meeting-notes-document.yaml +10 -0
  77. package/src/workflows/meeting-notes/documents/optimized-notes-document.ts +22 -0
  78. package/src/workflows/meeting-notes/documents/optimized-notes-document.yaml +33 -0
  79. package/src/workflows/meeting-notes/meeting-notes-example.workflow.ts +75 -0
  80. package/src/workflows/meeting-notes/templates/extract-notes.md +5 -0
  81. package/src/workflows/prompt-input-chat/prompt-input-chat-example.workflow.ts +30 -0
  82. package/src/workflows/prompt-input-chat/prompt-input-chat-example.workflow.yaml +6 -0
@@ -0,0 +1,75 @@
1
+ import { join } from 'node:path';
2
+ import { z } from 'zod';
3
+ import { BaseWorkflow, Transition, Workflow } from '@loopstack/common';
4
+ import type { RunContext, TransitionInput } from '@loopstack/common';
5
+ import { LlmGenerateObjectTool } from '@loopstack/llm-provider-module';
6
+ import { MeetingNotesDocument, MeetingNotesDocumentSchema } from './documents/meeting-notes-document';
7
+ import { OptimizedMeetingNotesDocumentSchema, OptimizedNotesDocument } from './documents/optimized-notes-document';
8
+
9
+ interface MeetingNotesState {
10
+ meetingNotes?: z.infer<typeof MeetingNotesDocumentSchema>;
11
+ optimizedNotes?: z.infer<typeof OptimizedMeetingNotesDocumentSchema>;
12
+ }
13
+
14
+ const MeetingNotesArgsSchema = z.object({
15
+ inputText: z
16
+ .string()
17
+ .default(
18
+ '- meeting 1.1.2025\n- budget: need 2 cut costs sarah said\n- hire new person?? --> marketing\n- vendor pricing - follow up needed by anna',
19
+ ),
20
+ });
21
+
22
+ type MeetingNotesArgs = z.infer<typeof MeetingNotesArgsSchema>;
23
+
24
+ @Workflow({
25
+ title: 'HITL - Meeting Notes Example',
26
+ description: 'A demo workflow showing how to use AI to structure meeting notes, with HITL review steps.',
27
+ schema: MeetingNotesArgsSchema,
28
+ })
29
+ export class MeetingNotesExampleWorkflow extends BaseWorkflow<MeetingNotesArgs> {
30
+ constructor(private readonly llmGenerateObject: LlmGenerateObjectTool) {
31
+ super();
32
+ }
33
+
34
+ @Transition({ to: 'waiting_for_response' })
35
+ async createForm(state: MeetingNotesState, ctx: RunContext<MeetingNotesArgs>) {
36
+ await this.documentStore.save(
37
+ MeetingNotesDocument,
38
+ { text: `Unstructured Notes:\n\n${ctx.args.inputText}` },
39
+ { key: 'input' },
40
+ );
41
+ }
42
+
43
+ @Transition({ from: 'waiting_for_response', to: 'response_received', wait: true, schema: MeetingNotesDocumentSchema })
44
+ async userResponse(state: MeetingNotesState, input: TransitionInput<z.infer<typeof MeetingNotesDocumentSchema>>) {
45
+ const result = await this.documentStore.save(MeetingNotesDocument, input.data, { key: 'input' });
46
+ this.assignState({ meetingNotes: result.content as z.infer<typeof MeetingNotesDocumentSchema> });
47
+ }
48
+
49
+ @Transition({ from: 'response_received', to: 'notes_optimized' })
50
+ async optimizeNotes(state: MeetingNotesState) {
51
+ const result = await this.llmGenerateObject.call(
52
+ {
53
+ outputSchema: OptimizedMeetingNotesDocumentSchema,
54
+ prompt: this.render(join(__dirname, 'templates', 'extract-notes.md'), {
55
+ text: state.meetingNotes?.text,
56
+ }),
57
+ },
58
+ { config: { provider: 'claude', model: 'claude-sonnet-4-6' } },
59
+ );
60
+
61
+ await this.documentStore.save(
62
+ OptimizedNotesDocument,
63
+ result.data.data as z.infer<typeof OptimizedMeetingNotesDocumentSchema>,
64
+ { key: 'final' },
65
+ );
66
+ }
67
+
68
+ @Transition({ from: 'notes_optimized', to: 'end', wait: true, schema: OptimizedMeetingNotesDocumentSchema })
69
+ async confirm(state: MeetingNotesState, input: TransitionInput<z.infer<typeof OptimizedMeetingNotesDocumentSchema>>) {
70
+ const result = await this.documentStore.save(OptimizedNotesDocument, input.data, { key: 'final' });
71
+ this.setResult({
72
+ optimizedNotes: result.content as z.infer<typeof OptimizedMeetingNotesDocumentSchema>,
73
+ } as unknown as Record<string, unknown>);
74
+ }
75
+ }
@@ -0,0 +1,5 @@
1
+ Extract all information from the provided meeting notes into the structured document.
2
+
3
+ <Meeting Notes>
4
+ {{text}}
5
+ </Meeting Notes>
@@ -0,0 +1,30 @@
1
+ import { z } from 'zod';
2
+ import { BaseWorkflow, MessageDocument, Transition, Workflow } from '@loopstack/common';
3
+ import type { TransitionInput } from '@loopstack/common';
4
+
5
+ @Workflow({
6
+ title: 'HITL - Prompt Input Chat Example',
7
+ description:
8
+ 'Predefined-workflow HITL via the prompt-input widget. The workflow loops: it waits for a user ' +
9
+ 'message, echoes back a reply, and re-enters the waiting state. No LLM and no sub-workflow involved.',
10
+ widget: './prompt-input-chat-example.workflow.yaml',
11
+ })
12
+ export class PromptInputChatExampleWorkflow extends BaseWorkflow {
13
+ @Transition({ to: 'waiting_for_user' })
14
+ async greet(_state: Record<string, unknown>) {
15
+ await this.documentStore.save(MessageDocument, {
16
+ role: 'assistant',
17
+ text: 'Hi! Send me a message and I will echo it back.',
18
+ });
19
+ }
20
+
21
+ @Transition({ from: 'waiting_for_user', to: 'reply_sent', wait: true, schema: z.string() })
22
+ async userMessage(state: Record<string, unknown>, input: TransitionInput<string>) {
23
+ const payload = input.data;
24
+ await this.documentStore.save(MessageDocument, { role: 'user', text: payload });
25
+ await this.documentStore.save(MessageDocument, { role: 'assistant', text: `You said: ${payload}` });
26
+ }
27
+
28
+ @Transition({ from: 'reply_sent', to: 'waiting_for_user' })
29
+ loop(_state: Record<string, unknown>) {}
30
+ }
@@ -0,0 +1,6 @@
1
+ widget: prompt-input
2
+ enabledWhen:
3
+ - waiting_for_user
4
+ options:
5
+ transition: userMessage
6
+ label: Send