liminal 0.5.16 → 0.6.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.
- package/CHANGELOG.md +12 -0
- package/Context.ts +11 -47
- package/L.ts +4 -0
- package/LEvent.ts +20 -53
- package/_emit.ts +16 -0
- package/assistant.ts +53 -0
- package/dist/Context.d.ts +15 -30
- package/dist/Context.js +9 -22
- package/dist/Context.js.map +1 -1
- package/dist/L.d.ts +4 -0
- package/dist/L.js +5 -0
- package/dist/L.js.map +1 -0
- package/dist/LEvent.d.ts +29 -62
- package/dist/LEvent.js +14 -46
- package/dist/LEvent.js.map +1 -1
- package/dist/_emit.d.ts +2 -0
- package/dist/_emit.js +16 -0
- package/dist/_emit.js.map +1 -0
- package/dist/assistant.d.ts +8 -0
- package/dist/assistant.js +46 -0
- package/dist/assistant.js.map +1 -0
- package/dist/index.d.ts +2 -13
- package/dist/index.js +2 -13
- package/dist/index.js.map +1 -1
- package/dist/messages.d.ts +4 -0
- package/dist/messages.js +4 -0
- package/dist/messages.js.map +1 -0
- package/dist/set.d.ts +4 -0
- package/dist/set.js +9 -0
- package/dist/set.js.map +1 -0
- package/dist/strand.d.ts +16 -0
- package/dist/strand.js +16 -0
- package/dist/strand.js.map +1 -0
- package/dist/todo.test.js +3 -0
- package/dist/todo.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/user.d.ts +6 -0
- package/dist/user.js +18 -0
- package/dist/user.js.map +1 -0
- package/dist/util/JSONValue.d.ts +0 -3
- package/dist/util/JSONValue.js +1 -31
- package/dist/util/JSONValue.js.map +1 -1
- package/dist/util/fixTemplateStrings.d.ts +11 -0
- package/dist/util/fixTemplateStrings.js +83 -0
- package/dist/util/fixTemplateStrings.js.map +1 -0
- package/index.ts +2 -13
- package/messages.ts +5 -0
- package/package.json +4 -3
- package/set.ts +10 -0
- package/strand.ts +38 -0
- package/todo.test.ts +3 -0
- package/user.ts +24 -0
- package/util/JSONValue.ts +0 -30
- package/util/fixTemplateStrings.ts +99 -0
- package/Adapter.ts +0 -27
- package/AdapterRegistry.ts +0 -78
- package/Config.ts +0 -13
- package/Definition.ts +0 -48
- package/EventBase.ts +0 -23
- package/Handler.ts +0 -4
- package/L/L.ts +0 -24
- package/L/all.ts +0 -39
- package/L/assistant.ts +0 -28
- package/L/catch.ts +0 -38
- package/L/continuation.ts +0 -14
- package/L/emit.ts +0 -16
- package/L/focus.ts +0 -17
- package/L/infer.ts +0 -34
- package/L/message.ts +0 -16
- package/L/reflect.ts +0 -13
- package/L/run.ts +0 -30
- package/L/schema/_schema_common.ts +0 -29
- package/L/schema/anyOf.ts +0 -10
- package/L/schema/array.ts +0 -13
- package/L/schema/boolean.ts +0 -8
- package/L/schema/const.ts +0 -18
- package/L/schema/enum.ts +0 -18
- package/L/schema/integer.ts +0 -6
- package/L/schema/null.ts +0 -8
- package/L/schema/number.ts +0 -8
- package/L/schema/object.ts +0 -21
- package/L/schema/string.ts +0 -11
- package/L/strand.ts +0 -22
- package/L/stream.ts +0 -16
- package/L/system.ts +0 -18
- package/L/user.ts +0 -18
- package/LiminalAssertionError.ts +0 -19
- package/Message.ts +0 -16
- package/Rune.test.ts +0 -5
- package/Rune.ts +0 -60
- package/Schema.ts +0 -185
- package/Strand.ts +0 -284
- package/Tool.ts +0 -26
- package/TypeAdapter.ts +0 -3
- package/dist/Adapter.d.ts +0 -18
- package/dist/Adapter.js +0 -13
- package/dist/Adapter.js.map +0 -1
- package/dist/AdapterRegistry.d.ts +0 -27
- package/dist/AdapterRegistry.js +0 -62
- package/dist/AdapterRegistry.js.map +0 -1
- package/dist/Config.d.ts +0 -12
- package/dist/Config.js +0 -2
- package/dist/Config.js.map +0 -1
- package/dist/Definition.d.ts +0 -24
- package/dist/Definition.js +0 -29
- package/dist/Definition.js.map +0 -1
- package/dist/EventBase.d.ts +0 -11
- package/dist/EventBase.js +0 -16
- package/dist/EventBase.js.map +0 -1
- package/dist/Handler.d.ts +0 -3
- package/dist/Handler.js +0 -2
- package/dist/Handler.js.map +0 -1
- package/dist/L/L.d.ts +0 -24
- package/dist/L/L.js +0 -25
- package/dist/L/L.js.map +0 -1
- package/dist/L/all.d.ts +0 -14
- package/dist/L/all.js +0 -20
- package/dist/L/all.js.map +0 -1
- package/dist/L/assistant.d.ts +0 -11
- package/dist/L/assistant.js +0 -15
- package/dist/L/assistant.js.map +0 -1
- package/dist/L/catch.d.ts +0 -16
- package/dist/L/catch.js +0 -25
- package/dist/L/catch.js.map +0 -1
- package/dist/L/continuation.d.ts +0 -4
- package/dist/L/continuation.js +0 -13
- package/dist/L/continuation.js.map +0 -1
- package/dist/L/emit.d.ts +0 -7
- package/dist/L/emit.js +0 -15
- package/dist/L/emit.js.map +0 -1
- package/dist/L/focus.d.ts +0 -8
- package/dist/L/focus.js +0 -14
- package/dist/L/focus.js.map +0 -1
- package/dist/L/infer.d.ts +0 -8
- package/dist/L/infer.js +0 -30
- package/dist/L/infer.js.map +0 -1
- package/dist/L/message.d.ts +0 -8
- package/dist/L/message.js +0 -14
- package/dist/L/message.js.map +0 -1
- package/dist/L/reflect.d.ts +0 -5
- package/dist/L/reflect.js +0 -11
- package/dist/L/reflect.js.map +0 -1
- package/dist/L/run.d.ts +0 -16
- package/dist/L/run.js +0 -16
- package/dist/L/run.js.map +0 -1
- package/dist/L/schema/_schema_common.d.ts +0 -6
- package/dist/L/schema/_schema_common.js +0 -19
- package/dist/L/schema/_schema_common.js.map +0 -1
- package/dist/L/schema/anyOf.d.ts +0 -5
- package/dist/L/schema/anyOf.js +0 -5
- package/dist/L/schema/anyOf.js.map +0 -1
- package/dist/L/schema/array.d.ts +0 -5
- package/dist/L/schema/array.js +0 -8
- package/dist/L/schema/array.js.map +0 -1
- package/dist/L/schema/boolean.d.ts +0 -6
- package/dist/L/schema/boolean.js +0 -4
- package/dist/L/schema/boolean.js.map +0 -1
- package/dist/L/schema/const.d.ts +0 -8
- package/dist/L/schema/const.js +0 -10
- package/dist/L/schema/const.js.map +0 -1
- package/dist/L/schema/enum.d.ts +0 -8
- package/dist/L/schema/enum.js +0 -10
- package/dist/L/schema/enum.js.map +0 -1
- package/dist/L/schema/integer.d.ts +0 -5
- package/dist/L/schema/integer.js +0 -3
- package/dist/L/schema/integer.js.map +0 -1
- package/dist/L/schema/null.d.ts +0 -6
- package/dist/L/schema/null.js +0 -4
- package/dist/L/schema/null.js.map +0 -1
- package/dist/L/schema/number.d.ts +0 -6
- package/dist/L/schema/number.js +0 -4
- package/dist/L/schema/number.js.map +0 -1
- package/dist/L/schema/object.d.ts +0 -9
- package/dist/L/schema/object.js +0 -12
- package/dist/L/schema/object.js.map +0 -1
- package/dist/L/schema/string.d.ts +0 -8
- package/dist/L/schema/string.js +0 -4
- package/dist/L/schema/string.js.map +0 -1
- package/dist/L/strand.d.ts +0 -9
- package/dist/L/strand.js +0 -16
- package/dist/L/strand.js.map +0 -1
- package/dist/L/stream.d.ts +0 -4
- package/dist/L/stream.js +0 -15
- package/dist/L/stream.js.map +0 -1
- package/dist/L/system.d.ts +0 -4
- package/dist/L/system.js +0 -8
- package/dist/L/system.js.map +0 -1
- package/dist/L/user.d.ts +0 -4
- package/dist/L/user.js +0 -8
- package/dist/L/user.js.map +0 -1
- package/dist/LiminalAssertionError.d.ts +0 -8
- package/dist/LiminalAssertionError.js +0 -20
- package/dist/LiminalAssertionError.js.map +0 -1
- package/dist/Message.d.ts +0 -14
- package/dist/Message.js +0 -2
- package/dist/Message.js.map +0 -1
- package/dist/Rune.d.ts +0 -46
- package/dist/Rune.js +0 -11
- package/dist/Rune.js.map +0 -1
- package/dist/Rune.test.js +0 -5
- package/dist/Rune.test.js.map +0 -1
- package/dist/Schema.d.ts +0 -46
- package/dist/Schema.js +0 -130
- package/dist/Schema.js.map +0 -1
- package/dist/Strand.d.ts +0 -81
- package/dist/Strand.js +0 -200
- package/dist/Strand.js.map +0 -1
- package/dist/Tool.d.ts +0 -10
- package/dist/Tool.js +0 -19
- package/dist/Tool.js.map +0 -1
- package/dist/TypeAdapter.d.ts +0 -1
- package/dist/TypeAdapter.js +0 -3
- package/dist/TypeAdapter.js.map +0 -1
- package/dist/errors.d.ts +0 -9
- package/dist/errors.js +0 -11
- package/dist/errors.js.map +0 -1
- package/dist/util/EnsureNarrow.d.ts +0 -1
- package/dist/util/EnsureNarrow.js +0 -2
- package/dist/util/EnsureNarrow.js.map +0 -1
- package/dist/util/attachCustomInspect.d.ts +0 -1
- package/dist/util/attachCustomInspect.js +0 -11
- package/dist/util/attachCustomInspect.js.map +0 -1
- package/errors.ts +0 -12
- package/util/EnsureNarrow.ts +0 -1
- package/util/attachCustomInspect.ts +0 -14
- /package/dist/{Rune.test.d.ts → todo.test.d.ts} +0 -0
package/dist/user.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { Handler, MessagesRef } from "./Context.ts";
|
|
3
|
+
export declare const user: {
|
|
4
|
+
(template: TemplateStringsArray, ...substitutions: Array<unknown>): Effect.Effect<void, never, MessagesRef | Handler>;
|
|
5
|
+
(message: string): Effect.Effect<void, never, MessagesRef | Handler>;
|
|
6
|
+
};
|
package/dist/user.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { AiInput } from "@effect/ai";
|
|
2
|
+
import { Effect, Ref } from "effect";
|
|
3
|
+
import { _emit } from "./_emit.js";
|
|
4
|
+
import { Handler, MessagesRef } from "./Context.js";
|
|
5
|
+
import { MessageAppended } from "./LEvent.js";
|
|
6
|
+
import { isTemplateStringsArray } from "./util/isTemplateStringsArray.js";
|
|
7
|
+
export const user = Effect.fn(function* (e0, ...eRest) {
|
|
8
|
+
const message = new AiInput.UserMessage({
|
|
9
|
+
parts: [
|
|
10
|
+
new AiInput.TextPart({
|
|
11
|
+
text: isTemplateStringsArray(e0) ? String.raw({ raw: e0 }, ...eRest) : e0,
|
|
12
|
+
}),
|
|
13
|
+
],
|
|
14
|
+
});
|
|
15
|
+
yield* _emit(new MessageAppended({ message }));
|
|
16
|
+
yield* Ref.update(yield* MessagesRef, (messages) => [...messages, message]);
|
|
17
|
+
});
|
|
18
|
+
//# sourceMappingURL=user.js.map
|
package/dist/user.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAEzE,MAAM,CAAC,MAAM,IAAI,GAMb,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAC,EAAE,EAAE,GAAG,KAAK;IAClC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC;QACtC,KAAK,EAAE;YACL,IAAI,OAAO,CAAC,QAAQ,CAAC;gBACnB,IAAI,EAAE,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;aAC1E,CAAC;SACH;KACF,CAAC,CAAA;IACF,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;IAC9C,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,GAAG,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;AAC7E,CAAC,CAAU,CAAA"}
|
package/dist/util/JSONValue.d.ts
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
export type JSONValue = null | boolean | number | string | JSONValueArray | JSONValueObject;
|
|
2
|
-
export declare namespace JSONValue {
|
|
3
|
-
function assert(value: unknown, visited?: Set<object>): asserts value is JSONValue;
|
|
4
|
-
}
|
|
5
2
|
export type JSONValueArray = Array<JSONValue>;
|
|
6
3
|
export type JSONValueObject = {
|
|
7
4
|
[key: string]: JSONValue;
|
package/dist/util/JSONValue.js
CHANGED
|
@@ -1,32 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export var JSONValue;
|
|
3
|
-
(function (JSONValue) {
|
|
4
|
-
function assert(value, visited = new Set()) {
|
|
5
|
-
if (value === null)
|
|
6
|
-
return;
|
|
7
|
-
const t = typeof value;
|
|
8
|
-
if (typeof value !== "object") {
|
|
9
|
-
LiminalAssertionError.assert(t === "string" || t === "number" || t === "boolean");
|
|
10
|
-
return;
|
|
11
|
-
}
|
|
12
|
-
LiminalAssertionError.assert(!visited.has(value));
|
|
13
|
-
visited.add(value);
|
|
14
|
-
try {
|
|
15
|
-
if (Array.isArray(value)) {
|
|
16
|
-
for (let i = 0; i < value.length; i++) {
|
|
17
|
-
assert(value[i], new Set(visited));
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
for (const key in value) {
|
|
22
|
-
assert(value[key], new Set(visited));
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
finally {
|
|
27
|
-
visited.delete(value);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
JSONValue.assert = assert;
|
|
31
|
-
})(JSONValue || (JSONValue = {}));
|
|
1
|
+
export {};
|
|
32
2
|
//# sourceMappingURL=JSONValue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JSONValue.js","sourceRoot":"","sources":["../../util/JSONValue.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"JSONValue.js","sourceRoot":"","sources":["../../util/JSONValue.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function fixTemplateStrings(template: TemplateStringsArray): {
|
|
2
|
+
readonly raw: readonly string[];
|
|
3
|
+
};
|
|
4
|
+
/**
|
|
5
|
+
* Applies template string indentation to substituted values with line breaks
|
|
6
|
+
*
|
|
7
|
+
* @param strings - The template strings array (processed through fixTemplateStrings)
|
|
8
|
+
* @param values - The substitution values
|
|
9
|
+
* @returns - The formatted string with properly indented substitutions
|
|
10
|
+
*/
|
|
11
|
+
export declare function applyTemplateWithIndentation(strings: TemplateStringsArray, ...values: any[]): string;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
const INDENTATION_RE = /^\n([ \t]+)/;
|
|
2
|
+
const ESCAPE_SEQ_RE = /\\([`${\\]|\n)/g;
|
|
3
|
+
const LAST_INDENTATION_RE = /\n[ \t]+$/;
|
|
4
|
+
export function fixTemplateStrings(template) {
|
|
5
|
+
const firstSegment = template.raw[0];
|
|
6
|
+
const leadingIndentMatch = INDENTATION_RE.exec(firstSegment);
|
|
7
|
+
const indentation = leadingIndentMatch?.[1];
|
|
8
|
+
const rawLength = template.raw.length;
|
|
9
|
+
const result = new Array(rawLength);
|
|
10
|
+
for (let i = 0; i < rawLength; i++) {
|
|
11
|
+
let str = template.raw[i];
|
|
12
|
+
// Only perform common indentation replacements if needed
|
|
13
|
+
if (indentation) {
|
|
14
|
+
// Remove leading newline and indentation in the first segment
|
|
15
|
+
if (i === 0) {
|
|
16
|
+
str = str.slice(indentation.length + 1);
|
|
17
|
+
}
|
|
18
|
+
// Use a simple string replacement with a regular expression for better performance
|
|
19
|
+
str = str.replaceAll(`\n${indentation}`, "\n");
|
|
20
|
+
}
|
|
21
|
+
// Replace common escape sequences in a single pass
|
|
22
|
+
str = str.replace(ESCAPE_SEQ_RE, (_match, char) => {
|
|
23
|
+
// Keep the escaped newline replacement separate for clarity
|
|
24
|
+
return char === "\n" ? "" : char;
|
|
25
|
+
});
|
|
26
|
+
// Handle trailing spaces only for the last segment
|
|
27
|
+
if (indentation && i === rawLength - 1) {
|
|
28
|
+
str = str.replace(LAST_INDENTATION_RE, "");
|
|
29
|
+
}
|
|
30
|
+
result[i] = str;
|
|
31
|
+
}
|
|
32
|
+
return { raw: result };
|
|
33
|
+
}
|
|
34
|
+
const LEADING_SPACE_RE = /^([ \t]*)/;
|
|
35
|
+
/**
|
|
36
|
+
* Applies template string indentation to substituted values with line breaks
|
|
37
|
+
*
|
|
38
|
+
* @param strings - The template strings array (processed through fixTemplateStrings)
|
|
39
|
+
* @param values - The substitution values
|
|
40
|
+
* @returns - The formatted string with properly indented substitutions
|
|
41
|
+
*/
|
|
42
|
+
export function applyTemplateWithIndentation(strings, ...values) {
|
|
43
|
+
const fixedStrings = fixTemplateStrings(strings);
|
|
44
|
+
const rawArr = fixedStrings.raw;
|
|
45
|
+
const valuesLength = values.length;
|
|
46
|
+
const resultParts = new Array(Math.max(1, rawArr.length * 2 - 1));
|
|
47
|
+
let resultIndex = 0;
|
|
48
|
+
for (let i = 0; i < rawArr.length; i++) {
|
|
49
|
+
const str = rawArr[i] || "";
|
|
50
|
+
resultParts[resultIndex++] = str;
|
|
51
|
+
// Only process values for non-final segments
|
|
52
|
+
if (i < valuesLength) {
|
|
53
|
+
const value = String(values[i]);
|
|
54
|
+
// If value has line breaks, we should indent it
|
|
55
|
+
if (value.includes("\n")) {
|
|
56
|
+
const lastNewlineIndex = str.lastIndexOf("\n");
|
|
57
|
+
if (lastNewlineIndex !== -1) {
|
|
58
|
+
// Extract the indentation after the last newline
|
|
59
|
+
const textAfterLastNewline = str.substring(lastNewlineIndex + 1);
|
|
60
|
+
const leadingSpaceMatch = LEADING_SPACE_RE.exec(textAfterLastNewline);
|
|
61
|
+
const indentationToApply = leadingSpaceMatch && leadingSpaceMatch[1] ? leadingSpaceMatch[1] : "";
|
|
62
|
+
if (indentationToApply) {
|
|
63
|
+
// Split the value into lines once
|
|
64
|
+
const lines = value.split("\n");
|
|
65
|
+
const linesLength = lines.length;
|
|
66
|
+
// First line doesn't need indentation
|
|
67
|
+
resultParts[resultIndex++] = lines[0];
|
|
68
|
+
// Apply indentation to subsequent lines
|
|
69
|
+
for (let j = 1; j < linesLength; j++) {
|
|
70
|
+
resultParts[resultIndex++] = "\n" + indentationToApply + lines[j];
|
|
71
|
+
}
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// For simple values or when no indentation is needed
|
|
77
|
+
resultParts[resultIndex++] = value;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Combine all parts at once
|
|
81
|
+
return resultParts.slice(0, resultIndex).join("");
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=fixTemplateStrings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixTemplateStrings.js","sourceRoot":"","sources":["../../util/fixTemplateStrings.ts"],"names":[],"mappings":"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"}
|
package/index.ts
CHANGED
|
@@ -1,15 +1,4 @@
|
|
|
1
|
-
export * from "./Adapter.ts"
|
|
2
|
-
export * from "./AdapterRegistry.ts"
|
|
3
|
-
export * from "./Config.ts"
|
|
4
1
|
export * from "./Context.ts"
|
|
5
|
-
export * from "./
|
|
6
|
-
export * from "./EventBase.ts"
|
|
7
|
-
export * as L from "./L/L.ts"
|
|
2
|
+
export * as L from "./L.ts"
|
|
8
3
|
export * from "./LEvent.ts"
|
|
9
|
-
export * from "./
|
|
10
|
-
export * from "./Message.ts"
|
|
11
|
-
export * from "./Rune.ts"
|
|
12
|
-
export * from "./Schema.ts"
|
|
13
|
-
export * from "./Strand.ts"
|
|
14
|
-
export * from "./Tool.ts"
|
|
15
|
-
export * from "./TypeAdapter.ts"
|
|
4
|
+
export * from "./strand.ts"
|
package/messages.ts
ADDED
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "0.
|
|
6
|
+
"version": "0.6.0",
|
|
7
7
|
"license": "Apache-2.0",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
"exports": {
|
|
16
16
|
".": "./dist/index.js"
|
|
17
17
|
},
|
|
18
|
-
"
|
|
19
|
-
"
|
|
18
|
+
"peerDependencies": {
|
|
19
|
+
"@effect/ai": "^0.18.2",
|
|
20
|
+
"effect": "^3.16.3"
|
|
20
21
|
}
|
|
21
22
|
}
|
package/set.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AiInput } from "@effect/ai"
|
|
2
|
+
import { Effect, Ref } from "effect"
|
|
3
|
+
import { MessagesRef } from "./Context.ts"
|
|
4
|
+
|
|
5
|
+
export const set = Effect.fn(function*(messages: Iterable<AiInput.Message>) {
|
|
6
|
+
const messagesRef = yield* MessagesRef
|
|
7
|
+
const previous = yield* Ref.get(messagesRef)
|
|
8
|
+
yield* Ref.set(messagesRef, [...messages])
|
|
9
|
+
return previous
|
|
10
|
+
})
|
package/strand.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { AiInput, AiTool, AiToolkit } from "@effect/ai"
|
|
2
|
+
import { Effect, Option, Ref } from "effect"
|
|
3
|
+
import { Handler, MessagesRef, System, Toolkit } from "./Context.ts"
|
|
4
|
+
import { LEvent } from "./LEvent.ts"
|
|
5
|
+
|
|
6
|
+
export interface StrandOptions<E, R, in out T extends AiTool.Any> {
|
|
7
|
+
/** The system prompt. */
|
|
8
|
+
system?: string | undefined
|
|
9
|
+
/** The initial list of AI input messages. */
|
|
10
|
+
messages?: Iterable<AiInput.Message> | undefined
|
|
11
|
+
/** The liminal event handler. */
|
|
12
|
+
handler?: ((event: LEvent) => Effect.Effect<any, E, R>) | undefined
|
|
13
|
+
/** The tools to use for by strand. */
|
|
14
|
+
tools?: AiToolkit.AiToolkit<T> | undefined
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Create an isolated clone of the current conversation to provide for an effect. */
|
|
18
|
+
export const strand: <HE = never, HR = never, T extends AiTool.Any = never>(
|
|
19
|
+
options?: StrandOptions<HE, HR, T>,
|
|
20
|
+
) => <A, E, R>(
|
|
21
|
+
effect: Effect.Effect<A, E, R>,
|
|
22
|
+
) => Effect.Effect<A, E | HE, Exclude<R, MessagesRef | System | Handler> | T> = (options) => (effect) =>
|
|
23
|
+
Effect.gen(function*() {
|
|
24
|
+
const messagesRef = options?.messages
|
|
25
|
+
? Ref.unsafeMake([...options.messages])
|
|
26
|
+
: yield* Option.match(yield* Effect.serviceOption(MessagesRef), {
|
|
27
|
+
*onSome(ref) {
|
|
28
|
+
return Ref.unsafeMake([...yield* Ref.get(ref)])
|
|
29
|
+
},
|
|
30
|
+
onNone: () => Ref.make([] as Array<AiInput.Message>),
|
|
31
|
+
})
|
|
32
|
+
return yield* (effect.pipe(
|
|
33
|
+
Effect.provideService(MessagesRef, messagesRef),
|
|
34
|
+
Effect.provideService(System, options?.system),
|
|
35
|
+
Effect.provideService(Handler, options?.handler),
|
|
36
|
+
Effect.provideService(Toolkit, options?.tools),
|
|
37
|
+
))
|
|
38
|
+
}) as never // TODO
|
package/todo.test.ts
ADDED
package/user.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { AiInput } from "@effect/ai"
|
|
2
|
+
import { Effect, Ref } from "effect"
|
|
3
|
+
import { _emit } from "./_emit.ts"
|
|
4
|
+
import { Handler, MessagesRef } from "./Context.ts"
|
|
5
|
+
import { MessageAppended } from "./LEvent.ts"
|
|
6
|
+
import { isTemplateStringsArray } from "./util/isTemplateStringsArray.ts"
|
|
7
|
+
|
|
8
|
+
export const user: {
|
|
9
|
+
(
|
|
10
|
+
template: TemplateStringsArray,
|
|
11
|
+
...substitutions: Array<unknown>
|
|
12
|
+
): Effect.Effect<void, never, MessagesRef | Handler>
|
|
13
|
+
(message: string): Effect.Effect<void, never, MessagesRef | Handler>
|
|
14
|
+
} = Effect.fn(function*(e0, ...eRest) {
|
|
15
|
+
const message = new AiInput.UserMessage({
|
|
16
|
+
parts: [
|
|
17
|
+
new AiInput.TextPart({
|
|
18
|
+
text: isTemplateStringsArray(e0) ? String.raw({ raw: e0 }, ...eRest) : e0,
|
|
19
|
+
}),
|
|
20
|
+
],
|
|
21
|
+
})
|
|
22
|
+
yield* _emit(new MessageAppended({ message }))
|
|
23
|
+
yield* Ref.update(yield* MessagesRef, (messages) => [...messages, message])
|
|
24
|
+
}) as never
|
package/util/JSONValue.ts
CHANGED
|
@@ -1,34 +1,4 @@
|
|
|
1
|
-
import { LiminalAssertionError } from "liminal"
|
|
2
|
-
|
|
3
1
|
export type JSONValue = null | boolean | number | string | JSONValueArray | JSONValueObject
|
|
4
|
-
export namespace JSONValue {
|
|
5
|
-
export function assert(
|
|
6
|
-
value: unknown,
|
|
7
|
-
visited: Set<object> = new Set<object>(),
|
|
8
|
-
): asserts value is JSONValue {
|
|
9
|
-
if (value === null) return
|
|
10
|
-
const t = typeof value
|
|
11
|
-
if (typeof value !== "object") {
|
|
12
|
-
LiminalAssertionError.assert(t === "string" || t === "number" || t === "boolean")
|
|
13
|
-
return
|
|
14
|
-
}
|
|
15
|
-
LiminalAssertionError.assert(!visited.has(value))
|
|
16
|
-
visited.add(value)
|
|
17
|
-
try {
|
|
18
|
-
if (Array.isArray(value)) {
|
|
19
|
-
for (let i = 0; i < value.length; i++) {
|
|
20
|
-
assert(value[i], new Set(visited))
|
|
21
|
-
}
|
|
22
|
-
} else {
|
|
23
|
-
for (const key in value) {
|
|
24
|
-
assert(value[key as never], new Set(visited))
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
} finally {
|
|
28
|
-
visited.delete(value)
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
2
|
|
|
33
3
|
export type JSONValueArray = Array<JSONValue>
|
|
34
4
|
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
const INDENTATION_RE = /^\n([ \t]+)/
|
|
2
|
+
const ESCAPE_SEQ_RE = /\\([`${\\]|\n)/g
|
|
3
|
+
const LAST_INDENTATION_RE = /\n[ \t]+$/
|
|
4
|
+
|
|
5
|
+
export function fixTemplateStrings(template: TemplateStringsArray): { readonly raw: readonly string[] } {
|
|
6
|
+
const firstSegment = template.raw[0]!
|
|
7
|
+
const leadingIndentMatch = INDENTATION_RE.exec(firstSegment)
|
|
8
|
+
const indentation = leadingIndentMatch?.[1]
|
|
9
|
+
|
|
10
|
+
const rawLength = template.raw.length
|
|
11
|
+
const result = new Array(rawLength)
|
|
12
|
+
|
|
13
|
+
for (let i = 0; i < rawLength; i++) {
|
|
14
|
+
let str = template.raw[i]!
|
|
15
|
+
// Only perform common indentation replacements if needed
|
|
16
|
+
if (indentation) {
|
|
17
|
+
// Remove leading newline and indentation in the first segment
|
|
18
|
+
if (i === 0) {
|
|
19
|
+
str = str.slice(indentation.length + 1)
|
|
20
|
+
}
|
|
21
|
+
// Use a simple string replacement with a regular expression for better performance
|
|
22
|
+
str = str.replaceAll(`\n${indentation}`, "\n")
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Replace common escape sequences in a single pass
|
|
26
|
+
str = str.replace(ESCAPE_SEQ_RE, (_match, char) => {
|
|
27
|
+
// Keep the escaped newline replacement separate for clarity
|
|
28
|
+
return char === "\n" ? "" : char
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
// Handle trailing spaces only for the last segment
|
|
32
|
+
if (indentation && i === rawLength - 1) {
|
|
33
|
+
str = str.replace(LAST_INDENTATION_RE, "")
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
result[i] = str
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return { raw: result }
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const LEADING_SPACE_RE = /^([ \t]*)/
|
|
43
|
+
/**
|
|
44
|
+
* Applies template string indentation to substituted values with line breaks
|
|
45
|
+
*
|
|
46
|
+
* @param strings - The template strings array (processed through fixTemplateStrings)
|
|
47
|
+
* @param values - The substitution values
|
|
48
|
+
* @returns - The formatted string with properly indented substitutions
|
|
49
|
+
*/
|
|
50
|
+
export function applyTemplateWithIndentation(strings: TemplateStringsArray, ...values: any[]): string {
|
|
51
|
+
const fixedStrings = fixTemplateStrings(strings)
|
|
52
|
+
const rawArr = fixedStrings.raw
|
|
53
|
+
const valuesLength = values.length
|
|
54
|
+
|
|
55
|
+
const resultParts = new Array(Math.max(1, rawArr.length * 2 - 1))
|
|
56
|
+
let resultIndex = 0
|
|
57
|
+
|
|
58
|
+
for (let i = 0; i < rawArr.length; i++) {
|
|
59
|
+
const str = rawArr[i] || ""
|
|
60
|
+
resultParts[resultIndex++] = str
|
|
61
|
+
|
|
62
|
+
// Only process values for non-final segments
|
|
63
|
+
if (i < valuesLength) {
|
|
64
|
+
const value = String(values[i])
|
|
65
|
+
|
|
66
|
+
// If value has line breaks, we should indent it
|
|
67
|
+
if (value.includes("\n")) {
|
|
68
|
+
const lastNewlineIndex = str.lastIndexOf("\n")
|
|
69
|
+
|
|
70
|
+
if (lastNewlineIndex !== -1) {
|
|
71
|
+
// Extract the indentation after the last newline
|
|
72
|
+
const textAfterLastNewline = str.substring(lastNewlineIndex + 1)
|
|
73
|
+
const leadingSpaceMatch = LEADING_SPACE_RE.exec(textAfterLastNewline)
|
|
74
|
+
const indentationToApply = leadingSpaceMatch && leadingSpaceMatch[1] ? leadingSpaceMatch[1] : ""
|
|
75
|
+
|
|
76
|
+
if (indentationToApply) {
|
|
77
|
+
// Split the value into lines once
|
|
78
|
+
const lines = value.split("\n")
|
|
79
|
+
const linesLength = lines.length
|
|
80
|
+
|
|
81
|
+
// First line doesn't need indentation
|
|
82
|
+
resultParts[resultIndex++] = lines[0]
|
|
83
|
+
|
|
84
|
+
// Apply indentation to subsequent lines
|
|
85
|
+
for (let j = 1; j < linesLength; j++) {
|
|
86
|
+
resultParts[resultIndex++] = "\n" + indentationToApply + lines[j]
|
|
87
|
+
}
|
|
88
|
+
continue
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// For simple values or when no indentation is needed
|
|
93
|
+
resultParts[resultIndex++] = value
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Combine all parts at once
|
|
98
|
+
return resultParts.slice(0, resultIndex).join("")
|
|
99
|
+
}
|
package/Adapter.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import type { Message } from "./Message.ts"
|
|
2
|
-
import type { SchemaObject } from "./Schema.ts"
|
|
3
|
-
import type { Tool } from "./Tool.ts"
|
|
4
|
-
import { attachCustomInspect } from "./util/attachCustomInspect.ts"
|
|
5
|
-
|
|
6
|
-
export class Adapter {
|
|
7
|
-
constructor(
|
|
8
|
-
readonly name: string,
|
|
9
|
-
readonly seal: (envelope: Envelope) => SealedEnvelope,
|
|
10
|
-
) {}
|
|
11
|
-
|
|
12
|
-
static {
|
|
13
|
-
attachCustomInspect(this, ({ name }) => ({ name }))
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface Envelope {
|
|
18
|
-
messages: Array<Message>
|
|
19
|
-
schema?: SchemaObject | undefined
|
|
20
|
-
signal: AbortSignal
|
|
21
|
-
tools?: Set<Tool> | undefined
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export interface SealedEnvelope {
|
|
25
|
-
resolve: () => Promise<string>
|
|
26
|
-
stream: () => ReadableStream<string>
|
|
27
|
-
}
|
package/AdapterRegistry.ts
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import type { Adapter } from "./Adapter.ts"
|
|
2
|
-
import { LiminalAssertionError } from "./LiminalAssertionError.ts"
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* An intrusive doubly-linked list for storing `Model`s.
|
|
6
|
-
* Provides efficient insertion, removal, and lookups.
|
|
7
|
-
*/
|
|
8
|
-
export class AdapterRegistry {
|
|
9
|
-
declare head?: ModelRegistryNode | undefined
|
|
10
|
-
declare tail?: ModelRegistryNode | undefined
|
|
11
|
-
|
|
12
|
-
/** Returns the most recently registered model */
|
|
13
|
-
peek() {
|
|
14
|
-
return this.tail?.adapter
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/** Ensure */
|
|
18
|
-
ensure(): Adapter {
|
|
19
|
-
LiminalAssertionError.assert(
|
|
20
|
-
this.tail,
|
|
21
|
-
"No conversation adapter registered. Use `L.focus` to focus a conversation adapter.",
|
|
22
|
-
)
|
|
23
|
-
return this.tail.adapter
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Registers a new model and returns the created node
|
|
28
|
-
* @param value The model to register
|
|
29
|
-
*/
|
|
30
|
-
register(value: Adapter): ModelRegistryNode {
|
|
31
|
-
const node: ModelRegistryNode = {
|
|
32
|
-
prev: this.tail,
|
|
33
|
-
adapter: value,
|
|
34
|
-
}
|
|
35
|
-
if (this.tail) {
|
|
36
|
-
this.tail.next = node
|
|
37
|
-
} else {
|
|
38
|
-
this.head = node
|
|
39
|
-
}
|
|
40
|
-
this.tail = node
|
|
41
|
-
return node
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/** Remove a model from the registry. */
|
|
45
|
-
remove(node: ModelRegistryNode) {
|
|
46
|
-
if (node.prev) {
|
|
47
|
-
node.prev.next = node.next
|
|
48
|
-
}
|
|
49
|
-
if (node.next) {
|
|
50
|
-
node.next.prev = node.prev
|
|
51
|
-
}
|
|
52
|
-
if (node === this.head) {
|
|
53
|
-
this.head = node.next
|
|
54
|
-
}
|
|
55
|
-
if (node === this.tail) {
|
|
56
|
-
this.tail = node.prev
|
|
57
|
-
}
|
|
58
|
-
node.prev = undefined
|
|
59
|
-
delete node.next
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/** Creates a deep copy of this registry. */
|
|
63
|
-
clone() {
|
|
64
|
-
const instance = new AdapterRegistry()
|
|
65
|
-
for (let node = this.head; node; node = node.next) {
|
|
66
|
-
if (node.adapter) {
|
|
67
|
-
instance.register(node.adapter)
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
return instance
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
export interface ModelRegistryNode {
|
|
75
|
-
prev: ModelRegistryNode | undefined
|
|
76
|
-
adapter: Adapter
|
|
77
|
-
next?: ModelRegistryNode | undefined
|
|
78
|
-
}
|
package/Config.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { AdapterRegistry } from "./AdapterRegistry.ts"
|
|
2
|
-
import type { Message } from "./Message.ts"
|
|
3
|
-
import type { Rune } from "./Rune.ts"
|
|
4
|
-
import type { Strand } from "./Strand.ts"
|
|
5
|
-
import type { Tool } from "./Tool.ts"
|
|
6
|
-
|
|
7
|
-
export interface Config<Y extends Rune<any> = Rune<any>, T = any> {
|
|
8
|
-
handler?: ((this: Strand<Y, T>, event: Rune.E<Y>) => void) | undefined
|
|
9
|
-
models?: AdapterRegistry | undefined
|
|
10
|
-
messages?: Array<Message>
|
|
11
|
-
tools?: Set<Tool> | undefined
|
|
12
|
-
signal?: AbortSignal | undefined
|
|
13
|
-
}
|
package/Definition.ts
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import type { Rune } from "./Rune.ts"
|
|
2
|
-
|
|
3
|
-
export type RuneIterator<Y extends Rune<any> = Rune<any>, T = any> = Iterator<Y, T> | AsyncIterator<Y, T>
|
|
4
|
-
|
|
5
|
-
export type RuneIterable<Y extends Rune<any> = Rune<any>, T = any> = Iterable<Y, T> | AsyncIterable<Y, T>
|
|
6
|
-
|
|
7
|
-
export type Definition<Y extends Rune<any> = Rune<any>, T = any> = RuneIterable<Y, T> | (() => RuneIterable<Y, T>)
|
|
8
|
-
|
|
9
|
-
export namespace Definition {
|
|
10
|
-
/** Extracts the Rune type from a Definition. */
|
|
11
|
-
export type Y<X extends Definition> = X extends RuneIterable<infer Y> ? Y
|
|
12
|
-
: X extends () => RuneIterable<infer Y> ? Y
|
|
13
|
-
: X extends RuneIterator<infer Y> ? Y
|
|
14
|
-
: never
|
|
15
|
-
|
|
16
|
-
/** Extracts the result type from a Definition. */
|
|
17
|
-
export type T<X extends Definition> = X extends RuneIterable<Rune<any>, infer T> ? T
|
|
18
|
-
: X extends () => RuneIterable<Rune<any>, infer T> ? T
|
|
19
|
-
: X extends RuneIterator<Rune<any>, infer T> ? T
|
|
20
|
-
: never
|
|
21
|
-
|
|
22
|
-
/** Extracts the event type from a Definition. */
|
|
23
|
-
export type E<X extends Definition> = Rune.E<Y<X>>
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Converts a Definition into a RuneIterator.
|
|
27
|
-
*
|
|
28
|
-
* This function handles all the different forms a Definition can take:
|
|
29
|
-
* - Synchronous iterables
|
|
30
|
-
* - Asynchronous iterables
|
|
31
|
-
* - Factory functions returning iterables
|
|
32
|
-
*
|
|
33
|
-
* @param definition The definition to unwrap.
|
|
34
|
-
* @returns A RuneIterator ready for consumption.
|
|
35
|
-
*/
|
|
36
|
-
export function unwrap<Y extends Rune<any>, T>(definition: Definition<Y, T>): RuneIterator<Y, T> {
|
|
37
|
-
if (Symbol.iterator in definition) {
|
|
38
|
-
return definition[Symbol.iterator]()
|
|
39
|
-
} else if (Symbol.asyncIterator in definition) {
|
|
40
|
-
return definition[Symbol.asyncIterator]()
|
|
41
|
-
}
|
|
42
|
-
const iterable = definition()
|
|
43
|
-
if (Symbol.iterator in iterable) {
|
|
44
|
-
return iterable[Symbol.iterator]()
|
|
45
|
-
}
|
|
46
|
-
return iterable[Symbol.asyncIterator]()
|
|
47
|
-
}
|
|
48
|
-
}
|
package/EventBase.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { attachCustomInspect } from "./util/attachCustomInspect.ts"
|
|
2
|
-
|
|
3
|
-
export interface EventBase<B extends symbol = symbol, K extends string = string> {
|
|
4
|
-
readonly brand: B
|
|
5
|
-
readonly type: K
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export function EventBase<B extends symbol, K extends string>(brand: B, type: K) {
|
|
9
|
-
return class implements EventBase<B, K> {
|
|
10
|
-
static is<T>(this: new(...args: any) => T, value: unknown): value is T {
|
|
11
|
-
return typeof value === "object" && value !== null
|
|
12
|
-
&& "brand" in value && value.brand === brand
|
|
13
|
-
&& "type" in value && value.type === type
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
readonly brand = brand
|
|
17
|
-
readonly type = type
|
|
18
|
-
|
|
19
|
-
static {
|
|
20
|
-
attachCustomInspect(this, ({ brand: _0, type: _1, ...rest }) => rest)
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
package/Handler.ts
DELETED