@nudge-ai/core 0.0.1-beta.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,141 @@
1
+ //#region src/create-step.d.ts
2
+ type Nudge = 1 | 2 | 3 | 4 | 5;
3
+ type BaseStep = {
4
+ type: string;
5
+ };
6
+ type StepDefinition<Name extends string = string, Args$1 extends any[] = any[], Step extends BaseStep = any> = {
7
+ name: Name;
8
+ build: (...args: Args$1) => Step;
9
+ format: (step: Step) => string;
10
+ };
11
+ type AnyStepDefinition = StepDefinition<string, any[], any>;
12
+ /**
13
+ * Creates a step definition that can be used to extend a builder.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * const tone = createStep({
18
+ * name: 'tone',
19
+ * build: (style: string) => ({ type: 'tone', style }),
20
+ * format: (step) => `[Tone] Write in a ${step.style} tone`,
21
+ * });
22
+ * ```
23
+ */
24
+ declare function createStep<Name extends string, Args$1 extends unknown[], Step extends BaseStep & {
25
+ type: Name;
26
+ }>(definition: StepDefinition<Name, Args$1, Step>): StepDefinition<Name, Args$1, Step>;
27
+ //#endregion
28
+ //#region src/base-steps.d.ts
29
+
30
+ declare const baseSteps: readonly [StepDefinition<"raw", [value: string], {
31
+ type: "raw";
32
+ value: string;
33
+ }>, StepDefinition<"persona", [role: string], {
34
+ type: "persona";
35
+ role: string;
36
+ }>, StepDefinition<"input", [description: string], {
37
+ type: "input";
38
+ description: string;
39
+ }>, StepDefinition<"output", [description: string], {
40
+ type: "output";
41
+ description: string;
42
+ }>, StepDefinition<"context", [information: string], {
43
+ type: "context";
44
+ information: string;
45
+ }>, StepDefinition<"do", [instruction: string, options?: {
46
+ nudge?: Nudge;
47
+ } | undefined], {
48
+ type: "do";
49
+ instruction: string;
50
+ nudge: Nudge | undefined;
51
+ }>, StepDefinition<"dont", [instruction: string, options?: {
52
+ nudge?: Nudge;
53
+ } | undefined], {
54
+ type: "dont";
55
+ instruction: string;
56
+ nudge: Nudge | undefined;
57
+ }>, StepDefinition<"constraint", [rule: string, options?: {
58
+ nudge?: Nudge;
59
+ } | undefined], {
60
+ type: "constraint";
61
+ rule: string;
62
+ nudge: Nudge | undefined;
63
+ }>, StepDefinition<"example", [inputText: string, outputText: string], {
64
+ type: "example";
65
+ input: string;
66
+ output: string;
67
+ }>];
68
+ //#endregion
69
+ //#region src/types.d.ts
70
+ type PromptVariant = {
71
+ name: string;
72
+ steps: BaseStep[];
73
+ };
74
+ /** A test case for evaluating prompt quality */
75
+ type PromptTest = {
76
+ /** Input to send to the AI with this prompt */
77
+ input: string;
78
+ /** Function to validate the output, or string for LLM judge assertion */
79
+ assert: ((output: string) => boolean) | string;
80
+ /** Optional description of what this test checks */
81
+ description?: string;
82
+ };
83
+ type PromptBuilderState = {
84
+ steps: BaseStep[];
85
+ variants?: PromptVariant[];
86
+ tests?: PromptTest[];
87
+ };
88
+ //#endregion
89
+ //#region src/nudge.d.ts
90
+ type MethodFromDefinition<D, B> = D extends StepDefinition<string, infer Args, any> ? (...args: Args) => B : never;
91
+ type ExtractDef<Defs extends readonly AnyStepDefinition[], Name extends string> = Extract<Defs[number], {
92
+ name: Name;
93
+ }>;
94
+ type PromptBuilder<Defs extends readonly AnyStepDefinition[], Optionals extends string = never, Variants extends string = never> = { [K in Defs[number] as K["name"]]: MethodFromDefinition<K, PromptBuilder<Defs, Optionals, Variants>> } & {
95
+ do: ExtractDef<Defs, "do"> extends StepDefinition<"do", infer Args, any> ? (...args: Args) => PromptBuilder<Defs, Optionals, Variants> : never;
96
+ use: (source: {
97
+ _state: PromptBuilderState;
98
+ }) => PromptBuilder<Defs, Optionals, Variants>;
99
+ optional: <Name extends string>(name: Name, builderFn: (p: PromptBuilder<Defs>) => PromptBuilder<Defs>) => PromptBuilder<Defs, Optionals | Name, Variants>;
100
+ variant: <Name extends string>(name: Name, builderFn: (p: PromptBuilder<Defs>) => PromptBuilder<Defs>) => PromptBuilder<Defs, Optionals, Variants | Name>;
101
+ /** Add a test case for evaluating this prompt */
102
+ test: (input: string, assert: ((output: string) => boolean) | string, description?: string) => PromptBuilder<Defs, Optionals, Variants>;
103
+ };
104
+ /** Type for the default builder's prompt function */
105
+ type DefaultPromptFn = <Id extends string, Optionals extends string = never, Variants extends string = never>(id: Id, builderFn: (p: PromptBuilder<typeof baseSteps>) => PromptBuilder<typeof baseSteps, Optionals, Variants>) => Prompt<Id, Optionals, Variants>;
106
+ type Builder<Defs extends readonly AnyStepDefinition[] = readonly AnyStepDefinition[]> = {
107
+ /** Create a prompt using this builder's available steps. */
108
+ prompt: <Id extends string, Optionals extends string = never, Variants extends string = never>(id: Id, builderFn: (p: PromptBuilder<Defs>) => PromptBuilder<Defs, Optionals, Variants>) => Prompt<Id, Optionals, Variants>;
109
+ };
110
+ type Prompt<Id extends string = string, Optionals extends string = never, Variants extends string = never> = {
111
+ id: Id;
112
+ _state: PromptBuilderState;
113
+ variantNames: readonly Variants[];
114
+ toString: ToStringOptions<Id, Optionals, Variants>;
115
+ };
116
+ interface PromptRegistry {}
117
+ interface PromptVariables {}
118
+ interface PromptVariants {}
119
+ type VariantsFor<Id extends string> = Id extends keyof PromptVariants ? PromptVariants[Id] : never;
120
+ type VariantOption<V extends string> = [V] extends [never] ? {
121
+ variant?: never;
122
+ } : {
123
+ variant?: V;
124
+ };
125
+ type ToStringOptions<Id extends string, Optionals extends string, Variants extends string> = Id extends keyof PromptVariables ? [PromptVariables[Id]] extends [never] ? [Optionals] extends [never] ? (options?: VariantOption<Variants | VariantsFor<Id>>) => string : (options?: Partial<Record<Optionals, boolean>> & VariantOption<Variants | VariantsFor<Id>>) => string : [Optionals] extends [never] ? (options: Record<PromptVariables[Id] & string, string> & VariantOption<Variants | VariantsFor<Id>>) => string : (options: Record<PromptVariables[Id] & string, string> & Partial<Record<Optionals, boolean>> & VariantOption<Variants | VariantsFor<Id>>) => string : [Optionals] extends [never] ? (options?: VariantOption<Variants>) => string : (options?: Partial<Record<Optionals, boolean>> & VariantOption<Variants>) => string;
126
+ type GeneratedPrompt = {
127
+ variants: Record<string, string>;
128
+ hash: string;
129
+ };
130
+ declare function registerPrompts(prompts: Record<string, GeneratedPrompt>): void;
131
+ /** Format a step for AI consumption using the base step definitions. */
132
+ declare function formatStepForAI(step: BaseStep): string;
133
+ interface CreateBuilderOptions<OmitBase extends boolean = false> {
134
+ /** If true, only use the provided steps without including base steps. Default: false */
135
+ omitBaseSteps?: OmitBase;
136
+ }
137
+ declare function createBuilder<Defs extends readonly AnyStepDefinition[]>(customSteps: Defs, options: CreateBuilderOptions<true>): Builder<Defs>;
138
+ declare function createBuilder<Defs extends readonly AnyStepDefinition[] = readonly []>(customSteps?: Defs, options?: CreateBuilderOptions<false>): Builder<readonly [...typeof baseSteps, ...Defs]>;
139
+ //#endregion
140
+ export { PromptRegistry as a, createBuilder as c, PromptBuilderState as d, PromptTest as f, createStep as h, Prompt as i, formatStepForAI as l, StepDefinition as m, DefaultPromptFn as n, PromptVariables as o, BaseStep as p, GeneratedPrompt as r, PromptVariants as s, Builder as t, registerPrompts as u };
141
+ //# sourceMappingURL=nudge-B-p-8Izg.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nudge-B-p-8Izg.d.mts","names":[],"sources":["../src/create-step.ts","../src/base-steps.ts","../src/types.ts","../src/nudge.ts"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1,141 @@
1
+ //#region src/create-step.d.ts
2
+ type Nudge = 1 | 2 | 3 | 4 | 5;
3
+ type BaseStep = {
4
+ type: string;
5
+ };
6
+ type StepDefinition<Name extends string = string, Args$1 extends any[] = any[], Step extends BaseStep = any> = {
7
+ name: Name;
8
+ build: (...args: Args$1) => Step;
9
+ format: (step: Step) => string;
10
+ };
11
+ type AnyStepDefinition = StepDefinition<string, any[], any>;
12
+ /**
13
+ * Creates a step definition that can be used to extend a builder.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * const tone = createStep({
18
+ * name: 'tone',
19
+ * build: (style: string) => ({ type: 'tone', style }),
20
+ * format: (step) => `[Tone] Write in a ${step.style} tone`,
21
+ * });
22
+ * ```
23
+ */
24
+ declare function createStep<Name extends string, Args$1 extends unknown[], Step extends BaseStep & {
25
+ type: Name;
26
+ }>(definition: StepDefinition<Name, Args$1, Step>): StepDefinition<Name, Args$1, Step>;
27
+ //#endregion
28
+ //#region src/base-steps.d.ts
29
+
30
+ declare const baseSteps: readonly [StepDefinition<"raw", [value: string], {
31
+ type: "raw";
32
+ value: string;
33
+ }>, StepDefinition<"persona", [role: string], {
34
+ type: "persona";
35
+ role: string;
36
+ }>, StepDefinition<"input", [description: string], {
37
+ type: "input";
38
+ description: string;
39
+ }>, StepDefinition<"output", [description: string], {
40
+ type: "output";
41
+ description: string;
42
+ }>, StepDefinition<"context", [information: string], {
43
+ type: "context";
44
+ information: string;
45
+ }>, StepDefinition<"do", [instruction: string, options?: {
46
+ nudge?: Nudge;
47
+ } | undefined], {
48
+ type: "do";
49
+ instruction: string;
50
+ nudge: Nudge | undefined;
51
+ }>, StepDefinition<"dont", [instruction: string, options?: {
52
+ nudge?: Nudge;
53
+ } | undefined], {
54
+ type: "dont";
55
+ instruction: string;
56
+ nudge: Nudge | undefined;
57
+ }>, StepDefinition<"constraint", [rule: string, options?: {
58
+ nudge?: Nudge;
59
+ } | undefined], {
60
+ type: "constraint";
61
+ rule: string;
62
+ nudge: Nudge | undefined;
63
+ }>, StepDefinition<"example", [inputText: string, outputText: string], {
64
+ type: "example";
65
+ input: string;
66
+ output: string;
67
+ }>];
68
+ //#endregion
69
+ //#region src/types.d.ts
70
+ type PromptVariant = {
71
+ name: string;
72
+ steps: BaseStep[];
73
+ };
74
+ /** A test case for evaluating prompt quality */
75
+ type PromptTest = {
76
+ /** Input to send to the AI with this prompt */
77
+ input: string;
78
+ /** Function to validate the output, or string for LLM judge assertion */
79
+ assert: ((output: string) => boolean) | string;
80
+ /** Optional description of what this test checks */
81
+ description?: string;
82
+ };
83
+ type PromptBuilderState = {
84
+ steps: BaseStep[];
85
+ variants?: PromptVariant[];
86
+ tests?: PromptTest[];
87
+ };
88
+ //#endregion
89
+ //#region src/nudge.d.ts
90
+ type MethodFromDefinition<D, B> = D extends StepDefinition<string, infer Args, any> ? (...args: Args) => B : never;
91
+ type ExtractDef<Defs extends readonly AnyStepDefinition[], Name extends string> = Extract<Defs[number], {
92
+ name: Name;
93
+ }>;
94
+ type PromptBuilder<Defs extends readonly AnyStepDefinition[], Optionals extends string = never, Variants extends string = never> = { [K in Defs[number] as K["name"]]: MethodFromDefinition<K, PromptBuilder<Defs, Optionals, Variants>> } & {
95
+ do: ExtractDef<Defs, "do"> extends StepDefinition<"do", infer Args, any> ? (...args: Args) => PromptBuilder<Defs, Optionals, Variants> : never;
96
+ use: (source: {
97
+ _state: PromptBuilderState;
98
+ }) => PromptBuilder<Defs, Optionals, Variants>;
99
+ optional: <Name extends string>(name: Name, builderFn: (p: PromptBuilder<Defs>) => PromptBuilder<Defs>) => PromptBuilder<Defs, Optionals | Name, Variants>;
100
+ variant: <Name extends string>(name: Name, builderFn: (p: PromptBuilder<Defs>) => PromptBuilder<Defs>) => PromptBuilder<Defs, Optionals, Variants | Name>;
101
+ /** Add a test case for evaluating this prompt */
102
+ test: (input: string, assert: ((output: string) => boolean) | string, description?: string) => PromptBuilder<Defs, Optionals, Variants>;
103
+ };
104
+ /** Type for the default builder's prompt function */
105
+ type DefaultPromptFn = <Id extends string, Optionals extends string = never, Variants extends string = never>(id: Id, builderFn: (p: PromptBuilder<typeof baseSteps>) => PromptBuilder<typeof baseSteps, Optionals, Variants>) => Prompt<Id, Optionals, Variants>;
106
+ type Builder<Defs extends readonly AnyStepDefinition[] = readonly AnyStepDefinition[]> = {
107
+ /** Create a prompt using this builder's available steps. */
108
+ prompt: <Id extends string, Optionals extends string = never, Variants extends string = never>(id: Id, builderFn: (p: PromptBuilder<Defs>) => PromptBuilder<Defs, Optionals, Variants>) => Prompt<Id, Optionals, Variants>;
109
+ };
110
+ type Prompt<Id extends string = string, Optionals extends string = never, Variants extends string = never> = {
111
+ id: Id;
112
+ _state: PromptBuilderState;
113
+ variantNames: readonly Variants[];
114
+ toString: ToStringOptions<Id, Optionals, Variants>;
115
+ };
116
+ interface PromptRegistry {}
117
+ interface PromptVariables {}
118
+ interface PromptVariants {}
119
+ type VariantsFor<Id extends string> = Id extends keyof PromptVariants ? PromptVariants[Id] : never;
120
+ type VariantOption<V extends string> = [V] extends [never] ? {
121
+ variant?: never;
122
+ } : {
123
+ variant?: V;
124
+ };
125
+ type ToStringOptions<Id extends string, Optionals extends string, Variants extends string> = Id extends keyof PromptVariables ? [PromptVariables[Id]] extends [never] ? [Optionals] extends [never] ? (options?: VariantOption<Variants | VariantsFor<Id>>) => string : (options?: Partial<Record<Optionals, boolean>> & VariantOption<Variants | VariantsFor<Id>>) => string : [Optionals] extends [never] ? (options: Record<PromptVariables[Id] & string, string> & VariantOption<Variants | VariantsFor<Id>>) => string : (options: Record<PromptVariables[Id] & string, string> & Partial<Record<Optionals, boolean>> & VariantOption<Variants | VariantsFor<Id>>) => string : [Optionals] extends [never] ? (options?: VariantOption<Variants>) => string : (options?: Partial<Record<Optionals, boolean>> & VariantOption<Variants>) => string;
126
+ type GeneratedPrompt = {
127
+ variants: Record<string, string>;
128
+ hash: string;
129
+ };
130
+ declare function registerPrompts(prompts: Record<string, GeneratedPrompt>): void;
131
+ /** Format a step for AI consumption using the base step definitions. */
132
+ declare function formatStepForAI(step: BaseStep): string;
133
+ interface CreateBuilderOptions<OmitBase extends boolean = false> {
134
+ /** If true, only use the provided steps without including base steps. Default: false */
135
+ omitBaseSteps?: OmitBase;
136
+ }
137
+ declare function createBuilder<Defs extends readonly AnyStepDefinition[]>(customSteps: Defs, options: CreateBuilderOptions<true>): Builder<Defs>;
138
+ declare function createBuilder<Defs extends readonly AnyStepDefinition[] = readonly []>(customSteps?: Defs, options?: CreateBuilderOptions<false>): Builder<readonly [...typeof baseSteps, ...Defs]>;
139
+ //#endregion
140
+ export { PromptRegistry as a, createBuilder as c, PromptBuilderState as d, PromptTest as f, createStep as h, Prompt as i, formatStepForAI as l, StepDefinition as m, DefaultPromptFn as n, PromptVariables as o, BaseStep as p, GeneratedPrompt as r, PromptVariants as s, Builder as t, registerPrompts as u };
141
+ //# sourceMappingURL=nudge-D5w_m7nH.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nudge-D5w_m7nH.d.cts","names":[],"sources":["../src/create-step.ts","../src/base-steps.ts","../src/types.ts","../src/nudge.ts"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1,218 @@
1
+ //#region src/create-step.ts
2
+ /**
3
+ * Creates a step definition that can be used to extend a builder.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * const tone = createStep({
8
+ * name: 'tone',
9
+ * build: (style: string) => ({ type: 'tone', style }),
10
+ * format: (step) => `[Tone] Write in a ${step.style} tone`,
11
+ * });
12
+ * ```
13
+ */
14
+ function createStep(definition) {
15
+ return definition;
16
+ }
17
+
18
+ //#endregion
19
+ //#region src/base-steps.ts
20
+ function formatNudge(nudge$1) {
21
+ if (!nudge$1 || nudge$1 === 3) return "";
22
+ return `\nNudge: ${nudge$1}`;
23
+ }
24
+ const raw = createStep({
25
+ name: "raw",
26
+ build: (value) => ({
27
+ type: "raw",
28
+ value
29
+ }),
30
+ format: (step) => `[Raw Text] (Include this text verbatim in the system prompt.)\nValue: "${step.value}"`
31
+ });
32
+ const persona = createStep({
33
+ name: "persona",
34
+ build: (role) => ({
35
+ type: "persona",
36
+ role
37
+ }),
38
+ format: (step) => `[Persona] (Define the identity and role the AI should assume. Frame this as 'You are...' at the start of the system prompt.)\nValue: "${step.role}"`
39
+ });
40
+ const input = createStep({
41
+ name: "input",
42
+ build: (description) => ({
43
+ type: "input",
44
+ description
45
+ }),
46
+ format: (step) => `[Input] (Describe what input the AI will receive from the user. Help the AI understand the context of what it will be working with.)\nValue: "${step.description}"`
47
+ });
48
+ const output = createStep({
49
+ name: "output",
50
+ build: (description) => ({
51
+ type: "output",
52
+ description
53
+ }),
54
+ format: (step) => `[Output] (Specify what the AI should produce as output. Be clear about the expected format and content.)\nValue: "${step.description}"`
55
+ });
56
+ const context = createStep({
57
+ name: "context",
58
+ build: (information) => ({
59
+ type: "context",
60
+ information
61
+ }),
62
+ format: (step) => `[Context] (Background information or context that helps the AI understand the situation. This is not an instruction, just helpful information.)\nValue: "${step.information}"`
63
+ });
64
+ const doStep = createStep({
65
+ name: "do",
66
+ build: (instruction, options) => ({
67
+ type: "do",
68
+ instruction,
69
+ nudge: options?.nudge
70
+ }),
71
+ format: (step) => `[Do] (A positive instruction the AI must follow.)\nValue: "${step.instruction}"${formatNudge(step.nudge)}`
72
+ });
73
+ const dont = createStep({
74
+ name: "dont",
75
+ build: (instruction, options) => ({
76
+ type: "dont",
77
+ instruction,
78
+ nudge: options?.nudge
79
+ }),
80
+ format: (step) => `[Don't] (A negative instruction - something the AI must avoid.)\nValue: "${step.instruction}"${formatNudge(step.nudge)}`
81
+ });
82
+ const constraint = createStep({
83
+ name: "constraint",
84
+ build: (rule, options) => ({
85
+ type: "constraint",
86
+ rule,
87
+ nudge: options?.nudge
88
+ }),
89
+ format: (step) => `[Constraint] (A rule or limitation the AI must respect.)\nValue: "${step.rule}"${formatNudge(step.nudge)}`
90
+ });
91
+ const example = createStep({
92
+ name: "example",
93
+ build: (inputText, outputText) => ({
94
+ type: "example",
95
+ input: inputText,
96
+ output: outputText
97
+ }),
98
+ format: (step) => `[Example] (An input/output example showing the AI how to respond. Use these to demonstrate the expected behavior.)\nInput: "${step.input}"\nExpected output: "${step.output}"`
99
+ });
100
+ const baseSteps = [
101
+ raw,
102
+ persona,
103
+ input,
104
+ output,
105
+ context,
106
+ doStep,
107
+ dont,
108
+ constraint,
109
+ example
110
+ ];
111
+
112
+ //#endregion
113
+ //#region src/nudge.ts
114
+ let promptCache = {};
115
+ function registerPrompts(prompts) {
116
+ promptCache = {
117
+ ...promptCache,
118
+ ...prompts
119
+ };
120
+ }
121
+ function processTemplate(text, options = {}) {
122
+ const processOptionals = (str) => str.replace(/\{\{#(\w+)\}\}([\s\S]*?)\{\{\/\1\}\}/g, (_, name, content) => options[name] ? processOptionals(content) : "");
123
+ const processVars = (str) => str.replace(/\{\{(?![#\/])(\w+)\}\}/g, (match, name) => {
124
+ const value = options[name];
125
+ return typeof value === "string" ? value : match;
126
+ });
127
+ return processVars(processOptionals(text)).replace(/\n{3,}/g, "\n\n");
128
+ }
129
+ const baseStepDefinitions = /* @__PURE__ */ new Map();
130
+ for (const def of baseSteps) baseStepDefinitions.set(def.name, def);
131
+ /** Format a step for AI consumption using the base step definitions. */
132
+ function formatStepForAI(step) {
133
+ if (step.type === "optional") {
134
+ const opt = step;
135
+ const inner = opt.steps.map(formatStepForAI).join("\n\n");
136
+ return `[Optional Block Start: "${opt.name}"] (The following instructions are OPTIONAL. Wrap the generated content for these in {{#${opt.name}}}...{{/${opt.name}}} markers so it can be toggled at runtime.)\n\n${inner}\n\n[Optional Block End: "${opt.name}"]`;
137
+ }
138
+ const def = baseStepDefinitions.get(step.type);
139
+ if (!def) return `[Unknown Step: ${step.type}]`;
140
+ return def.format(step);
141
+ }
142
+ function createBuilder(customSteps = [], options = {}) {
143
+ const { omitBaseSteps = false } = options;
144
+ const allDefs = omitBaseSteps ? customSteps : [...baseSteps, ...customSteps];
145
+ const definitions = /* @__PURE__ */ new Map();
146
+ for (const def of allDefs) definitions.set(def.name, def);
147
+ function createPromptBuilder(state) {
148
+ const builder = {};
149
+ for (const [name, def] of definitions) builder[name] = (...args) => {
150
+ state.steps.push(def.build(...args));
151
+ return builder;
152
+ };
153
+ builder.use = (source) => {
154
+ state.steps.push(...source._state.steps);
155
+ return builder;
156
+ };
157
+ builder.optional = (name, builderFn) => {
158
+ const innerState = { steps: [] };
159
+ builderFn(createPromptBuilder(innerState));
160
+ state.steps.push({
161
+ type: "optional",
162
+ name,
163
+ steps: innerState.steps
164
+ });
165
+ return builder;
166
+ };
167
+ builder.variant = (name, builderFn) => {
168
+ const innerState = { steps: [] };
169
+ builderFn(createPromptBuilder(innerState));
170
+ if (!state.variants) state.variants = [];
171
+ state.variants.push({
172
+ name,
173
+ steps: innerState.steps
174
+ });
175
+ return builder;
176
+ };
177
+ builder.test = (input$1, assert, description) => {
178
+ if (!state.tests) state.tests = [];
179
+ state.tests.push({
180
+ input: input$1,
181
+ assert,
182
+ description
183
+ });
184
+ return builder;
185
+ };
186
+ return builder;
187
+ }
188
+ function formatStep(step) {
189
+ if (step.type === "optional") {
190
+ const opt = step;
191
+ const inner = opt.steps.map(formatStep).join("\n\n");
192
+ return `[Optional Block Start: "${opt.name}"] (The following instructions are OPTIONAL. Wrap the generated content for these in {{#${opt.name}}}...{{/${opt.name}}} markers so it can be toggled at runtime.)\n\n${inner}\n\n[Optional Block End: "${opt.name}"]`;
193
+ }
194
+ const def = definitions.get(step.type);
195
+ if (!def) return `[Unknown Step: ${step.type}]`;
196
+ return def.format(step);
197
+ }
198
+ return { prompt: (id, builderFn) => {
199
+ const state = { steps: [] };
200
+ builderFn(createPromptBuilder(state));
201
+ return {
202
+ id,
203
+ _state: state,
204
+ variantNames: state.variants?.map((v) => v.name) ?? [],
205
+ toString: ((options$1) => {
206
+ const cached = promptCache[id];
207
+ if (!cached) return "";
208
+ const variantName = options$1?.variant ?? "default";
209
+ return processTemplate(cached.variants[variantName] ?? cached.variants["default"] ?? "", options$1).trim();
210
+ })
211
+ };
212
+ } };
213
+ }
214
+ const nudge = createBuilder(baseSteps, { omitBaseSteps: true });
215
+
216
+ //#endregion
217
+ export { createStep as a, registerPrompts as i, formatStepForAI as n, nudge as r, createBuilder as t };
218
+ //# sourceMappingURL=nudge-R1WAnc_7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nudge-R1WAnc_7.mjs","names":["nudge","options"],"sources":["../src/create-step.ts","../src/base-steps.ts","../src/nudge.ts"],"sourcesContent":["// Nudge levels for instructions (1 = gentlest, 5 = strongest)\nexport type Nudge = 1 | 2 | 3 | 4 | 5;\n\n// Base step shape - all steps have a type\nexport type BaseStep = { type: string };\n\n// Step definition - defines how to build and format a step\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type StepDefinition<\n Name extends string = string,\n Args extends any[] = any[],\n Step extends BaseStep = any,\n> = {\n name: Name;\n build: (...args: Args) => Step;\n format: (step: Step) => string;\n};\n\n// Type alias for any step definition (used in arrays/maps)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyStepDefinition = StepDefinition<string, any[], any>;\n\n/**\n * Creates a step definition that can be used to extend a builder.\n *\n * @example\n * ```ts\n * const tone = createStep({\n * name: 'tone',\n * build: (style: string) => ({ type: 'tone', style }),\n * format: (step) => `[Tone] Write in a ${step.style} tone`,\n * });\n * ```\n */\nexport function createStep<\n Name extends string,\n Args extends unknown[],\n Step extends BaseStep & { type: Name },\n>(\n definition: StepDefinition<Name, Args, Step>,\n): StepDefinition<Name, Args, Step> {\n return definition;\n}\n","import { createStep, type BaseStep, type Nudge } from \"./create-step.js\";\n\n// ============================================================================\n// Step Types\n// ============================================================================\n\nexport type RawStep = { type: \"raw\"; value: string };\nexport type PersonaStep = { type: \"persona\"; role: string };\nexport type InputStep = { type: \"input\"; description: string };\nexport type OutputStep = { type: \"output\"; description: string };\nexport type ContextStep = { type: \"context\"; information: string };\nexport type DoStep = { type: \"do\"; instruction: string; nudge?: Nudge };\nexport type DontStep = { type: \"dont\"; instruction: string; nudge?: Nudge };\nexport type ConstraintStep = {\n type: \"constraint\";\n rule: string;\n nudge?: Nudge;\n};\nexport type ExampleStep = { type: \"example\"; input: string; output: string };\n\n// Built-in special step types (handled by builder, not extensible)\nexport type OptionalStep = {\n type: \"optional\";\n name: string;\n steps: BaseStep[];\n};\n\n// Union of all built-in step types\nexport type BuiltInStep =\n | RawStep\n | PersonaStep\n | InputStep\n | OutputStep\n | ContextStep\n | DoStep\n | DontStep\n | ConstraintStep\n | ExampleStep\n | OptionalStep;\n\n// ============================================================================\n// Format Helpers\n// ============================================================================\n\nfunction formatNudge(nudge?: Nudge): string {\n if (!nudge || nudge === 3) return \"\";\n return `\\nNudge: ${nudge}`;\n}\n\n// ============================================================================\n// Step Definitions\n// ============================================================================\n\nexport const raw = createStep({\n name: \"raw\",\n build: (value: string) => ({ type: \"raw\" as const, value }),\n format: (step) =>\n `[Raw Text] (Include this text verbatim in the system prompt.)\\nValue: \"${step.value}\"`,\n});\n\nexport const persona = createStep({\n name: \"persona\",\n build: (role: string) => ({ type: \"persona\" as const, role }),\n format: (step) =>\n `[Persona] (Define the identity and role the AI should assume. Frame this as 'You are...' at the start of the system prompt.)\\nValue: \"${step.role}\"`,\n});\n\nexport const input = createStep({\n name: \"input\",\n build: (description: string) => ({ type: \"input\" as const, description }),\n format: (step) =>\n `[Input] (Describe what input the AI will receive from the user. Help the AI understand the context of what it will be working with.)\\nValue: \"${step.description}\"`,\n});\n\nexport const output = createStep({\n name: \"output\",\n build: (description: string) => ({ type: \"output\" as const, description }),\n format: (step) =>\n `[Output] (Specify what the AI should produce as output. Be clear about the expected format and content.)\\nValue: \"${step.description}\"`,\n});\n\nexport const context = createStep({\n name: \"context\",\n build: (information: string) => ({ type: \"context\" as const, information }),\n format: (step) =>\n `[Context] (Background information or context that helps the AI understand the situation. This is not an instruction, just helpful information.)\\nValue: \"${step.information}\"`,\n});\n\nexport const doStep = createStep({\n name: \"do\",\n build: (instruction: string, options?: { nudge?: Nudge }) => ({\n type: \"do\" as const,\n instruction,\n nudge: options?.nudge,\n }),\n format: (step) =>\n `[Do] (A positive instruction the AI must follow.)\\nValue: \"${step.instruction}\"${formatNudge(step.nudge)}`,\n});\n\nexport const dont = createStep({\n name: \"dont\",\n build: (instruction: string, options?: { nudge?: Nudge }) => ({\n type: \"dont\" as const,\n instruction,\n nudge: options?.nudge,\n }),\n format: (step) =>\n `[Don't] (A negative instruction - something the AI must avoid.)\\nValue: \"${step.instruction}\"${formatNudge(step.nudge)}`,\n});\n\nexport const constraint = createStep({\n name: \"constraint\",\n build: (rule: string, options?: { nudge?: Nudge }) => ({\n type: \"constraint\" as const,\n rule,\n nudge: options?.nudge,\n }),\n format: (step) =>\n `[Constraint] (A rule or limitation the AI must respect.)\\nValue: \"${step.rule}\"${formatNudge(step.nudge)}`,\n});\n\nexport const example = createStep({\n name: \"example\",\n build: (inputText: string, outputText: string) => ({\n type: \"example\" as const,\n input: inputText,\n output: outputText,\n }),\n format: (step) =>\n `[Example] (An input/output example showing the AI how to respond. Use these to demonstrate the expected behavior.)\\nInput: \"${step.input}\"\\nExpected output: \"${step.output}\"`,\n});\n\n// ============================================================================\n// All base steps for easy import\n// ============================================================================\n\nexport const baseSteps = [\n raw,\n persona,\n input,\n output,\n context,\n doStep,\n dont,\n constraint,\n example,\n] as const;\n","import { baseSteps, type OptionalStep } from \"./base-steps.js\";\nimport {\n type AnyStepDefinition,\n type BaseStep,\n type StepDefinition,\n} from \"./create-step.js\";\nimport type { PromptBuilderState, PromptTest } from \"./types.js\";\n\n// ============================================================================\n// Type Helpers\n// ============================================================================\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype MethodFromDefinition<D, B> =\n D extends StepDefinition<string, infer Args, any>\n ? (...args: Args) => B\n : never;\n\n// The prompt builder type with all step methods + built-in special methods\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExtractDef<\n Defs extends readonly AnyStepDefinition[],\n Name extends string,\n> = Extract<Defs[number], { name: Name }>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype PromptBuilder<\n Defs extends readonly AnyStepDefinition[],\n Optionals extends string = never,\n Variants extends string = never,\n> = {\n // Map each step definition to a method\n [K in Defs[number] as K[\"name\"]]: MethodFromDefinition<\n K,\n PromptBuilder<Defs, Optionals, Variants>\n >;\n} & {\n // 'do' needs special handling (reserved keyword) - extract the specific definition\n do: ExtractDef<Defs, \"do\"> extends StepDefinition<\"do\", infer Args, any>\n ? (...args: Args) => PromptBuilder<Defs, Optionals, Variants>\n : never;\n // Built-in special methods (always available)\n use: (source: {\n _state: PromptBuilderState;\n }) => PromptBuilder<Defs, Optionals, Variants>;\n optional: <Name extends string>(\n name: Name,\n builderFn: (p: PromptBuilder<Defs>) => PromptBuilder<Defs>,\n ) => PromptBuilder<Defs, Optionals | Name, Variants>;\n variant: <Name extends string>(\n name: Name,\n builderFn: (p: PromptBuilder<Defs>) => PromptBuilder<Defs>,\n ) => PromptBuilder<Defs, Optionals, Variants | Name>;\n /** Add a test case for evaluating this prompt */\n test: (\n input: string,\n assert: ((output: string) => boolean) | string,\n description?: string,\n ) => PromptBuilder<Defs, Optionals, Variants>;\n};\n\n// ============================================================================\n// Builder Type\n// ============================================================================\n\n/** Type for the default builder's prompt function */\nexport type DefaultPromptFn = <\n Id extends string,\n Optionals extends string = never,\n Variants extends string = never,\n>(\n id: Id,\n builderFn: (\n p: PromptBuilder<typeof baseSteps>,\n ) => PromptBuilder<typeof baseSteps, Optionals, Variants>,\n) => Prompt<Id, Optionals, Variants>;\n\nexport type Builder<\n Defs extends readonly AnyStepDefinition[] = readonly AnyStepDefinition[],\n> = {\n /** Create a prompt using this builder's available steps. */\n prompt: <\n Id extends string,\n Optionals extends string = never,\n Variants extends string = never,\n >(\n id: Id,\n builderFn: (\n p: PromptBuilder<Defs>,\n ) => PromptBuilder<Defs, Optionals, Variants>,\n ) => Prompt<Id, Optionals, Variants>;\n};\n\nexport type Prompt<\n Id extends string = string,\n Optionals extends string = never,\n Variants extends string = never,\n> = {\n id: Id;\n _state: PromptBuilderState;\n variantNames: readonly Variants[];\n toString: ToStringOptions<Id, Optionals, Variants>;\n};\n\n// ============================================================================\n// ToString Type Helpers\n// ============================================================================\n\nexport interface PromptRegistry {}\nexport interface PromptVariables {}\nexport interface PromptVariants {}\n\ntype VariantsFor<Id extends string> = Id extends keyof PromptVariants\n ? PromptVariants[Id]\n : never;\n\ntype VariantOption<V extends string> = [V] extends [never]\n ? { variant?: never }\n : { variant?: V };\n\ntype ToStringOptions<\n Id extends string,\n Optionals extends string,\n Variants extends string,\n> = Id extends keyof PromptVariables\n ? [PromptVariables[Id]] extends [never]\n ? [Optionals] extends [never]\n ? (options?: VariantOption<Variants | VariantsFor<Id>>) => string\n : (\n options?: Partial<Record<Optionals, boolean>> &\n VariantOption<Variants | VariantsFor<Id>>,\n ) => string\n : [Optionals] extends [never]\n ? (\n options: Record<PromptVariables[Id] & string, string> &\n VariantOption<Variants | VariantsFor<Id>>,\n ) => string\n : (\n options: Record<PromptVariables[Id] & string, string> &\n Partial<Record<Optionals, boolean>> &\n VariantOption<Variants | VariantsFor<Id>>,\n ) => string\n : [Optionals] extends [never]\n ? (options?: VariantOption<Variants>) => string\n : (\n options?: Partial<Record<Optionals, boolean>> & VariantOption<Variants>,\n ) => string;\n\n// ============================================================================\n// Prompt Cache\n// ============================================================================\n\nexport type GeneratedPrompt = {\n variants: Record<string, string>;\n hash: string;\n};\n\nlet promptCache: Record<string, GeneratedPrompt> = {};\n\nexport function registerPrompts(\n prompts: Record<string, GeneratedPrompt>,\n): void {\n promptCache = { ...promptCache, ...prompts };\n}\n\nfunction processTemplate(\n text: string,\n options: Record<string, string | boolean> = {},\n): string {\n const processOptionals = (str: string): string =>\n str.replace(/\\{\\{#(\\w+)\\}\\}([\\s\\S]*?)\\{\\{\\/\\1\\}\\}/g, (_, name, content) =>\n options[name] ? processOptionals(content) : \"\",\n );\n const processVars = (str: string): string =>\n str.replace(/\\{\\{(?![#\\/])(\\w+)\\}\\}/g, (match, name) => {\n const value = options[name];\n return typeof value === \"string\" ? value : match;\n });\n return processVars(processOptionals(text)).replace(/\\n{3,}/g, \"\\n\\n\");\n}\n\n// ============================================================================\n// Format Step for AI (standalone utility)\n// ============================================================================\n\nconst baseStepDefinitions = new Map<string, AnyStepDefinition>();\nfor (const def of baseSteps) {\n baseStepDefinitions.set(def.name, def);\n}\n\n/** Format a step for AI consumption using the base step definitions. */\nexport function formatStepForAI(step: BaseStep): string {\n if (step.type === \"optional\") {\n const opt = step as OptionalStep;\n const inner = opt.steps.map(formatStepForAI).join(\"\\n\\n\");\n return `[Optional Block Start: \"${opt.name}\"] (The following instructions are OPTIONAL. Wrap the generated content for these in {{#${opt.name}}}...{{/${opt.name}}} markers so it can be toggled at runtime.)\\n\\n${inner}\\n\\n[Optional Block End: \"${opt.name}\"]`;\n }\n const def = baseStepDefinitions.get(step.type);\n if (!def) return `[Unknown Step: ${step.type}]`;\n return def.format(step);\n}\n\n// ============================================================================\n// Create Builder\n// ============================================================================\n\nexport interface CreateBuilderOptions<OmitBase extends boolean = false> {\n /** If true, only use the provided steps without including base steps. Default: false */\n omitBaseSteps?: OmitBase;\n}\n\n// Overload: with omitBaseSteps: true, only custom steps are available\nexport function createBuilder<Defs extends readonly AnyStepDefinition[]>(\n customSteps: Defs,\n options: CreateBuilderOptions<true>,\n): Builder<Defs>;\n\n// Overload: default behavior includes base steps\nexport function createBuilder<\n Defs extends readonly AnyStepDefinition[] = readonly [],\n>(\n customSteps?: Defs,\n options?: CreateBuilderOptions<false>,\n): Builder<readonly [...typeof baseSteps, ...Defs]>;\n\n// Implementation\nexport function createBuilder<\n Defs extends readonly AnyStepDefinition[] = readonly [],\n>(\n customSteps: Defs = [] as unknown as Defs,\n options: CreateBuilderOptions<boolean> = {},\n): Builder<readonly AnyStepDefinition[]> {\n const { omitBaseSteps = false } = options;\n const allDefs = omitBaseSteps ? customSteps : [...baseSteps, ...customSteps];\n\n const definitions = new Map<string, AnyStepDefinition>();\n for (const def of allDefs) {\n definitions.set(def.name, def);\n }\n\n // Create the inner prompt builder\n function createPromptBuilder(\n state: PromptBuilderState,\n ): Record<string, unknown> {\n const builder: Record<string, unknown> = {};\n\n // Add methods for each step definition\n for (const [name, def] of definitions) {\n builder[name] = (...args: unknown[]) => {\n state.steps.push(def.build(...args));\n return builder;\n };\n }\n\n // Built-in: use\n builder.use = (source: { _state: PromptBuilderState }) => {\n state.steps.push(...source._state.steps);\n return builder;\n };\n\n // Built-in: optional\n builder.optional = (name: string, builderFn: (p: unknown) => unknown) => {\n const innerState: PromptBuilderState = { steps: [] };\n const innerBuilder = createPromptBuilder(innerState);\n builderFn(innerBuilder);\n state.steps.push({\n type: \"optional\",\n name,\n steps: innerState.steps,\n } as BaseStep);\n return builder;\n };\n\n // Built-in: variant\n builder.variant = (name: string, builderFn: (p: unknown) => unknown) => {\n const innerState: PromptBuilderState = { steps: [] };\n const innerBuilder = createPromptBuilder(innerState);\n builderFn(innerBuilder);\n if (!state.variants) state.variants = [];\n state.variants.push({ name, steps: innerState.steps });\n return builder;\n };\n\n // Built-in: test\n builder.test = (\n input: string,\n assert: ((output: string) => boolean) | string,\n description?: string,\n ) => {\n if (!state.tests) state.tests = [];\n state.tests.push({ input, assert, description });\n return builder;\n };\n\n return builder;\n }\n\n // Format a step for AI consumption\n function formatStep(step: BaseStep): string {\n if (step.type === \"optional\") {\n const opt = step as OptionalStep;\n const inner = opt.steps.map(formatStep).join(\"\\n\\n\");\n return `[Optional Block Start: \"${opt.name}\"] (The following instructions are OPTIONAL. Wrap the generated content for these in {{#${opt.name}}}...{{/${opt.name}}} markers so it can be toggled at runtime.)\\n\\n${inner}\\n\\n[Optional Block End: \"${opt.name}\"]`;\n }\n const def = definitions.get(step.type);\n if (!def) return `[Unknown Step: ${step.type}]`;\n return def.format(step);\n }\n\n return {\n prompt: <\n Id extends string,\n Optionals extends string = never,\n Variants extends string = never,\n >(\n id: Id,\n builderFn: (\n p: PromptBuilder<readonly AnyStepDefinition[]>,\n ) => PromptBuilder<readonly AnyStepDefinition[], Optionals, Variants>,\n ): Prompt<Id, Optionals, Variants> => {\n const state: PromptBuilderState = { steps: [] };\n const builder = createPromptBuilder(state);\n builderFn(builder as PromptBuilder<readonly AnyStepDefinition[]>);\n\n return {\n id,\n _state: state,\n variantNames: (state.variants?.map((v) => v.name) ?? []) as Variants[],\n toString: ((options?: Record<string, string | boolean>) => {\n const cached = promptCache[id];\n if (!cached) return \"\";\n const variantName = (options?.variant as string) ?? \"default\";\n const text =\n cached.variants[variantName] ?? cached.variants[\"default\"] ?? \"\";\n return processTemplate(text, options).trim();\n }) as Prompt<Id, Optionals, Variants>[\"toString\"],\n };\n },\n };\n}\n\n// ============================================================================\n// Default Builder\n// ============================================================================\n\nexport const nudge = createBuilder(baseSteps, { omitBaseSteps: true });\n\nexport type DefaultBuilder = PromptBuilder<typeof baseSteps>;\n"],"mappings":"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"}