@xandreed/core 0.4.0 → 0.8.0-next.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/README.md +1 -1
- package/dist/conformance.entity.d.ts +15 -0
- package/dist/conformance.entity.js +7 -0
- package/dist/decision-record.entity.d.ts +23 -23
- package/dist/decision-record.entity.functions.d.ts +6 -0
- package/dist/decision-record.entity.functions.js +3 -0
- package/dist/decision-record.entity.js +4 -4
- package/dist/domain/agent-failure.entity.d.ts +6 -6
- package/dist/domain/agent-failure.entity.js +12 -1
- package/dist/domain/failure.entity.d.ts +2 -2
- package/dist/domain/loop-event.entity.d.ts +2 -0
- package/dist/domain/message.entity.d.ts +143 -156
- package/dist/domain/message.entity.js +6 -6
- package/dist/domain/model-call-policy.entity.d.ts +3 -3
- package/dist/domain/model-call-policy.entity.js +1 -1
- package/dist/domain/model-catalog.entity.d.ts +4 -4
- package/dist/domain/model-catalog.entity.js +1 -1
- package/dist/domain/model-selection.entity.d.ts +6 -13
- package/dist/domain/prompt-provenance.entity.d.ts +6 -6
- package/dist/domain/prompt-provenance.entity.js +4 -4
- package/dist/domain/token-usage.entity.d.ts +4 -4
- package/dist/harness/capability.entity.d.ts +88 -41
- package/dist/harness/capability.entity.functions.d.ts +30 -1
- package/dist/harness/capability.entity.functions.js +55 -2
- package/dist/harness/capability.entity.js +33 -12
- package/dist/harness/config.entity.d.ts +28 -28
- package/dist/harness/config.entity.js +4 -4
- package/dist/harness/plugin-stack.adapter.d.ts +24 -0
- package/dist/harness/plugin-stack.adapter.js +8 -0
- package/dist/harness/plugin-stack.adapter.test.d.ts +1 -0
- package/dist/harness/plugin.adapter.d.ts +15 -4
- package/dist/harness/plugin.adapter.js +18 -11
- package/dist/harness/plugin.adapter.test.d.ts +1 -0
- package/dist/harness/plugin.entity.d.ts +26 -10
- package/dist/harness/plugin.entity.js +1 -1
- package/dist/harness/session.entity.d.ts +20 -20
- package/dist/harness/session.entity.js +1 -1
- package/dist/harness/skill-files.d.ts +17 -0
- package/dist/harness/skill-files.js +25 -0
- package/dist/index.d.ts +47 -4
- package/dist/index.js +45 -4
- package/dist/loop/cacheKey.d.ts +3 -3
- package/dist/loop/cacheKey.js +4 -2
- package/dist/loop/mapping.d.ts +4 -5
- package/dist/loop/mapping.js +8 -16
- package/dist/loop/modelPolicy.d.ts +4 -4
- package/dist/loop/modelPolicy.js +2 -2
- package/dist/loop/promptProvenance.d.ts +2 -2
- package/dist/loop/promptProvenance.js +2 -2
- package/dist/loop/stepContext.d.ts +2 -2
- package/dist/loop/stepContext.js +2 -2
- package/dist/loop/streamFold.js +3 -3
- package/dist/loop/toolSchema.d.ts +17 -0
- package/dist/loop/toolSchema.js +25 -0
- package/dist/loop/toolSchema.test.d.ts +1 -0
- package/dist/mcp/bridge.d.ts +15 -15
- package/dist/mcp/bridge.js +14 -14
- package/dist/memory/memory-log.entity.d.ts +320 -0
- package/dist/memory/memory-log.entity.functions.d.ts +89 -0
- package/dist/memory/memory-log.entity.functions.js +180 -0
- package/dist/memory/memory-log.entity.js +75 -0
- package/dist/memory/memory-log.entity.test.d.ts +1 -0
- package/dist/memory/memory-session.d.ts +51 -0
- package/dist/memory/memory-session.js +97 -0
- package/dist/memory/memory-session.test.d.ts +1 -0
- package/dist/memory/memory.conformance.d.ts +32 -0
- package/dist/memory/memory.conformance.js +102 -0
- package/dist/ports/auth-store.port.d.ts +16 -18
- package/dist/ports/auth-store.port.js +13 -9
- package/dist/ports/capability.port.d.ts +131 -7
- package/dist/ports/capability.port.js +2 -2
- package/dist/ports/conversation-store.port.d.ts +54 -177
- package/dist/ports/conversation-store.port.js +9 -9
- package/dist/ports/file-system.port.d.ts +5 -7
- package/dist/ports/file-system.port.js +1 -1
- package/dist/ports/harness.port.d.ts +19 -13
- package/dist/ports/harness.port.js +10 -10
- package/dist/ports/mcp-client.port.d.ts +15 -47
- package/dist/ports/mcp-client.port.js +3 -3
- package/dist/ports/memory.port.d.ts +116 -0
- package/dist/ports/memory.port.js +7 -0
- package/dist/ports/model-catalog.port.d.ts +1 -1
- package/dist/ports/model-catalog.port.js +1 -1
- package/dist/ports/permission.port.d.ts +10 -0
- package/dist/ports/permission.port.js +4 -0
- package/dist/ports/run-context.port.d.ts +28 -0
- package/dist/ports/run-context.port.js +4 -0
- package/dist/ports/session-log.port.d.ts +25 -0
- package/dist/ports/session-log.port.js +4 -0
- package/dist/ports/sessions.port.d.ts +141 -0
- package/dist/ports/sessions.port.js +4 -0
- package/dist/ports/settings-store.port.d.ts +18 -56
- package/dist/ports/settings-store.port.js +3 -3
- package/dist/ports/shell.port.d.ts +9 -21
- package/dist/ports/shell.port.js +1 -1
- package/dist/ports/step-loop.port.d.ts +85 -0
- package/dist/ports/step-loop.port.js +4 -0
- package/dist/ports/tasks.port.d.ts +59 -0
- package/dist/ports/tasks.port.js +10 -0
- package/dist/ports/tool-registry.port.d.ts +53 -0
- package/dist/ports/tool-registry.port.js +4 -0
- package/dist/ports/turn-admission.port.d.ts +23 -0
- package/dist/ports/turn-admission.port.js +4 -0
- package/dist/ports/turn-events.port.d.ts +55 -0
- package/dist/ports/turn-events.port.js +7 -0
- package/dist/ports/turn-scope.port.d.ts +101 -0
- package/dist/ports/turn-scope.port.js +10 -0
- package/dist/ports/turn.port.d.ts +113 -0
- package/dist/ports/turn.port.js +0 -0
- package/dist/ports/utility-llm.port.d.ts +12 -31
- package/dist/ports/utility-llm.port.js +1 -1
- package/dist/session/chassis.js +7 -7
- package/dist/session/session-event.entity.d.ts +55 -0
- package/dist/session/session-event.entity.functions.d.ts +31 -0
- package/dist/session/session-event.entity.functions.js +42 -0
- package/dist/session/session-event.entity.js +37 -0
- package/dist/session/session-event.entity.test.d.ts +1 -0
- package/dist/session/session-log.conformance.d.ts +13 -0
- package/dist/session/session-log.conformance.js +167 -0
- package/dist/session/session-log.entity.d.ts +164 -0
- package/dist/session/session-log.entity.js +82 -0
- package/dist/session/session-log.memory.adapter.d.ts +7 -0
- package/dist/session/session-log.memory.adapter.js +82 -0
- package/dist/session/session-log.memory.adapter.test.d.ts +1 -0
- package/dist/session/sessions.entity.d.ts +201 -0
- package/dist/session/sessions.entity.js +98 -0
- package/dist/session/tasks.entity.d.ts +39 -0
- package/dist/session/tasks.entity.js +26 -0
- package/dist/session/turn-admission.open.adapter.d.ts +4 -0
- package/dist/session/turn-admission.open.adapter.js +3 -0
- package/dist/spec/SpecDoc.d.ts +30 -117
- package/dist/spec/SpecDoc.js +10 -10
- package/dist/spec/codec.js +1 -1
- package/dist/turn/model-request.entity.d.ts +99 -0
- package/dist/turn/model-request.entity.functions.d.ts +108 -0
- package/dist/turn/model-request.entity.functions.js +167 -0
- package/dist/turn/model-request.entity.js +41 -0
- package/dist/turn/model-request.entity.test.d.ts +1 -0
- package/dist/turn/prompt-sections.d.ts +10 -0
- package/dist/turn/prompt-sections.js +3 -0
- package/dist/turn/step-loop.conformance.d.ts +16 -0
- package/dist/turn/step-loop.conformance.js +164 -0
- package/dist/turn/testing.d.ts +30 -0
- package/dist/turn/turn-bus.d.ts +23 -0
- package/dist/turn/turn-bus.js +54 -0
- package/dist/turn/turn-bus.test.d.ts +1 -0
- package/dist/turn/turn-event.entity.d.ts +263 -0
- package/dist/turn/turn-event.entity.functions.d.ts +35 -0
- package/dist/turn/turn-event.entity.functions.js +21 -0
- package/dist/turn/turn-event.entity.js +101 -0
- package/dist/turn/turn-lifecycle.d.ts +32 -0
- package/dist/turn/turn-lifecycle.js +48 -0
- package/dist/turn/turn-run.d.ts +26 -0
- package/dist/turn/turn-run.js +105 -0
- package/dist/turn/turn.adapter.d.ts +21 -0
- package/dist/turn/turn.adapter.js +126 -0
- package/dist/turn/turn.adapter.test.d.ts +1 -0
- package/dist/turn/turn.conformance.d.ts +20 -0
- package/dist/turn/turn.conformance.js +74 -0
- package/dist/turn/user-message.entity.d.ts +14 -0
- package/dist/turn/user-message.entity.js +10 -0
- package/dist/util/json.d.ts +2 -2
- package/dist/util/json.js +10 -10
- package/package.json +2 -3
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { Schema } from "effect";
|
|
2
2
|
/** A selectable model exposed by one configured provider adapter. */
|
|
3
3
|
export declare const ModelCatalogEntry: Schema.Struct<{
|
|
4
|
-
selection:
|
|
4
|
+
readonly selection: Schema.String;
|
|
5
5
|
/** Human-facing route name. `selection` remains the stable persisted id. */
|
|
6
|
-
label: Schema.optional<
|
|
7
|
-
provider:
|
|
8
|
-
credential: Schema.
|
|
6
|
+
readonly label: Schema.optional<Schema.String>;
|
|
7
|
+
readonly provider: Schema.String;
|
|
8
|
+
readonly credential: Schema.Literals<readonly ["api_key", "oauth", "local"]>;
|
|
9
9
|
}>;
|
|
10
10
|
export type ModelCatalogEntry = typeof ModelCatalogEntry.Type;
|
|
@@ -4,21 +4,14 @@ import { Schema } from "effect";
|
|
|
4
4
|
* in settings. The engine treats the provider as an opaque id; which providers
|
|
5
5
|
* exist (and how to build their clients) is the providers package's knowledge.
|
|
6
6
|
*/
|
|
7
|
-
export declare const ProviderId: Schema.brand<
|
|
7
|
+
export declare const ProviderId: Schema.brand<Schema.String, "ProviderId">;
|
|
8
8
|
export type ProviderId = typeof ProviderId.Type;
|
|
9
|
-
export declare const ModelId: Schema.brand<
|
|
9
|
+
export declare const ModelId: Schema.brand<Schema.String, "ModelId">;
|
|
10
10
|
export type ModelId = typeof ModelId.Type;
|
|
11
|
-
declare const ModelSelection_base: Schema.Class<ModelSelection, {
|
|
12
|
-
provider: Schema.brand<
|
|
13
|
-
modelId: Schema.brand<
|
|
14
|
-
}
|
|
15
|
-
provider: Schema.brand<typeof Schema.String, "ProviderId">;
|
|
16
|
-
modelId: Schema.brand<typeof Schema.String, "ModelId">;
|
|
17
|
-
}>, never, {
|
|
18
|
-
readonly provider: string & import("effect/Brand").Brand<"ProviderId">;
|
|
19
|
-
} & {
|
|
20
|
-
readonly modelId: string & import("effect/Brand").Brand<"ModelId">;
|
|
21
|
-
}, {}, {}>;
|
|
11
|
+
declare const ModelSelection_base: Schema.Class<ModelSelection, Schema.Struct<{
|
|
12
|
+
readonly provider: Schema.brand<Schema.String, "ProviderId">;
|
|
13
|
+
readonly modelId: Schema.brand<Schema.String, "ModelId">;
|
|
14
|
+
}>, {}>;
|
|
22
15
|
export declare class ModelSelection extends ModelSelection_base {
|
|
23
16
|
}
|
|
24
17
|
export {};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { Schema } from "effect";
|
|
2
|
-
export declare const PromptId: Schema.brand<
|
|
2
|
+
export declare const PromptId: Schema.brand<Schema.Trimmed, "PromptId">;
|
|
3
3
|
/** Metadata accompanies a native @effect/ai Prompt; it never replaces its messages. */
|
|
4
4
|
export declare const PromptProvenance: Schema.Struct<{
|
|
5
|
-
id: Schema.brand<
|
|
6
|
-
version:
|
|
7
|
-
variant:
|
|
8
|
-
modelOverride: Schema.OptionFromNullOr<
|
|
9
|
-
hash:
|
|
5
|
+
readonly id: Schema.brand<Schema.Trimmed, "PromptId">;
|
|
6
|
+
readonly version: Schema.Trimmed;
|
|
7
|
+
readonly variant: Schema.Trimmed;
|
|
8
|
+
readonly modelOverride: Schema.OptionFromNullOr<Schema.String>;
|
|
9
|
+
readonly hash: Schema.Trimmed;
|
|
10
10
|
}>;
|
|
11
11
|
export type PromptProvenance = typeof PromptProvenance.Type;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Schema } from "effect";
|
|
2
|
-
export const PromptId = Schema.
|
|
2
|
+
export const PromptId = Schema.Trimmed.check(Schema.isNonEmpty()).pipe(Schema.brand("PromptId")), PromptProvenance = Schema.Struct({
|
|
3
3
|
id: PromptId,
|
|
4
|
-
version: Schema.
|
|
5
|
-
variant: Schema.
|
|
4
|
+
version: Schema.Trimmed.check(Schema.isNonEmpty()),
|
|
5
|
+
variant: Schema.Trimmed.check(Schema.isNonEmpty()),
|
|
6
6
|
modelOverride: Schema.OptionFromNullOr(Schema.String),
|
|
7
|
-
hash: Schema.
|
|
7
|
+
hash: Schema.Trimmed.check(Schema.isNonEmpty())
|
|
8
8
|
});
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Schema } from "effect";
|
|
2
2
|
/** Billed tokens for one model call (or a sum of them). */
|
|
3
3
|
export declare const TokenUsage: Schema.Struct<{
|
|
4
|
-
inputTokens:
|
|
5
|
-
outputTokens:
|
|
6
|
-
totalTokens:
|
|
7
|
-
cacheReadTokens:
|
|
4
|
+
readonly inputTokens: Schema.Number;
|
|
5
|
+
readonly outputTokens: Schema.Number;
|
|
6
|
+
readonly totalTokens: Schema.Number;
|
|
7
|
+
readonly cacheReadTokens: Schema.Number;
|
|
8
8
|
}>;
|
|
9
9
|
export type TokenUsage = typeof TokenUsage.Type;
|
|
@@ -1,61 +1,108 @@
|
|
|
1
1
|
import { Schema } from "effect";
|
|
2
|
+
/**
|
|
3
|
+
* What a host contributes to generic capability plugins. Tools, skills and
|
|
4
|
+
* prompt sections are DEFINED by the host; registration, discovery, the
|
|
5
|
+
* active set and prompt assembly belong to the plugins that consume them.
|
|
6
|
+
*/
|
|
7
|
+
export declare const ToolAnnotations: Schema.Struct<{
|
|
8
|
+
/** Read-only tools share a concurrency lane; others run exclusively. */
|
|
9
|
+
readonly readOnly: Schema.Boolean;
|
|
10
|
+
/** Repeat calls with unchanged results are expected (never "degenerate"). */
|
|
11
|
+
readonly pollable: Schema.Boolean;
|
|
12
|
+
/** The result survives every compaction verbatim. */
|
|
13
|
+
readonly pinned: Schema.Boolean;
|
|
14
|
+
/** Grants the run must hold for the tool to be callable. */
|
|
15
|
+
readonly permissions: Schema.$Array<Schema.String>;
|
|
16
|
+
readonly maxCallsPerRun: Schema.OptionFromNullOr<Schema.Int>;
|
|
17
|
+
/** Host display metadata, carried on invocation events. */
|
|
18
|
+
readonly labels: Schema.$Record<Schema.String, Schema.String>;
|
|
19
|
+
readonly stage: Schema.OptionFromNullOr<Schema.String>;
|
|
20
|
+
}>;
|
|
21
|
+
export type ToolAnnotations = typeof ToolAnnotations.Type;
|
|
22
|
+
/** Tier 3: reference material a loaded skill may read on demand. */
|
|
23
|
+
export declare const SkillReference: Schema.Struct<{
|
|
24
|
+
readonly id: Schema.Trimmed;
|
|
25
|
+
readonly title: Schema.Trimmed;
|
|
26
|
+
readonly text: Schema.String;
|
|
27
|
+
}>;
|
|
28
|
+
export type SkillReference = typeof SkillReference.Type;
|
|
29
|
+
export declare const SkillDefinition: Schema.Struct<{
|
|
30
|
+
readonly id: Schema.Trimmed;
|
|
31
|
+
readonly version: Schema.Trimmed;
|
|
32
|
+
/** Tier 1: one line in the catalogue, always in context. */
|
|
33
|
+
readonly summary: Schema.Trimmed;
|
|
34
|
+
/** Tier 2: returned by load_skill together with the skill's tools. */
|
|
35
|
+
readonly instructions: Schema.String;
|
|
36
|
+
readonly tools: Schema.$Array<Schema.Trimmed>;
|
|
37
|
+
/** Active from the first step of every turn. */
|
|
38
|
+
readonly always: Schema.Boolean;
|
|
39
|
+
readonly permissions: Schema.$Array<Schema.String>;
|
|
40
|
+
readonly references: Schema.$Array<Schema.Struct<{
|
|
41
|
+
readonly id: Schema.Trimmed;
|
|
42
|
+
readonly title: Schema.Trimmed;
|
|
43
|
+
readonly text: Schema.String;
|
|
44
|
+
}>>;
|
|
45
|
+
}>;
|
|
46
|
+
export type SkillDefinition = typeof SkillDefinition.Type;
|
|
47
|
+
export declare const PromptTier: Schema.Literals<readonly ["static", "session", "turn"]>;
|
|
48
|
+
export type PromptTier = typeof PromptTier.Type;
|
|
2
49
|
export declare const CapabilityTool: Schema.Struct<{
|
|
3
|
-
id:
|
|
4
|
-
version:
|
|
5
|
-
description:
|
|
6
|
-
returns:
|
|
7
|
-
permissions: Schema
|
|
8
|
-
inputSchema: Schema
|
|
9
|
-
outputSchema: Schema
|
|
50
|
+
readonly id: Schema.Trimmed;
|
|
51
|
+
readonly version: Schema.Trimmed;
|
|
52
|
+
readonly description: Schema.Trimmed;
|
|
53
|
+
readonly returns: Schema.Trimmed;
|
|
54
|
+
readonly permissions: Schema.$Array<Schema.String>;
|
|
55
|
+
readonly inputSchema: Schema.$Record<Schema.String, Schema.Unknown>;
|
|
56
|
+
readonly outputSchema: Schema.$Record<Schema.String, Schema.Unknown>;
|
|
10
57
|
}>;
|
|
11
58
|
export type CapabilityTool = typeof CapabilityTool.Type;
|
|
12
59
|
export declare const CapabilityRecipe: Schema.Struct<{
|
|
13
|
-
id:
|
|
14
|
-
version:
|
|
15
|
-
instructions:
|
|
16
|
-
tools: Schema
|
|
60
|
+
readonly id: Schema.Trimmed;
|
|
61
|
+
readonly version: Schema.Trimmed;
|
|
62
|
+
readonly instructions: Schema.Trimmed;
|
|
63
|
+
readonly tools: Schema.$Array<Schema.Trimmed>;
|
|
17
64
|
}>;
|
|
18
65
|
export type CapabilityRecipe = typeof CapabilityRecipe.Type;
|
|
19
66
|
export declare const CapabilityCatalog: Schema.Struct<{
|
|
20
|
-
version:
|
|
21
|
-
recipes: Schema
|
|
22
|
-
id:
|
|
23
|
-
version:
|
|
24
|
-
instructions:
|
|
25
|
-
tools: Schema
|
|
67
|
+
readonly version: Schema.Trimmed;
|
|
68
|
+
readonly recipes: Schema.$Array<Schema.Struct<{
|
|
69
|
+
readonly id: Schema.Trimmed;
|
|
70
|
+
readonly version: Schema.Trimmed;
|
|
71
|
+
readonly instructions: Schema.Trimmed;
|
|
72
|
+
readonly tools: Schema.$Array<Schema.Trimmed>;
|
|
26
73
|
}>>;
|
|
27
|
-
tools: Schema
|
|
28
|
-
id:
|
|
29
|
-
version:
|
|
30
|
-
description:
|
|
31
|
-
returns:
|
|
32
|
-
permissions: Schema
|
|
33
|
-
inputSchema: Schema
|
|
34
|
-
outputSchema: Schema
|
|
74
|
+
readonly tools: Schema.$Array<Schema.Struct<{
|
|
75
|
+
readonly id: Schema.Trimmed;
|
|
76
|
+
readonly version: Schema.Trimmed;
|
|
77
|
+
readonly description: Schema.Trimmed;
|
|
78
|
+
readonly returns: Schema.Trimmed;
|
|
79
|
+
readonly permissions: Schema.$Array<Schema.String>;
|
|
80
|
+
readonly inputSchema: Schema.$Record<Schema.String, Schema.Unknown>;
|
|
81
|
+
readonly outputSchema: Schema.$Record<Schema.String, Schema.Unknown>;
|
|
35
82
|
}>>;
|
|
36
83
|
}>;
|
|
37
84
|
export type CapabilityCatalog = typeof CapabilityCatalog.Type;
|
|
38
85
|
export declare const CapabilitySelection: Schema.Struct<{
|
|
39
|
-
recipes: Schema
|
|
40
|
-
tools: Schema
|
|
86
|
+
readonly recipes: Schema.$Array<Schema.String>;
|
|
87
|
+
readonly tools: Schema.$Array<Schema.String>;
|
|
41
88
|
}>;
|
|
42
89
|
export type CapabilitySelection = typeof CapabilitySelection.Type;
|
|
43
90
|
export declare const ResolvedCapabilities: Schema.Struct<{
|
|
44
|
-
catalogVersion:
|
|
45
|
-
recipes: Schema
|
|
46
|
-
id:
|
|
47
|
-
version:
|
|
48
|
-
instructions:
|
|
49
|
-
tools: Schema
|
|
91
|
+
readonly catalogVersion: Schema.String;
|
|
92
|
+
readonly recipes: Schema.$Array<Schema.Struct<{
|
|
93
|
+
readonly id: Schema.Trimmed;
|
|
94
|
+
readonly version: Schema.Trimmed;
|
|
95
|
+
readonly instructions: Schema.Trimmed;
|
|
96
|
+
readonly tools: Schema.$Array<Schema.Trimmed>;
|
|
50
97
|
}>>;
|
|
51
|
-
tools: Schema
|
|
52
|
-
id:
|
|
53
|
-
version:
|
|
54
|
-
description:
|
|
55
|
-
returns:
|
|
56
|
-
permissions: Schema
|
|
57
|
-
inputSchema: Schema
|
|
58
|
-
outputSchema: Schema
|
|
98
|
+
readonly tools: Schema.$Array<Schema.Struct<{
|
|
99
|
+
readonly id: Schema.Trimmed;
|
|
100
|
+
readonly version: Schema.Trimmed;
|
|
101
|
+
readonly description: Schema.Trimmed;
|
|
102
|
+
readonly returns: Schema.Trimmed;
|
|
103
|
+
readonly permissions: Schema.$Array<Schema.String>;
|
|
104
|
+
readonly inputSchema: Schema.$Record<Schema.String, Schema.Unknown>;
|
|
105
|
+
readonly outputSchema: Schema.$Record<Schema.String, Schema.Unknown>;
|
|
59
106
|
}>>;
|
|
60
107
|
}>;
|
|
61
108
|
export type ResolvedCapabilities = typeof ResolvedCapabilities.Type;
|
|
@@ -1,6 +1,35 @@
|
|
|
1
|
+
import type { Tool } from "effect/ai";
|
|
1
2
|
import { Effect } from "effect";
|
|
2
|
-
import type {
|
|
3
|
+
import type { Capability, RegisteredTool, ToolDefinition, ToolViewInput } from "../ports/capability.port.js";
|
|
4
|
+
import type { CapabilityCatalog, CapabilitySelection, ResolvedCapabilities, SkillDefinition, ToolAnnotations } from "./capability.entity.js";
|
|
3
5
|
import { HarnessError } from "./plugin.entity.js";
|
|
6
|
+
export declare const defaultAnnotations: ToolAnnotations;
|
|
7
|
+
/** Author a tool with its handler, model view and annotations; the registry erases it. */
|
|
8
|
+
export declare const defineTool: <T extends Tool.Any, R>(definition: {
|
|
9
|
+
readonly tool: T;
|
|
10
|
+
readonly handler: ToolDefinition<T, R>["handler"];
|
|
11
|
+
readonly view?: ToolViewInput<Tool.Success<T>, Tool.Parameters<T>>;
|
|
12
|
+
readonly annotations?: Partial<ToolAnnotations>;
|
|
13
|
+
}) => RegisteredTool;
|
|
14
|
+
export declare const defineSkill: (skill: {
|
|
15
|
+
readonly id: string;
|
|
16
|
+
readonly summary: string;
|
|
17
|
+
readonly instructions?: string;
|
|
18
|
+
readonly tools: ReadonlyArray<string>;
|
|
19
|
+
readonly version?: string;
|
|
20
|
+
readonly always?: boolean;
|
|
21
|
+
readonly permissions?: ReadonlyArray<string>;
|
|
22
|
+
readonly references?: SkillDefinition["references"];
|
|
23
|
+
}) => SkillDefinition;
|
|
24
|
+
export declare const defineCapability: (capability: {
|
|
25
|
+
readonly id: string;
|
|
26
|
+
readonly version: string;
|
|
27
|
+
readonly tools?: Capability["tools"];
|
|
28
|
+
readonly skills?: Capability["skills"];
|
|
29
|
+
readonly promptSections?: Capability["promptSections"];
|
|
30
|
+
}) => Capability;
|
|
31
|
+
/** The resolver's catalogue: skills are recipes, registered tools are capability tools. */
|
|
32
|
+
export declare const catalogOf: (version: string, capabilities: ReadonlyArray<Capability>) => CapabilityCatalog;
|
|
4
33
|
/** Probabilistic intent never authorizes a capability. Expansions use this same
|
|
5
34
|
* deterministic resolver against the run-pinned catalog and current grants. */
|
|
6
35
|
export declare const resolveCapabilities: (catalog: CapabilityCatalog, requested: CapabilitySelection, permissions: ReadonlySet<string>) => Effect.Effect<ResolvedCapabilities, HarnessError>;
|
|
@@ -1,6 +1,59 @@
|
|
|
1
|
-
import { Effect } from "effect";
|
|
1
|
+
import { Effect, Option } from "effect";
|
|
2
|
+
import { strictJsonSchema, toolParametersSchema } from "../loop/toolSchema.js";
|
|
2
3
|
import { HarnessError } from "./plugin.entity.js";
|
|
3
|
-
export const
|
|
4
|
+
export const defaultAnnotations = {
|
|
5
|
+
readOnly: !1,
|
|
6
|
+
pollable: !1,
|
|
7
|
+
pinned: !1,
|
|
8
|
+
permissions: [],
|
|
9
|
+
maxCallsPerRun: Option.none(),
|
|
10
|
+
labels: {},
|
|
11
|
+
stage: Option.none()
|
|
12
|
+
}, defineTool = (definition) => ({
|
|
13
|
+
tool: definition.tool,
|
|
14
|
+
handler: definition.handler,
|
|
15
|
+
view: Option.map(Option.fromNullishOr(definition.view), (view) => ({
|
|
16
|
+
version: view.version,
|
|
17
|
+
render: view.render,
|
|
18
|
+
compact: Option.fromNullishOr(view.compact),
|
|
19
|
+
subjects: view.subjects ?? (() => []),
|
|
20
|
+
artifacts: view.artifacts ?? (() => []),
|
|
21
|
+
digest: Option.fromNullishOr(view.digest)
|
|
22
|
+
})),
|
|
23
|
+
annotations: { ...defaultAnnotations, ...definition.annotations }
|
|
24
|
+
}), defineSkill = (skill) => ({
|
|
25
|
+
id: skill.id,
|
|
26
|
+
version: skill.version ?? "1",
|
|
27
|
+
summary: skill.summary,
|
|
28
|
+
instructions: skill.instructions ?? "",
|
|
29
|
+
tools: skill.tools,
|
|
30
|
+
always: skill.always ?? !1,
|
|
31
|
+
permissions: skill.permissions ?? [],
|
|
32
|
+
references: skill.references ?? []
|
|
33
|
+
}), defineCapability = (capability) => ({
|
|
34
|
+
id: capability.id,
|
|
35
|
+
version: capability.version,
|
|
36
|
+
tools: capability.tools ?? [],
|
|
37
|
+
skills: capability.skills ?? [],
|
|
38
|
+
promptSections: capability.promptSections ?? []
|
|
39
|
+
}), catalogOf = (version, capabilities) => ({
|
|
40
|
+
version,
|
|
41
|
+
recipes: capabilities.flatMap((capability) => capability.skills).map((skill) => ({
|
|
42
|
+
id: skill.id,
|
|
43
|
+
version: skill.version,
|
|
44
|
+
instructions: skill.instructions.length > 0 ? skill.instructions : skill.summary,
|
|
45
|
+
tools: skill.tools
|
|
46
|
+
})),
|
|
47
|
+
tools: capabilities.flatMap((capability) => capability.tools).map((registered) => ({
|
|
48
|
+
id: registered.tool.name,
|
|
49
|
+
version: "1",
|
|
50
|
+
description: registered.tool.description ?? registered.tool.name,
|
|
51
|
+
returns: "tool result",
|
|
52
|
+
permissions: registered.annotations.permissions,
|
|
53
|
+
inputSchema: { ...toolParametersSchema(registered.tool) },
|
|
54
|
+
outputSchema: { ...strictJsonSchema(registered.tool.successSchema) }
|
|
55
|
+
}))
|
|
56
|
+
}), resolveCapabilities = (catalog, requested, permissions) => Effect.gen(function* () {
|
|
4
57
|
const recipeIds = new Set(requested.recipes), recipes = catalog.recipes.filter((recipe) => recipeIds.has(recipe.id)), toolIds = new Set([...requested.tools, ...recipes.flatMap((recipe) => recipe.tools)]), tools = catalog.tools.filter((tool) => toolIds.has(tool.id));
|
|
5
58
|
if (new Set(catalog.recipes.map((recipe) => recipe.id)).size !== catalog.recipes.length || new Set(catalog.tools.map((tool) => tool.id)).size !== catalog.tools.length || recipes.length !== recipeIds.size || tools.length !== toolIds.size)
|
|
6
59
|
return yield* Effect.fail(new HarnessError({ code: "capability.catalog", message: "Selection references an ambiguous or missing capability" }));
|
|
@@ -1,19 +1,40 @@
|
|
|
1
1
|
import { Schema } from "effect";
|
|
2
|
-
export const
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
returns: Schema.NonEmptyTrimmedString,
|
|
2
|
+
export const ToolAnnotations = Schema.Struct({
|
|
3
|
+
readOnly: Schema.Boolean,
|
|
4
|
+
pollable: Schema.Boolean,
|
|
5
|
+
pinned: Schema.Boolean,
|
|
7
6
|
permissions: Schema.Array(Schema.String),
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
maxCallsPerRun: Schema.OptionFromNullOr(Schema.Int),
|
|
8
|
+
labels: Schema.Record(Schema.String, Schema.String),
|
|
9
|
+
stage: Schema.OptionFromNullOr(Schema.String)
|
|
10
|
+
}), SkillReference = Schema.Struct({
|
|
11
|
+
id: Schema.Trimmed.check(Schema.isNonEmpty()),
|
|
12
|
+
title: Schema.Trimmed.check(Schema.isNonEmpty()),
|
|
13
|
+
text: Schema.String
|
|
14
|
+
}), SkillDefinition = Schema.Struct({
|
|
15
|
+
id: Schema.Trimmed.check(Schema.isNonEmpty()),
|
|
16
|
+
version: Schema.Trimmed.check(Schema.isNonEmpty()),
|
|
17
|
+
summary: Schema.Trimmed.check(Schema.isNonEmpty()),
|
|
18
|
+
instructions: Schema.String,
|
|
19
|
+
tools: Schema.Array(Schema.Trimmed.check(Schema.isNonEmpty())),
|
|
20
|
+
always: Schema.Boolean,
|
|
21
|
+
permissions: Schema.Array(Schema.String),
|
|
22
|
+
references: Schema.Array(SkillReference)
|
|
23
|
+
}), PromptTier = Schema.Literals(["static", "session", "turn"]), CapabilityTool = Schema.Struct({
|
|
24
|
+
id: Schema.Trimmed.check(Schema.isNonEmpty()),
|
|
25
|
+
version: Schema.Trimmed.check(Schema.isNonEmpty()),
|
|
26
|
+
description: Schema.Trimmed.check(Schema.isNonEmpty()),
|
|
27
|
+
returns: Schema.Trimmed.check(Schema.isNonEmpty()),
|
|
28
|
+
permissions: Schema.Array(Schema.String),
|
|
29
|
+
inputSchema: Schema.Record(Schema.String, Schema.Unknown),
|
|
30
|
+
outputSchema: Schema.Record(Schema.String, Schema.Unknown)
|
|
10
31
|
}), CapabilityRecipe = Schema.Struct({
|
|
11
|
-
id: Schema.
|
|
12
|
-
version: Schema.
|
|
13
|
-
instructions: Schema.
|
|
14
|
-
tools: Schema.Array(Schema.
|
|
32
|
+
id: Schema.Trimmed.check(Schema.isNonEmpty()),
|
|
33
|
+
version: Schema.Trimmed.check(Schema.isNonEmpty()),
|
|
34
|
+
instructions: Schema.Trimmed.check(Schema.isNonEmpty()),
|
|
35
|
+
tools: Schema.Array(Schema.Trimmed.check(Schema.isNonEmpty()))
|
|
15
36
|
}), CapabilityCatalog = Schema.Struct({
|
|
16
|
-
version: Schema.
|
|
37
|
+
version: Schema.Trimmed.check(Schema.isNonEmpty()),
|
|
17
38
|
recipes: Schema.Array(CapabilityRecipe),
|
|
18
39
|
tools: Schema.Array(CapabilityTool)
|
|
19
40
|
}), CapabilitySelection = Schema.Struct({
|
|
@@ -1,44 +1,44 @@
|
|
|
1
1
|
import { Schema } from "effect";
|
|
2
2
|
import type { Plugin } from "./plugin.entity.js";
|
|
3
3
|
export declare const PluginEntry: Schema.Struct<{
|
|
4
|
-
id:
|
|
5
|
-
use:
|
|
6
|
-
enabled: Schema.optional<
|
|
7
|
-
options: Schema.optional<Schema
|
|
4
|
+
readonly id: Schema.NonEmptyString;
|
|
5
|
+
readonly use: Schema.NonEmptyString;
|
|
6
|
+
readonly enabled: Schema.optional<Schema.Boolean>;
|
|
7
|
+
readonly options: Schema.optional<Schema.$Record<Schema.String, Schema.Unknown>>;
|
|
8
8
|
}>;
|
|
9
9
|
export type PluginEntry = typeof PluginEntry.Type;
|
|
10
10
|
export declare const Profile: Schema.Struct<{
|
|
11
|
-
plugins: Schema.optional<Schema
|
|
12
|
-
id:
|
|
13
|
-
use:
|
|
14
|
-
enabled: Schema.optional<
|
|
15
|
-
options: Schema.optional<Schema
|
|
11
|
+
readonly plugins: Schema.optional<Schema.$Array<Schema.Struct<{
|
|
12
|
+
readonly id: Schema.NonEmptyString;
|
|
13
|
+
readonly use: Schema.NonEmptyString;
|
|
14
|
+
readonly enabled: Schema.optional<Schema.Boolean>;
|
|
15
|
+
readonly options: Schema.optional<Schema.$Record<Schema.String, Schema.Unknown>>;
|
|
16
16
|
}>>>;
|
|
17
|
-
bindings: Schema.optional<Schema
|
|
18
|
-
system: Schema.optional<
|
|
17
|
+
readonly bindings: Schema.optional<Schema.$Record<Schema.String, Schema.String>>;
|
|
18
|
+
readonly system: Schema.optional<Schema.String>;
|
|
19
19
|
}>;
|
|
20
20
|
export type Profile = typeof Profile.Type;
|
|
21
21
|
export declare const HarnessConfig: Schema.Struct<{
|
|
22
|
-
version: Schema.Literal<
|
|
23
|
-
profile: Schema.optional<
|
|
24
|
-
plugins: Schema.optional<Schema
|
|
25
|
-
id:
|
|
26
|
-
use:
|
|
27
|
-
enabled: Schema.optional<
|
|
28
|
-
options: Schema.optional<Schema
|
|
22
|
+
readonly version: Schema.Literal<1>;
|
|
23
|
+
readonly profile: Schema.optional<Schema.String>;
|
|
24
|
+
readonly plugins: Schema.optional<Schema.$Array<Schema.Struct<{
|
|
25
|
+
readonly id: Schema.NonEmptyString;
|
|
26
|
+
readonly use: Schema.NonEmptyString;
|
|
27
|
+
readonly enabled: Schema.optional<Schema.Boolean>;
|
|
28
|
+
readonly options: Schema.optional<Schema.$Record<Schema.String, Schema.Unknown>>;
|
|
29
29
|
}>>>;
|
|
30
|
-
bindings: Schema.optional<Schema
|
|
31
|
-
profiles: Schema.optional<Schema
|
|
32
|
-
plugins: Schema.optional<Schema
|
|
33
|
-
id:
|
|
34
|
-
use:
|
|
35
|
-
enabled: Schema.optional<
|
|
36
|
-
options: Schema.optional<Schema
|
|
30
|
+
readonly bindings: Schema.optional<Schema.$Record<Schema.String, Schema.String>>;
|
|
31
|
+
readonly profiles: Schema.optional<Schema.$Record<Schema.String, Schema.Struct<{
|
|
32
|
+
readonly plugins: Schema.optional<Schema.$Array<Schema.Struct<{
|
|
33
|
+
readonly id: Schema.NonEmptyString;
|
|
34
|
+
readonly use: Schema.NonEmptyString;
|
|
35
|
+
readonly enabled: Schema.optional<Schema.Boolean>;
|
|
36
|
+
readonly options: Schema.optional<Schema.$Record<Schema.String, Schema.Unknown>>;
|
|
37
37
|
}>>>;
|
|
38
|
-
bindings: Schema.optional<Schema
|
|
39
|
-
system: Schema.optional<
|
|
38
|
+
readonly bindings: Schema.optional<Schema.$Record<Schema.String, Schema.String>>;
|
|
39
|
+
readonly system: Schema.optional<Schema.String>;
|
|
40
40
|
}>>>;
|
|
41
|
-
system: Schema.optional<
|
|
41
|
+
readonly system: Schema.optional<Schema.String>;
|
|
42
42
|
}>;
|
|
43
43
|
export type HarnessConfig = typeof HarnessConfig.Type;
|
|
44
44
|
export interface AgentDefinition {
|
|
@@ -3,16 +3,16 @@ export const PluginEntry = Schema.Struct({
|
|
|
3
3
|
id: Schema.NonEmptyString,
|
|
4
4
|
use: Schema.NonEmptyString,
|
|
5
5
|
enabled: Schema.optional(Schema.Boolean),
|
|
6
|
-
options: Schema.optional(Schema.Record(
|
|
6
|
+
options: Schema.optional(Schema.Record(Schema.String, Schema.Unknown))
|
|
7
7
|
}), Profile = Schema.Struct({
|
|
8
8
|
plugins: Schema.optional(Schema.Array(PluginEntry)),
|
|
9
|
-
bindings: Schema.optional(Schema.Record(
|
|
9
|
+
bindings: Schema.optional(Schema.Record(Schema.String, Schema.String)),
|
|
10
10
|
system: Schema.optional(Schema.String)
|
|
11
11
|
}), HarnessConfig = Schema.Struct({
|
|
12
12
|
version: Schema.Literal(1),
|
|
13
13
|
profile: Schema.optional(Schema.String),
|
|
14
14
|
plugins: Schema.optional(Schema.Array(PluginEntry)),
|
|
15
|
-
bindings: Schema.optional(Schema.Record(
|
|
16
|
-
profiles: Schema.optional(Schema.Record(
|
|
15
|
+
bindings: Schema.optional(Schema.Record(Schema.String, Schema.String)),
|
|
16
|
+
profiles: Schema.optional(Schema.Record(Schema.String, Profile)),
|
|
17
17
|
system: Schema.optional(Schema.String)
|
|
18
18
|
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Layer } from "effect";
|
|
2
|
+
import { Capabilities } from "../ports/capability.port.js";
|
|
3
|
+
import type { Capability } from "../ports/capability.port.js";
|
|
4
|
+
/** The host's own bundles as a layer: the bottom of a plugin stack (see `stackPlugins`). */
|
|
5
|
+
export declare const CapabilitiesLive: (...bundles: ReadonlyArray<Capability>) => Layer.Layer<Capabilities>;
|
|
6
|
+
/**
|
|
7
|
+
* Stack one plugin layer on the layers below it, as the plugin graph
|
|
8
|
+
* activates them: `next` is built over everything `base` provides; the two
|
|
9
|
+
* Capabilities arrays concatenate, base first (activateGraph's order); any
|
|
10
|
+
* other service of `next` wins.
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* const plugins = CapabilitiesLive(host).pipe(
|
|
14
|
+
* stackPlugins(MemoryWindowLive()), // + the recall tool
|
|
15
|
+
* stackPlugins(ToolDiscoveryLive()), // registry over [host, recall]; + the catalogue
|
|
16
|
+
* )
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* Capabilities is a multi-provider key. `Layer.merge`/`Layer.mergeAll`
|
|
20
|
+
* keep one array and silently drop the other layer's tools, skills and
|
|
21
|
+
* sections, and a layer merged beside another cannot see what it
|
|
22
|
+
* contributes: never merge layers that contribute; stack them.
|
|
23
|
+
*/
|
|
24
|
+
export declare const stackPlugins: <A2, E2, R2>(next: Layer.Layer<A2, E2, R2>) => <A1, E1, R1>(base: Layer.Layer<A1, E1, R1>) => Layer.Layer<A1 | A2, E1 | E2, R1 | Exclude<R2, A1>>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Context, Effect, Layer, Option } from "effect";
|
|
2
|
+
import { Capabilities } from "../ports/capability.port.js";
|
|
3
|
+
export const CapabilitiesLive = (...bundles) => Layer.succeed(Capabilities, bundles);
|
|
4
|
+
const capabilitiesOf = (context) => Option.getOrElse(Context.getOption(context, Capabilities), () => []);
|
|
5
|
+
export const stackPlugins = (next) => (base) => Layer.effectContext(Effect.gen(function* () {
|
|
6
|
+
const scope = yield* Effect.scope, lower = yield* Layer.buildWithScope(base, scope), upper = yield* Layer.buildWithScope(next, scope).pipe(Effect.provide(lower)), merged = Context.merge(lower, upper);
|
|
7
|
+
return lower.mapUnsafe.has(Capabilities.key) || upper.mapUnsafe.has(Capabilities.key) ? Context.makeUnsafe(new Map([...merged.mapUnsafe, [Capabilities.key, [...capabilitiesOf(lower), ...capabilitiesOf(upper)]]])) : merged;
|
|
8
|
+
}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { Layer, Schema } from "effect";
|
|
2
|
-
import type {
|
|
3
|
-
/**
|
|
2
|
+
import type { TypedPlugin } from "./plugin.entity.js";
|
|
3
|
+
/**
|
|
4
|
+
* Layers retain their native types until the validated dynamic loading edge.
|
|
5
|
+
* `build` (the graph's) and `live` (a host's own composition) share one
|
|
6
|
+
* decode: the options merged over the defaults, extra keys refused — so a
|
|
7
|
+
* graph caller, whose options already hold the defaults, decodes the same.
|
|
8
|
+
*/
|
|
4
9
|
export declare const definePlugin: <A extends Readonly<Record<string, unknown>>, I, Out, E, In>(definition: {
|
|
5
10
|
readonly id: string;
|
|
6
11
|
readonly version: string;
|
|
@@ -12,7 +17,13 @@ export declare const definePlugin: <A extends Readonly<Record<string, unknown>>,
|
|
|
12
17
|
readonly provides: ReadonlyArray<{
|
|
13
18
|
readonly key: string;
|
|
14
19
|
}>;
|
|
15
|
-
readonly
|
|
20
|
+
readonly contributes?: ReadonlyArray<{
|
|
21
|
+
readonly key: string;
|
|
22
|
+
}>;
|
|
23
|
+
readonly optional?: ReadonlyArray<{
|
|
24
|
+
readonly key: string;
|
|
25
|
+
}>;
|
|
26
|
+
readonly config: Schema.Codec<A, I>;
|
|
16
27
|
readonly defaults: A;
|
|
17
28
|
readonly layer: (config: A) => Layer.Layer<Out, E, In>;
|
|
18
|
-
}) =>
|
|
29
|
+
}) => TypedPlugin<A, I, Out, E, In>;
|
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import { Context, Effect, Layer, Schema } from "effect";
|
|
2
2
|
import { HarnessError, PLUGIN_API_VERSION } from "./plugin.entity.js";
|
|
3
|
-
export const definePlugin = (definition) =>
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
3
|
+
export const definePlugin = (definition) => {
|
|
4
|
+
const decodeOptions = (options) => Schema.decodeUnknownEffect(definition.config)(typeof options === "object" && options !== null ? { ...definition.defaults, ...options } : options ?? definition.defaults, { onExcessProperty: "error" });
|
|
5
|
+
return {
|
|
6
|
+
id: definition.id,
|
|
7
|
+
version: definition.version,
|
|
8
|
+
apiVersion: definition.apiVersion ?? PLUGIN_API_VERSION,
|
|
9
|
+
scope: definition.scope ?? "session",
|
|
10
|
+
requires: (definition.requires ?? []).map((tag) => tag.key),
|
|
11
|
+
provides: definition.provides.map((tag) => tag.key),
|
|
12
|
+
contributes: (definition.contributes ?? []).map((tag) => tag.key),
|
|
13
|
+
optional: (definition.optional ?? []).map((tag) => tag.key),
|
|
14
|
+
schema: definition.config,
|
|
15
|
+
config: definition.config,
|
|
16
|
+
defaults: definition.defaults,
|
|
17
|
+
build: (options, services) => decodeOptions(options).pipe(Effect.flatMap((config) => Layer.build(Layer.fresh(definition.layer(config))).pipe(Effect.provide(Context.makeUnsafe(services.mapUnsafe)), Effect.map((built) => Context.makeUnsafe(Context.omit(Layer.CurrentMemoMap)(built).mapUnsafe)))), Effect.mapError((error) => new HarnessError({ code: "plugin.activation", plugin: definition.id, message: String(error) })), Effect.catchDefect((error) => Effect.fail(new HarnessError({ code: "plugin.defect", plugin: definition.id, message: String(error) })))),
|
|
18
|
+
live: (options) => Layer.unwrap(decodeOptions(options).pipe(Effect.mapError((error) => new HarnessError({ code: "config.options", plugin: definition.id, message: String(error) })), Effect.map(definition.layer)))
|
|
19
|
+
};
|
|
20
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|