@dual-os/sdk 0.0.0-stage → 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/LICENSE +4 -0
- package/README.md +19 -2
- package/dist/Action.d.ts +201 -0
- package/dist/Action.d.ts.map +1 -0
- package/dist/Action.js +172 -0
- package/dist/Action.js.map +1 -0
- package/dist/AgentChannel.d.ts +1717 -0
- package/dist/AgentChannel.d.ts.map +1 -0
- package/dist/AgentChannel.js +708 -0
- package/dist/AgentChannel.js.map +1 -0
- package/dist/AgentChannelConformance.d.ts +1543 -0
- package/dist/AgentChannelConformance.d.ts.map +1 -0
- package/dist/AgentChannelConformance.js +163 -0
- package/dist/AgentChannelConformance.js.map +1 -0
- package/dist/AgentChannelRuntime.d.ts +78 -0
- package/dist/AgentChannelRuntime.d.ts.map +1 -0
- package/dist/AgentChannelRuntime.js +270 -0
- package/dist/AgentChannelRuntime.js.map +1 -0
- package/dist/AiProvider.d.ts +132 -0
- package/dist/AiProvider.d.ts.map +1 -0
- package/dist/AiProvider.js +100 -0
- package/dist/AiProvider.js.map +1 -0
- package/dist/AuthMethod.d.ts +381 -0
- package/dist/AuthMethod.d.ts.map +1 -0
- package/dist/AuthMethod.js +225 -0
- package/dist/AuthMethod.js.map +1 -0
- package/dist/AuthMethodBinding.d.ts +77 -0
- package/dist/AuthMethodBinding.d.ts.map +1 -0
- package/dist/AuthMethodBinding.js +31 -0
- package/dist/AuthMethodBinding.js.map +1 -0
- package/dist/AuthMethodExecution.d.ts +223 -0
- package/dist/AuthMethodExecution.d.ts.map +1 -0
- package/dist/AuthMethodExecution.js +277 -0
- package/dist/AuthMethodExecution.js.map +1 -0
- package/dist/ConnectionResolver.d.ts +219 -0
- package/dist/ConnectionResolver.d.ts.map +1 -0
- package/dist/ConnectionResolver.js +153 -0
- package/dist/ConnectionResolver.js.map +1 -0
- package/dist/DefinitionError.d.ts +67 -0
- package/dist/DefinitionError.d.ts.map +1 -0
- package/dist/DefinitionError.js +82 -0
- package/dist/DefinitionError.js.map +1 -0
- package/dist/DualRegistry.d.ts +71 -0
- package/dist/DualRegistry.d.ts.map +1 -0
- package/dist/DualRegistry.js +96 -0
- package/dist/DualRegistry.js.map +1 -0
- package/dist/DualRuntime.d.ts +279 -0
- package/dist/DualRuntime.d.ts.map +1 -0
- package/dist/DualRuntime.js +311 -0
- package/dist/DualRuntime.js.map +1 -0
- package/dist/Files.d.ts +80 -0
- package/dist/Files.d.ts.map +1 -0
- package/dist/Files.js +66 -0
- package/dist/Files.js.map +1 -0
- package/dist/Group.d.ts +106 -0
- package/dist/Group.d.ts.map +1 -0
- package/dist/Group.js +86 -0
- package/dist/Group.js.map +1 -0
- package/dist/Http.d.ts +342 -0
- package/dist/Http.d.ts.map +1 -0
- package/dist/Http.js +677 -0
- package/dist/Http.js.map +1 -0
- package/dist/Mcp.d.ts +109 -0
- package/dist/Mcp.d.ts.map +1 -0
- package/dist/Mcp.js +176 -0
- package/dist/Mcp.js.map +1 -0
- package/dist/OAuth2TokenRefresher.d.ts +18 -0
- package/dist/OAuth2TokenRefresher.d.ts.map +1 -0
- package/dist/OAuth2TokenRefresher.js +19 -0
- package/dist/OAuth2TokenRefresher.js.map +1 -0
- package/dist/OAuthFlow.d.ts +71 -0
- package/dist/OAuthFlow.d.ts.map +1 -0
- package/dist/OAuthFlow.js +488 -0
- package/dist/OAuthFlow.js.map +1 -0
- package/dist/Plugin.d.ts +383 -0
- package/dist/Plugin.d.ts.map +1 -0
- package/dist/Plugin.js +249 -0
- package/dist/Plugin.js.map +1 -0
- package/dist/PluginRuntime.d.ts +3186 -0
- package/dist/PluginRuntime.d.ts.map +1 -0
- package/dist/PluginRuntime.js +331 -0
- package/dist/PluginRuntime.js.map +1 -0
- package/dist/Runner.d.ts +1 -0
- package/dist/Runner.js +124 -0
- package/dist/Runner.js.map +1 -0
- package/dist/ToolFile.d.ts +23 -0
- package/dist/ToolFile.d.ts.map +1 -0
- package/dist/ToolFile.js +33 -0
- package/dist/ToolFile.js.map +1 -0
- package/dist/Trigger.d.ts +358 -0
- package/dist/Trigger.d.ts.map +1 -0
- package/dist/Trigger.js +287 -0
- package/dist/Trigger.js.map +1 -0
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +24 -0
- package/dist/internal/auth-context.d.ts +23 -0
- package/dist/internal/auth-context.d.ts.map +1 -0
- package/dist/internal/auth-context.js +1 -0
- package/dist/internal/auth-execution.d.ts +27 -0
- package/dist/internal/auth-execution.d.ts.map +1 -0
- package/dist/internal/auth-execution.js +66 -0
- package/dist/internal/auth-execution.js.map +1 -0
- package/dist/internal/auth-runtime.d.ts +5 -0
- package/dist/internal/auth-runtime.d.ts.map +1 -0
- package/dist/internal/auth-runtime.js +16 -0
- package/dist/internal/auth-runtime.js.map +1 -0
- package/dist/internal/capabilities.d.ts +24 -0
- package/dist/internal/capabilities.d.ts.map +1 -0
- package/dist/internal/capabilities.js +22 -0
- package/dist/internal/capabilities.js.map +1 -0
- package/dist/internal/children.d.ts +34 -0
- package/dist/internal/children.d.ts.map +1 -0
- package/dist/internal/children.js +53 -0
- package/dist/internal/children.js.map +1 -0
- package/dist/internal/collection-utils.d.ts +4 -0
- package/dist/internal/collection-utils.d.ts.map +1 -0
- package/dist/internal/collection-utils.js +6 -0
- package/dist/internal/collection-utils.js.map +1 -0
- package/dist/internal/dual/actions.d.ts +33 -0
- package/dist/internal/dual/actions.d.ts.map +1 -0
- package/dist/internal/dual/actions.js +26 -0
- package/dist/internal/dual/actions.js.map +1 -0
- package/dist/internal/dual/invoke.d.ts +63 -0
- package/dist/internal/dual/invoke.d.ts.map +1 -0
- package/dist/internal/dual/invoke.js +75 -0
- package/dist/internal/dual/invoke.js.map +1 -0
- package/dist/internal/dual/registry.d.ts +125 -0
- package/dist/internal/dual/registry.d.ts.map +1 -0
- package/dist/internal/dual/registry.js +172 -0
- package/dist/internal/dual/registry.js.map +1 -0
- package/dist/internal/dual/triggers.d.ts +29 -0
- package/dist/internal/dual/triggers.d.ts.map +1 -0
- package/dist/internal/dual/triggers.js +26 -0
- package/dist/internal/dual/triggers.js.map +1 -0
- package/dist/internal/handler-context.d.ts +9 -0
- package/dist/internal/handler-context.d.ts.map +1 -0
- package/dist/internal/handler-context.js +31 -0
- package/dist/internal/handler-context.js.map +1 -0
- package/dist/internal/identifier.d.ts +6 -0
- package/dist/internal/identifier.d.ts.map +1 -0
- package/dist/internal/identifier.js +28 -0
- package/dist/internal/identifier.js.map +1 -0
- package/dist/internal/plugin-handlers.d.ts +38 -0
- package/dist/internal/plugin-handlers.d.ts.map +1 -0
- package/dist/internal/plugin-handlers.js +52 -0
- package/dist/internal/plugin-handlers.js.map +1 -0
- package/dist/internal/proto.d.ts +7 -0
- package/dist/internal/proto.d.ts.map +1 -0
- package/dist/internal/proto.js +10 -0
- package/dist/internal/proto.js.map +1 -0
- package/dist/internal/schema-runtime.d.ts +6 -0
- package/dist/internal/schema-runtime.d.ts.map +1 -0
- package/dist/internal/schema-runtime.js +10 -0
- package/dist/internal/schema-runtime.js.map +1 -0
- package/dist/internal/trigger-runtime-shared.d.ts +41 -0
- package/dist/internal/trigger-runtime-shared.d.ts.map +1 -0
- package/dist/internal/trigger-runtime-shared.js +132 -0
- package/dist/internal/trigger-runtime-shared.js.map +1 -0
- package/dist/internal/trigger-runtime.d.ts +12 -0
- package/dist/internal/trigger-runtime.d.ts.map +1 -0
- package/dist/internal/trigger-runtime.js +95 -0
- package/dist/internal/trigger-runtime.js.map +1 -0
- package/dist/internal/types.d.ts +7 -0
- package/dist/internal/types.d.ts.map +1 -0
- package/dist/internal/types.js +1 -0
- package/dist/remote-runtime.d.ts +585 -0
- package/dist/remote-runtime.d.ts.map +1 -0
- package/dist/remote-runtime.js +367 -0
- package/dist/remote-runtime.js.map +1 -0
- package/package.json +55 -4
- package/src/Action.ts +370 -0
- package/src/AgentChannel.ts +860 -0
- package/src/AgentChannelConformance.ts +124 -0
- package/src/AgentChannelRuntime.ts +616 -0
- package/src/AiProvider.ts +255 -0
- package/src/AuthMethod.ts +954 -0
- package/src/AuthMethodBinding.ts +112 -0
- package/src/AuthMethodExecution.ts +542 -0
- package/src/ConnectionResolver.ts +265 -0
- package/src/DefinitionError.ts +115 -0
- package/src/DualRegistry.ts +152 -0
- package/src/DualRuntime.ts +1081 -0
- package/src/Files.ts +89 -0
- package/src/Group.ts +292 -0
- package/src/Http.ts +1205 -0
- package/src/Mcp.ts +299 -0
- package/src/OAuth2TokenRefresher.ts +22 -0
- package/src/OAuthFlow.ts +874 -0
- package/src/Plugin.ts +912 -0
- package/src/PluginRuntime.ts +414 -0
- package/src/Runner.ts +248 -0
- package/src/ToolFile.ts +28 -0
- package/src/Trigger.ts +722 -0
- package/src/index.ts +158 -0
- package/src/internal/auth-context.ts +27 -0
- package/src/internal/auth-execution.ts +241 -0
- package/src/internal/auth-runtime.ts +20 -0
- package/src/internal/capabilities.ts +55 -0
- package/src/internal/children.ts +126 -0
- package/src/internal/collection-utils.ts +8 -0
- package/src/internal/dual/actions.ts +116 -0
- package/src/internal/dual/invoke.ts +307 -0
- package/src/internal/dual/registry.ts +340 -0
- package/src/internal/dual/triggers.ts +128 -0
- package/src/internal/handler-context.ts +57 -0
- package/src/internal/identifier.ts +27 -0
- package/src/internal/plugin-handlers.ts +146 -0
- package/src/internal/proto.ts +8 -0
- package/src/internal/schema-runtime.ts +15 -0
- package/src/internal/trigger-runtime-shared.ts +449 -0
- package/src/internal/trigger-runtime.ts +223 -0
- package/src/internal/types.ts +12 -0
- package/src/remote-runtime.ts +469 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/** Public replay conformance suite for channel plugins, runnable with @effect/vitest. */
|
|
2
|
+
import { Effect, Schema } from "effect";
|
|
3
|
+
|
|
4
|
+
import * as AgentChannel from "./AgentChannel.ts";
|
|
5
|
+
import * as DualRuntime from "./DualRuntime.ts";
|
|
6
|
+
|
|
7
|
+
// Either protocol: the runtime checks each command against the Channel's own protocol.
|
|
8
|
+
const Command = Schema.Union([
|
|
9
|
+
AgentChannel.commandSchema(Schema.Json),
|
|
10
|
+
AgentChannel.commandSchemaV2(Schema.Json),
|
|
11
|
+
]);
|
|
12
|
+
export const Fixture = Schema.Struct({
|
|
13
|
+
activate: Command,
|
|
14
|
+
channelId: AgentChannel.Key,
|
|
15
|
+
connectionId: Schema.optionalKey(AgentChannel.Key),
|
|
16
|
+
deactivate: Command,
|
|
17
|
+
definitionSettings: Schema.Json,
|
|
18
|
+
deliver: Command,
|
|
19
|
+
deploymentSettings: Schema.Json,
|
|
20
|
+
receive: Command,
|
|
21
|
+
});
|
|
22
|
+
export type Fixture = typeof Fixture.Type;
|
|
23
|
+
export class ConformanceError extends Schema.TaggedError<ConformanceError>()(
|
|
24
|
+
"AgentChannelConformanceError",
|
|
25
|
+
{
|
|
26
|
+
command: Schema.Literals(["activate", "deactivate", "receive", "deliver"]),
|
|
27
|
+
rule: Schema.Literals(["command_kind", "stable_result", "stable_events", "boundary_rejection"]),
|
|
28
|
+
},
|
|
29
|
+
) {}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Replays operations that providers declare safe to replay. At-most-once delivery executes once;
|
|
33
|
+
* the durable host owns its replay prohibition. Use an isolated provider test installation: this
|
|
34
|
+
* suite performs provider effects. The host supplies stable keys; the plugin must recover the same
|
|
35
|
+
* external subscription and emit the same provider event keys, even for a fresh receipt key.
|
|
36
|
+
* Boundary rejection and feature/auth matrices are covered by the SDK's public runtime tests.
|
|
37
|
+
*/
|
|
38
|
+
export const run = Effect.fn("AgentChannelConformance.run")(function* (input: Fixture) {
|
|
39
|
+
const fixture = yield* Schema.decodeUnknownEffect(Fixture)(input, { onExcessProperty: "error" });
|
|
40
|
+
const runtime = yield* DualRuntime.Service;
|
|
41
|
+
const definition = yield* runtime.getAgentChannel({ channelId: fixture.channelId });
|
|
42
|
+
const { activate, receive, deliver, deactivate, ...config } = fixture;
|
|
43
|
+
const { connectionId: _connectionId, ...withoutConnection } = config;
|
|
44
|
+
const probes = [
|
|
45
|
+
{ code: "invalid_input", input: { ...config, channelId: "", command: activate } },
|
|
46
|
+
{
|
|
47
|
+
// Invocation keys allow '/', but authored identifiers forbid it, so this cannot activate.
|
|
48
|
+
input: { ...config, channelId: "conformance/missing/channel", command: activate },
|
|
49
|
+
code: "not_found",
|
|
50
|
+
},
|
|
51
|
+
{ code: "invalid_input", input: { ...config, command: { ...activate, operationKey: "" } } },
|
|
52
|
+
{
|
|
53
|
+
code: "invalid_input",
|
|
54
|
+
input: { ...config, agent: { id: "synthetic-authority" }, command: activate },
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
code: "invalid_auth",
|
|
58
|
+
input:
|
|
59
|
+
definition.authMethods.length === 0
|
|
60
|
+
? { ...config, command: activate, connectionId: "unexpected" }
|
|
61
|
+
: { ...withoutConnection, command: activate },
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
for (const probe of probes) {
|
|
65
|
+
const outcome = yield* Effect.suspend(() => runtime.executeAgentChannel(probe.input)).pipe(
|
|
66
|
+
Effect.result,
|
|
67
|
+
);
|
|
68
|
+
if (outcome._tag !== "Failure" || outcome.failure.code !== probe.code) {
|
|
69
|
+
return yield* new ConformanceError({ command: "activate", rule: "boundary_rejection" });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const commands = [
|
|
73
|
+
["activate", activate],
|
|
74
|
+
["receive", receive],
|
|
75
|
+
["deliver", deliver],
|
|
76
|
+
["deactivate", deactivate],
|
|
77
|
+
] as const;
|
|
78
|
+
for (const [kind, command] of commands) {
|
|
79
|
+
if (command.kind !== kind) {
|
|
80
|
+
return yield* new ConformanceError({ command: kind, rule: "command_kind" });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const activated = yield* Effect.acquireRelease(
|
|
84
|
+
runtime.executeAgentChannel({ ...config, command: activate }),
|
|
85
|
+
result =>
|
|
86
|
+
runtime
|
|
87
|
+
.executeAgentChannel({
|
|
88
|
+
...config,
|
|
89
|
+
command: {
|
|
90
|
+
...deactivate,
|
|
91
|
+
...(result.kind === "activate"
|
|
92
|
+
? { installationKey: result.installationKey, state: result.state }
|
|
93
|
+
: {}),
|
|
94
|
+
},
|
|
95
|
+
})
|
|
96
|
+
.pipe(Effect.orDie),
|
|
97
|
+
);
|
|
98
|
+
for (const [kind, command] of commands) {
|
|
99
|
+
const first =
|
|
100
|
+
kind === "activate" ? activated : yield* runtime.executeAgentChannel({ ...config, command });
|
|
101
|
+
if (kind === "deliver" && definition.features.deliveryMode === "at-most-once") continue;
|
|
102
|
+
const second = yield* runtime.executeAgentChannel({ ...config, command });
|
|
103
|
+
const firstJson = yield* Schema.decodeUnknownEffect(Schema.Json)(first);
|
|
104
|
+
const secondJson = yield* Schema.decodeUnknownEffect(Schema.Json)(second);
|
|
105
|
+
if (!Schema.toEquivalence(Schema.Json)(firstJson, secondJson)) {
|
|
106
|
+
return yield* new ConformanceError({ command: kind, rule: "stable_result" });
|
|
107
|
+
}
|
|
108
|
+
if (kind === "receive") {
|
|
109
|
+
const nextReceipt = yield* runtime.executeAgentChannel({
|
|
110
|
+
...config,
|
|
111
|
+
command: { ...command, operationKey: `${command.operationKey.slice(0, 500)}:replay` },
|
|
112
|
+
});
|
|
113
|
+
if (
|
|
114
|
+
first.kind !== "receive" ||
|
|
115
|
+
nextReceipt.kind !== "receive" ||
|
|
116
|
+
!Schema.toEquivalence(Schema.Array(AgentChannel.EventV2))(first.events, nextReceipt.events)
|
|
117
|
+
) {
|
|
118
|
+
return yield* new ConformanceError({ command: kind, rule: "stable_events" });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}, Effect.scoped);
|
|
123
|
+
|
|
124
|
+
export * as AgentChannelConformance from "./AgentChannelConformance.ts";
|