@effect-agent/platform-node 0.1.0-beta.6 → 0.1.0-beta.60
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/dist/NodeDurableAgentRuntime-CFElFzNF.d.mts +179 -0
- package/dist/NodeDurableAgentRuntime.d.mts +2 -0
- package/dist/NodeDurableAgentRuntime.mjs +221 -0
- package/dist/NodeDurableAgentRuntime.mjs.map +1 -0
- package/dist/NodeDurableHost-BMSajuQn.mjs +194 -0
- package/dist/NodeDurableHost-BMSajuQn.mjs.map +1 -0
- package/dist/NodeDurableHost.d.mts +168 -0
- package/dist/NodeDurableHost.mjs +2 -0
- package/dist/NodeScheduling.d.mts +22 -0
- package/dist/NodeScheduling.mjs +59 -0
- package/dist/NodeScheduling.mjs.map +1 -0
- package/dist/NodeSubscriptions.d.mts +27 -0
- package/dist/NodeSubscriptions.mjs +74 -0
- package/dist/NodeSubscriptions.mjs.map +1 -0
- package/dist/NodeWakeScheduler-4ZeXYwPu.d.mts +27 -0
- package/dist/NodeWakeScheduler.d.mts +2 -0
- package/dist/NodeWakeScheduler.mjs +65 -0
- package/dist/NodeWakeScheduler.mjs.map +1 -0
- package/dist/NodeWorkflow.d.mts +27 -0
- package/dist/NodeWorkflow.mjs +159 -0
- package/dist/NodeWorkflow.mjs.map +1 -0
- package/dist/index.d.mts +6 -214
- package/dist/index.mjs +6 -286
- package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
- package/package.json +1 -45
- package/src/NodeDurableAgentRuntime.ts +596 -0
- package/src/NodeDurableHost.ts +361 -0
- package/src/NodeScheduling.ts +121 -0
- package/src/NodeSubscriptions.ts +162 -0
- package/src/{wake-scheduler.ts → NodeWakeScheduler.ts} +32 -17
- package/src/NodeWorkflow.ts +258 -0
- package/src/index.ts +5 -3
- package/src/internal/message-delivery.ts +53 -0
- package/src/internal/prepared-admission.ts +81 -0
- package/dist/index.mjs.map +0 -1
- package/src/host.ts +0 -215
- package/src/layers.ts +0 -381
package/dist/index.d.mts
CHANGED
|
@@ -1,214 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
readonly message: Schema.String;
|
|
8
|
-
readonly cause: Schema.optionalKey<Schema.Defect>;
|
|
9
|
-
}>, import("effect/Cause").YieldableError>;
|
|
10
|
-
/** The supplied Node durable runtime configuration failed schema validation (DEPLOY-003). */
|
|
11
|
-
declare class NodePlatformConfigError extends NodePlatformConfigError_base {}
|
|
12
|
-
declare const NodeDurableRuntimeConfigValue_base: Schema.Class<NodeDurableRuntimeConfigValue, Schema.Struct<{
|
|
13
|
-
/** SQLite database file backing BOTH the Conversation Log and the Submission Ledger. */
|
|
14
|
-
readonly filename: Schema.NonEmptyString;
|
|
15
|
-
readonly deploymentId: Schema.brand<Schema.NonEmptyString, "@effect-agent/session/DeploymentId">;
|
|
16
|
-
readonly producerId: Schema.brand<Schema.NonEmptyString, "@effect-agent/session/ProducerId">;
|
|
17
|
-
/** Submission ownership lease duration (D5); liveness hint only, epochs stay authoritative. */
|
|
18
|
-
readonly ownershipLeaseDuration: Schema.Int;
|
|
19
|
-
/** Finite bound on concurrent worker loops per host (rule 10). */
|
|
20
|
-
readonly workerConcurrency: Schema.Int;
|
|
21
|
-
/** Ledger-scan fallback cadence of the Node wake scheduler (deployment §3). */
|
|
22
|
-
readonly wakeScanInterval: Schema.Int;
|
|
23
|
-
/** `awaitSettlement` ledger re-check cadence when no wake arrives. */
|
|
24
|
-
readonly settlementPollInterval: Schema.Int;
|
|
25
|
-
/** Worker ownership-lease renewal cadence. */
|
|
26
|
-
readonly leaseRenewalInterval: Schema.Int;
|
|
27
|
-
/** Active-Run abort-intent poll cadence. */
|
|
28
|
-
readonly abortPollInterval: Schema.Int;
|
|
29
|
-
/** Bounded SQLITE_BUSY retry window for write-lock acquisition. */
|
|
30
|
-
readonly busyTimeout: Schema.Int;
|
|
31
|
-
/** Canonical observation poll cadence of the SQLite store. */
|
|
32
|
-
readonly observationPollInterval: Schema.Int;
|
|
33
|
-
/** Opt-in full payload/digest-chain audit while opening the store. */
|
|
34
|
-
readonly verifyOnOpen: Schema.Boolean;
|
|
35
|
-
}>, {}>;
|
|
36
|
-
/**
|
|
37
|
-
* Validated Node durable runtime configuration (deployment §4: decoded once during Layer
|
|
38
|
-
* construction, exposed as a typed service). Every cadence is in milliseconds and every bound is
|
|
39
|
-
* finite; `workerConcurrency` caps how many worker loops `NodeDurableHost.runWorkers` drives.
|
|
40
|
-
*/
|
|
41
|
-
declare class NodeDurableRuntimeConfigValue extends NodeDurableRuntimeConfigValue_base {}
|
|
42
|
-
declare const NodeDurableRuntimeConfig_base: Context.ServiceClass<NodeDurableRuntimeConfig, "@effect-agent/platform-node/NodeDurableRuntimeConfig", NodeDurableRuntimeConfigValue>;
|
|
43
|
-
/** Explicit configuration authority for the assembled Node durable runtime. */
|
|
44
|
-
declare class NodeDurableRuntimeConfig extends NodeDurableRuntimeConfig_base {}
|
|
45
|
-
/**
|
|
46
|
-
* Raw (unvalidated) construction options for `NodeDurableRuntime.layer`. Optional fields default
|
|
47
|
-
* to the documented production values; everything is schema-decoded into
|
|
48
|
-
* `NodeDurableRuntimeConfigValue` before any resource opens (deployment §5 gate 1).
|
|
49
|
-
*/
|
|
50
|
-
interface NodeDurableRuntimeOptions {
|
|
51
|
-
readonly filename: string;
|
|
52
|
-
readonly deploymentId: string;
|
|
53
|
-
readonly producerId: string;
|
|
54
|
-
/** Milliseconds; default `DEFAULT_OWNERSHIP_LEASE_DURATION` (30s, D5). */
|
|
55
|
-
readonly ownershipLeaseDuration?: number | undefined;
|
|
56
|
-
/** Default 1; bounded to 1..64. */
|
|
57
|
-
readonly workerConcurrency?: number | undefined;
|
|
58
|
-
/** Milliseconds; default 1000. */
|
|
59
|
-
readonly wakeScanInterval?: number | undefined;
|
|
60
|
-
/** Milliseconds; default 500. */
|
|
61
|
-
readonly settlementPollInterval?: number | undefined;
|
|
62
|
-
/** Milliseconds; default 10000. */
|
|
63
|
-
readonly leaseRenewalInterval?: number | undefined;
|
|
64
|
-
/** Milliseconds; default 500. */
|
|
65
|
-
readonly abortPollInterval?: number | undefined;
|
|
66
|
-
/** Milliseconds; default 5000. */
|
|
67
|
-
readonly busyTimeout?: number | undefined;
|
|
68
|
-
/** Milliseconds; default 25. */
|
|
69
|
-
readonly observationPollInterval?: number | undefined;
|
|
70
|
-
/** Default false. */
|
|
71
|
-
readonly verifyOnOpen?: boolean | undefined;
|
|
72
|
-
/** SQLite adapter fault injection (`ledger:*` / `append:*` locations); default none. */
|
|
73
|
-
readonly storageFailpoint?: SqliteStorageFailpointHandler | undefined;
|
|
74
|
-
/** Coordinator fault injection (`submit:*` / `terminalize:*` locations); default none. */
|
|
75
|
-
readonly runtimeFailpoint?: DurableRuntimeFailpointHandler | undefined;
|
|
76
|
-
/**
|
|
77
|
-
* Reconciliation policy consulted for open ordinary Tool Calls before an Unknown Outcome is
|
|
78
|
-
* recorded (durability §10, DUR-009). Defaults to the fail-closed `ToolReconciler.uncertain`:
|
|
79
|
-
* with no registered policy, every open call stays Unknown and routes to the authorized
|
|
80
|
-
* DUR-017 resolution path.
|
|
81
|
-
*/
|
|
82
|
-
readonly toolReconciler?: Layer.Layer<ToolReconciler> | undefined;
|
|
83
|
-
/**
|
|
84
|
-
* Registered worker Bindings resolved at durable claim time (S2, spec/subagents.md §11):
|
|
85
|
-
* build each with `DurableWorkerBinding.make(binding, digests)` so
|
|
86
|
-
* `NodeDurableHost.runResolvedWorkers` / `DurableAgentRuntime.runResolvedWorker` can serve
|
|
87
|
-
* parent and child lanes from one pool with exact-digest resolution (SUB-023). Defaults to
|
|
88
|
-
* the empty registration: every resolved claim then fails closed (`BindingUnavailable` for a
|
|
89
|
-
* root, the framework `ChildCompatibilityFailure` Settlement for a parent-linked child).
|
|
90
|
-
*/
|
|
91
|
-
readonly bindings?: ReadonlyArray<ResolvedBinding> | undefined;
|
|
92
|
-
}
|
|
93
|
-
/** Every construction failure of the assembled Node durable runtime stack. */
|
|
94
|
-
type NodeDurableRuntimeInitializationError = NodePlatformConfigError | SqliteStorageInitializationError;
|
|
95
|
-
/** The services `NodeDurableRuntime.layer` provides. */
|
|
96
|
-
type NodeDurableRuntimeServices = DurableAgentRuntime | SubmissionLedger | ConversationStore | WakeScheduler | DurableRuntimeConfig | NodeDurableRuntimeConfig | AgentBindingResolver;
|
|
97
|
-
/**
|
|
98
|
-
* Shutdown-drain decorator for a `SubmissionLedger` (deployment §6 step 6): every ownership
|
|
99
|
-
* period granted through this Layer is tracked — claims start tracking, renewals follow token
|
|
100
|
-
* rotation, releases and settlement finalizations stop it — and every ownership still held when
|
|
101
|
-
* the Layer's Scope closes is released so another host can claim the lane immediately instead of
|
|
102
|
-
* waiting for lease expiry. The drain is a liveness courtesy only; producer-epoch fencing remains
|
|
103
|
-
* the correctness authority (DUR-006), and a forced kill simply falls back to lease expiry.
|
|
104
|
-
*/
|
|
105
|
-
declare const ownershipDrainLayer: Layer.Layer<SubmissionLedger, never, SubmissionLedger>;
|
|
106
|
-
/**
|
|
107
|
-
* The DN Layer assembly (deployment §12: a Layer-assembly library, not an app entrypoint).
|
|
108
|
-
* `layer(options)` decodes the configuration, opens ONE SQLite database serving both the
|
|
109
|
-
* Conversation Log and the Submission Ledger (so claims fence the same producer epochs), wires
|
|
110
|
-
* the Node wake scheduler with its ledger-scan fallback, wraps the ledger with the shutdown
|
|
111
|
-
* ownership drain, defaults the Tool reconciliation policy to the fail-closed
|
|
112
|
-
* `ToolReconciler.uncertain` (override via `options.toolReconciler`), and provides a ready
|
|
113
|
-
* `DurableAgentRuntime` on top. Storage compatibility is
|
|
114
|
-
* verified during construction: an incompatible database file fails the Layer with
|
|
115
|
-
* `SqliteStorageCompatibilityError` before anything is mutated (DEPLOY-008).
|
|
116
|
-
*/
|
|
117
|
-
declare class NodeDurableRuntime {
|
|
118
|
-
/** Validated configuration Layer; fails typed when the supplied options are out of bounds. */
|
|
119
|
-
static configLayer(options: NodeDurableRuntimeOptions): Layer.Layer<NodeDurableRuntimeConfig, NodePlatformConfigError>;
|
|
120
|
-
/** The full DN runtime stack over one SQLite file. */
|
|
121
|
-
static layer(options: NodeDurableRuntimeOptions): Layer.Layer<NodeDurableRuntimeServices, NodeDurableRuntimeInitializationError>;
|
|
122
|
-
}
|
|
123
|
-
//#endregion
|
|
124
|
-
//#region src/host.d.ts
|
|
125
|
-
declare const AdmissionClosed_base: Schema.Class<AdmissionClosed, Schema.TaggedStruct<"AdmissionClosed", {
|
|
126
|
-
readonly message: Schema.String;
|
|
127
|
-
}>, import("effect/Cause").YieldableError>;
|
|
128
|
-
/**
|
|
129
|
-
* Admission is not open on this host: it is shutting down (deployment §6 step 1, DEPLOY-005).
|
|
130
|
-
* Accepted work is unaffected — only NEW admissions are refused.
|
|
131
|
-
*/
|
|
132
|
-
declare class AdmissionClosed extends AdmissionClosed_base {}
|
|
133
|
-
declare const NodeDurableHost_base: Context.ServiceClass<NodeDurableHost, "@effect-agent/platform-node/NodeDurableHost", {
|
|
134
|
-
/**
|
|
135
|
-
* The recovery decisions executed (or deferred) by this host's startup reconciliation.
|
|
136
|
-
* Reports with the `unknown` disposition identify lanes blocked on Unknown Outcomes that
|
|
137
|
-
* only the authorized DUR-017 resolution path can release.
|
|
138
|
-
*/
|
|
139
|
-
readonly startupRecovery: ReadonlyArray<RecoveryReport>;
|
|
140
|
-
/** Admission-role readiness (deployment §7): true until shutdown begins. */
|
|
141
|
-
readonly admissionOpen: Effect.Effect<boolean>;
|
|
142
|
-
/** `DurableAgentRuntime.submit` behind the host admission gate. */
|
|
143
|
-
readonly submit: <InputSchema extends Schema.Top>(agent: DurableSubmitAgent<InputSchema>, input: InputSchema["Type"], options: DurableSubmitOptions) => Effect.Effect<Receipt, AdmissionClosed | DurableSubmitFailure, InputSchema["EncodingServices"]>;
|
|
144
|
-
readonly awaitSettlement: (receipt: Receipt) => Effect.Effect<Settlement, DurableAwaitFailure>;
|
|
145
|
-
readonly observe: (receipt: Receipt, options?: DurableObserveOptions) => Stream.Stream<CanonicalRecordEnvelope, ConversationStoreError | ConversationNotMaterialized | OperationDenied>;
|
|
146
|
-
readonly abort: (command: AbortCommand) => Effect.Effect<AbortIntent, DurableAbortFailure>;
|
|
147
|
-
/** `DurableAgentRuntime.explain` — read-only recovery explanation of one Submission (P7). */
|
|
148
|
-
readonly explain: (submissionId: SubmissionId) => Effect.Effect<RecoveryExplanation, DurableExplainFailure>;
|
|
149
|
-
/** `DurableAgentRuntime.explainConversation` — explain every nonterminal lane member. */
|
|
150
|
-
readonly explainConversation: (conversationId: ConversationId) => Effect.Effect<ReadonlyArray<RecoveryExplanation>, DurableExplainFailure>;
|
|
151
|
-
/** `DurableAgentRuntime.verify` — read-only integrity checks, never a repair (P7). */
|
|
152
|
-
readonly verify: (conversationId: ConversationId) => Effect.Effect<IntegrityReport, DurableVerifyFailure>;
|
|
153
|
-
/** `DurableAgentRuntime.retry` — audited single-Submission re-drive with typed refusals. */
|
|
154
|
-
readonly retry: (command: RetryCommand) => Effect.Effect<RecoveryReport, DurableRetryFailure>;
|
|
155
|
-
/** `DurableAgentRuntime.wake` — the documented operator liveness nudge for one lane. */
|
|
156
|
-
readonly wake: (conversationId: ConversationId) => Effect.Effect<void, OperationDenied>;
|
|
157
|
-
/** `DurableAgentRuntime.scanObligations` — the scan-based DUR-017/OPS-001 report. */
|
|
158
|
-
readonly scanObligations: (thresholds: ObligationThresholds) => Effect.Effect<ObligationReport, DurableObligationFailure>;
|
|
159
|
-
/**
|
|
160
|
-
* Run `workerConcurrency` copies of the given worker effect (typically
|
|
161
|
-
* `DurableAgentRuntime.runWorker(agent)`) until the caller's Scope interrupts them. The
|
|
162
|
-
* bound is the validated finite configuration value; the host never forks daemon fibers.
|
|
163
|
-
*/
|
|
164
|
-
readonly runWorkers: <A, E, R>(worker: Effect.Effect<A, E, R>) => Effect.Effect<void, E, R>;
|
|
165
|
-
/**
|
|
166
|
-
* Run `workerConcurrency` copies of `DurableAgentRuntime.runResolvedWorker` over the host's
|
|
167
|
-
* registered Bindings (S2): every claimed head resolves its exact stored Binding before any
|
|
168
|
-
* code runs (SUB-023), so one bounded pool serves parent and attached-child lanes.
|
|
169
|
-
*/
|
|
170
|
-
readonly runResolvedWorkers: Effect.Effect<void, DurableWorkerFailure | DurableBindingFailure>;
|
|
171
|
-
}>;
|
|
172
|
-
/**
|
|
173
|
-
* Operational host lifecycle for the DN runtime (deployment §2/§5/§6).
|
|
174
|
-
*
|
|
175
|
-
* Startup gates run during Layer construction, so the service existing implies readiness:
|
|
176
|
-
* configuration was schema-decoded, the SQLite file passed the exact-version compatibility check,
|
|
177
|
-
* and every nonterminal Submission went through one full recovery pass BEFORE admission opened.
|
|
178
|
-
* `startupRecovery` is the auditable evidence of that reconciliation pass.
|
|
179
|
-
*
|
|
180
|
-
* Shutdown runs in reverse Layer order when the owning Scope closes: `submit` starts refusing
|
|
181
|
-
* with `AdmissionClosed` first, then the runtime Layer's ownership drain releases every claim
|
|
182
|
-
* still held so another host can take over the lanes immediately, then the SQLite resources
|
|
183
|
-
* close. Forced termination at any point stays safe — the durability protocol, not graceful
|
|
184
|
-
* shutdown, provides correctness (DEPLOY-006).
|
|
185
|
-
*/
|
|
186
|
-
declare class NodeDurableHost extends NodeDurableHost_base {
|
|
187
|
-
/** Host gates over an already-assembled `NodeDurableRuntime` stack. */
|
|
188
|
-
static readonly layer: Layer.Layer<NodeDurableHost, DurableWorkerFailure, DurableAgentRuntime | NodeDurableRuntimeConfig | AgentBindingResolver>;
|
|
189
|
-
/** The complete DN host: `NodeDurableRuntime.layer(options)` plus the host lifecycle gates. */
|
|
190
|
-
static layerStack(options: NodeDurableRuntimeOptions): Layer.Layer<NodeDurableHost | NodeDurableRuntimeServices, DurableWorkerFailure | NodeDurableRuntimeInitializationError>;
|
|
191
|
-
}
|
|
192
|
-
//#endregion
|
|
193
|
-
//#region src/wake-scheduler.d.ts
|
|
194
|
-
declare const NodeWakeSchedulerConfig_base: Context.ServiceClass<NodeWakeSchedulerConfig, "@effect-agent/platform-node/NodeWakeSchedulerConfig", {
|
|
195
|
-
/** Interval between ledger scans that re-emit every nonterminal Conversation lane. */
|
|
196
|
-
readonly scanInterval: Duration.Duration;
|
|
197
|
-
}>;
|
|
198
|
-
/** Cadence authority for the Node wake scheduler's ledger-scan fallback loop. */
|
|
199
|
-
declare class NodeWakeSchedulerConfig extends NodeWakeSchedulerConfig_base {
|
|
200
|
-
static layer(options: {
|
|
201
|
-
readonly scanInterval: Duration.Duration;
|
|
202
|
-
}): Layer.Layer<NodeWakeSchedulerConfig>;
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* In-process Node `WakeScheduler`: `notify` publishes to a bounded sliding PubSub for prompt
|
|
206
|
-
* same-process wakeups, and every `wakes` subscription additionally runs a periodic
|
|
207
|
-
* `SubmissionLedger.scanNonterminal` fallback so a dropped, coalesced, or never-sent notification
|
|
208
|
-
* can never strand accepted work (persistence §14). Delivery may duplicate; consumers already
|
|
209
|
-
* treat wakes as pure liveness hints.
|
|
210
|
-
*/
|
|
211
|
-
declare const nodeWakeSchedulerLayer: Layer.Layer<WakeScheduler, never, SubmissionLedger | NodeWakeSchedulerConfig>;
|
|
212
|
-
//#endregion
|
|
213
|
-
export { AdmissionClosed, NodeDurableHost, NodeDurableRuntime, NodeDurableRuntimeConfig, NodeDurableRuntimeConfigValue, NodeDurableRuntimeInitializationError, NodeDurableRuntimeOptions, NodeDurableRuntimeServices, NodePlatformConfigError, NodeWakeSchedulerConfig, nodeWakeSchedulerLayer, ownershipDrainLayer };
|
|
214
|
-
//# sourceMappingURL=index.d.mts.map
|
|
1
|
+
import { n as NodeWakeScheduler_d_exports } from "./NodeWakeScheduler-4ZeXYwPu.mjs";
|
|
2
|
+
import { s as NodeDurableAgentRuntime_d_exports } from "./NodeDurableAgentRuntime-CFElFzNF.mjs";
|
|
3
|
+
import { t as NodeDurableHost_d_exports } from "./NodeDurableHost.mjs";
|
|
4
|
+
import { t as NodeScheduling_d_exports } from "./NodeScheduling.mjs";
|
|
5
|
+
import { t as NodeSubscriptions_d_exports } from "./NodeSubscriptions.mjs";
|
|
6
|
+
export { NodeDurableAgentRuntime_d_exports as NodeDurableAgentRuntime, NodeDurableHost_d_exports as NodeDurableHost, NodeScheduling_d_exports as NodeScheduling, NodeSubscriptions_d_exports as NodeSubscriptions, NodeWakeScheduler_d_exports as NodeWakeScheduler };
|
package/dist/index.mjs
CHANGED
|
@@ -1,286 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Bounded in-process wake buffer. Wake hints are droppable by contract (the ledger-scan fallback
|
|
9
|
-
* keeps liveness), so a full buffer slides out the oldest hint instead of growing without bound.
|
|
10
|
-
*/
|
|
11
|
-
const WAKE_BUFFER_CAPACITY = 1024;
|
|
12
|
-
/** Cadence authority for the Node wake scheduler's ledger-scan fallback loop. */
|
|
13
|
-
var NodeWakeSchedulerConfig = class NodeWakeSchedulerConfig extends Context.Service()("@effect-agent/platform-node/NodeWakeSchedulerConfig") {
|
|
14
|
-
static layer(options) {
|
|
15
|
-
return Layer.succeed(NodeWakeSchedulerConfig)({ scanInterval: options.scanInterval });
|
|
16
|
-
}
|
|
17
|
-
};
|
|
18
|
-
const makeWakeScheduler = Effect.gen(function* () {
|
|
19
|
-
const ledger = yield* SubmissionLedger;
|
|
20
|
-
const config = yield* NodeWakeSchedulerConfig;
|
|
21
|
-
const hints = yield* PubSub.sliding(WAKE_BUFFER_CAPACITY);
|
|
22
|
-
yield* Effect.addFinalizer(() => PubSub.shutdown(hints));
|
|
23
|
-
/**
|
|
24
|
-
* One fallback scan: every Conversation lane with nonterminal work, deduplicated. A scan
|
|
25
|
-
* failure degrades to "no hints this round" — the wake channel has no error contract and the
|
|
26
|
-
* next round retries — but is logged so a persistently failing ledger stays visible.
|
|
27
|
-
*/
|
|
28
|
-
const scanOnce = Stream.runCollect(ledger.scanNonterminal).pipe(Effect.map((snapshots) => {
|
|
29
|
-
const lanes = /* @__PURE__ */ new Set();
|
|
30
|
-
for (const snapshot of snapshots) lanes.add(snapshot.conversationId);
|
|
31
|
-
return [...lanes];
|
|
32
|
-
}), Effect.catch((error) => Effect.logWarning("NodeWakeScheduler fallback scan failed", error).pipe(Effect.as([]))));
|
|
33
|
-
/**
|
|
34
|
-
* Deployment §3: correctness must not depend on in-memory notifications, so every `wakes` run
|
|
35
|
-
* merges its PubSub subscription with a Clock-driven ledger-scan loop. Both live entirely in
|
|
36
|
-
* the consuming run's Scope; no fiber outlives its subscriber.
|
|
37
|
-
*/
|
|
38
|
-
const fallbackScans = Stream.fromIterableEffectRepeat(Effect.sleep(config.scanInterval).pipe(Effect.andThen(scanOnce)));
|
|
39
|
-
return WakeScheduler.of({
|
|
40
|
-
notify: (conversationId) => PubSub.publish(hints, conversationId).pipe(Effect.asVoid),
|
|
41
|
-
wakes: Stream.merge(Stream.fromPubSub(hints), fallbackScans)
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
/**
|
|
45
|
-
* In-process Node `WakeScheduler`: `notify` publishes to a bounded sliding PubSub for prompt
|
|
46
|
-
* same-process wakeups, and every `wakes` subscription additionally runs a periodic
|
|
47
|
-
* `SubmissionLedger.scanNonterminal` fallback so a dropped, coalesced, or never-sent notification
|
|
48
|
-
* can never strand accepted work (persistence §14). Delivery may duplicate; consumers already
|
|
49
|
-
* treat wakes as pure liveness hints.
|
|
50
|
-
*/
|
|
51
|
-
const nodeWakeSchedulerLayer = Layer.effect(WakeScheduler)(makeWakeScheduler);
|
|
52
|
-
//#endregion
|
|
53
|
-
//#region src/layers.ts
|
|
54
|
-
const PositiveMillis = Schema.Int.check(Schema.isGreaterThan(0));
|
|
55
|
-
const NonNegativeMillis = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0));
|
|
56
|
-
const WorkerConcurrency = Schema.Int.check(Schema.isGreaterThanOrEqualTo(1), Schema.isLessThanOrEqualTo(64));
|
|
57
|
-
/** The supplied Node durable runtime configuration failed schema validation (DEPLOY-003). */
|
|
58
|
-
var NodePlatformConfigError = class extends Schema.TaggedError()("NodePlatformConfigError", {
|
|
59
|
-
message: Schema.String,
|
|
60
|
-
cause: Schema.optionalKey(Schema.Defect())
|
|
61
|
-
}) {};
|
|
62
|
-
/**
|
|
63
|
-
* Validated Node durable runtime configuration (deployment §4: decoded once during Layer
|
|
64
|
-
* construction, exposed as a typed service). Every cadence is in milliseconds and every bound is
|
|
65
|
-
* finite; `workerConcurrency` caps how many worker loops `NodeDurableHost.runWorkers` drives.
|
|
66
|
-
*/
|
|
67
|
-
var NodeDurableRuntimeConfigValue = class extends Schema.Class("@effect-agent/platform-node/NodeDurableRuntimeConfigValue")({
|
|
68
|
-
/** SQLite database file backing BOTH the Conversation Log and the Submission Ledger. */
|
|
69
|
-
filename: Schema.NonEmptyString,
|
|
70
|
-
deploymentId: DeploymentId,
|
|
71
|
-
producerId: ProducerId,
|
|
72
|
-
/** Submission ownership lease duration (D5); liveness hint only, epochs stay authoritative. */
|
|
73
|
-
ownershipLeaseDuration: PositiveMillis,
|
|
74
|
-
/** Finite bound on concurrent worker loops per host (rule 10). */
|
|
75
|
-
workerConcurrency: WorkerConcurrency,
|
|
76
|
-
/** Ledger-scan fallback cadence of the Node wake scheduler (deployment §3). */
|
|
77
|
-
wakeScanInterval: PositiveMillis,
|
|
78
|
-
/** `awaitSettlement` ledger re-check cadence when no wake arrives. */
|
|
79
|
-
settlementPollInterval: PositiveMillis,
|
|
80
|
-
/** Worker ownership-lease renewal cadence. */
|
|
81
|
-
leaseRenewalInterval: PositiveMillis,
|
|
82
|
-
/** Active-Run abort-intent poll cadence. */
|
|
83
|
-
abortPollInterval: PositiveMillis,
|
|
84
|
-
/** Bounded SQLITE_BUSY retry window for write-lock acquisition. */
|
|
85
|
-
busyTimeout: NonNegativeMillis,
|
|
86
|
-
/** Canonical observation poll cadence of the SQLite store. */
|
|
87
|
-
observationPollInterval: NonNegativeMillis,
|
|
88
|
-
/** Opt-in full payload/digest-chain audit while opening the store. */
|
|
89
|
-
verifyOnOpen: Schema.Boolean
|
|
90
|
-
}) {};
|
|
91
|
-
/** Explicit configuration authority for the assembled Node durable runtime. */
|
|
92
|
-
var NodeDurableRuntimeConfig = class extends Context.Service()("@effect-agent/platform-node/NodeDurableRuntimeConfig") {};
|
|
93
|
-
const decodeConfigValue = Schema.decodeUnknownEffect(NodeDurableRuntimeConfigValue);
|
|
94
|
-
const configFromOptions = (options) => decodeConfigValue({
|
|
95
|
-
filename: options.filename,
|
|
96
|
-
deploymentId: options.deploymentId,
|
|
97
|
-
producerId: options.producerId,
|
|
98
|
-
ownershipLeaseDuration: options.ownershipLeaseDuration ?? Duration.toMillis(DEFAULT_OWNERSHIP_LEASE_DURATION),
|
|
99
|
-
workerConcurrency: options.workerConcurrency ?? 1,
|
|
100
|
-
wakeScanInterval: options.wakeScanInterval ?? 1e3,
|
|
101
|
-
settlementPollInterval: options.settlementPollInterval ?? 500,
|
|
102
|
-
leaseRenewalInterval: options.leaseRenewalInterval ?? 1e4,
|
|
103
|
-
abortPollInterval: options.abortPollInterval ?? 500,
|
|
104
|
-
busyTimeout: options.busyTimeout ?? 5e3,
|
|
105
|
-
observationPollInterval: options.observationPollInterval ?? 25,
|
|
106
|
-
verifyOnOpen: options.verifyOnOpen ?? false
|
|
107
|
-
}).pipe(Effect.mapError((error) => NodePlatformConfigError.make({
|
|
108
|
-
message: `Invalid Node durable runtime configuration: ${error.message}`,
|
|
109
|
-
cause: error
|
|
110
|
-
})));
|
|
111
|
-
/** SQLite storage configuration derived from the single validated Node configuration. */
|
|
112
|
-
const sqliteStorageConfigLayer = Layer.effect(SqliteStorageConfig)(Effect.gen(function* () {
|
|
113
|
-
const config = yield* NodeDurableRuntimeConfig;
|
|
114
|
-
return SqliteStorageConfigValue.make({
|
|
115
|
-
observationPollInterval: config.observationPollInterval,
|
|
116
|
-
busyTimeout: config.busyTimeout,
|
|
117
|
-
ownershipLeaseDuration: config.ownershipLeaseDuration,
|
|
118
|
-
verifyOnOpen: config.verifyOnOpen
|
|
119
|
-
});
|
|
120
|
-
}));
|
|
121
|
-
/** Session coordinator configuration derived from the single validated Node configuration. */
|
|
122
|
-
const durableRuntimeConfigLayer = Layer.effect(DurableRuntimeConfig)(Effect.gen(function* () {
|
|
123
|
-
const config = yield* NodeDurableRuntimeConfig;
|
|
124
|
-
return DurableRuntimeConfig.make({
|
|
125
|
-
deploymentId: config.deploymentId,
|
|
126
|
-
producerId: config.producerId,
|
|
127
|
-
settlementPollInterval: Duration.millis(config.settlementPollInterval),
|
|
128
|
-
leaseRenewalInterval: Duration.millis(config.leaseRenewalInterval),
|
|
129
|
-
abortPollInterval: Duration.millis(config.abortPollInterval)
|
|
130
|
-
});
|
|
131
|
-
}));
|
|
132
|
-
/** Wake fallback-scan cadence derived from the single validated Node configuration. */
|
|
133
|
-
const wakeSchedulerConfigLayer = Layer.effect(NodeWakeSchedulerConfig)(Effect.gen(function* () {
|
|
134
|
-
const config = yield* NodeDurableRuntimeConfig;
|
|
135
|
-
return { scanInterval: Duration.millis(config.wakeScanInterval) };
|
|
136
|
-
}));
|
|
137
|
-
const releaseTrackedOwnership = (ledger, registry) => Effect.gen(function* () {
|
|
138
|
-
const tracked = yield* Ref.getAndSet(registry, /* @__PURE__ */ new Map());
|
|
139
|
-
for (const [submissionId, ownershipToken] of tracked) yield* ledger.releaseOwnership(ReleaseOwnershipRequest.make({
|
|
140
|
-
submissionId,
|
|
141
|
-
ownershipToken
|
|
142
|
-
})).pipe(Effect.catchTags({
|
|
143
|
-
OwnershipLost: () => Effect.void,
|
|
144
|
-
LedgerError: (error) => Effect.logWarning("Ownership drain failed; the lease will expire instead", error)
|
|
145
|
-
}));
|
|
146
|
-
});
|
|
147
|
-
/**
|
|
148
|
-
* Shutdown-drain decorator for a `SubmissionLedger` (deployment §6 step 6): every ownership
|
|
149
|
-
* period granted through this Layer is tracked — claims start tracking, renewals follow token
|
|
150
|
-
* rotation, releases and settlement finalizations stop it — and every ownership still held when
|
|
151
|
-
* the Layer's Scope closes is released so another host can claim the lane immediately instead of
|
|
152
|
-
* waiting for lease expiry. The drain is a liveness courtesy only; producer-epoch fencing remains
|
|
153
|
-
* the correctness authority (DUR-006), and a forced kill simply falls back to lease expiry.
|
|
154
|
-
*/
|
|
155
|
-
const ownershipDrainLayer = Layer.effect(SubmissionLedger)(Effect.gen(function* () {
|
|
156
|
-
const ledger = yield* SubmissionLedger;
|
|
157
|
-
const registry = yield* Ref.make(/* @__PURE__ */ new Map());
|
|
158
|
-
const track = (submissionId, ownershipToken) => Ref.update(registry, (tracked) => new Map(tracked).set(submissionId, ownershipToken));
|
|
159
|
-
const untrack = (submissionId) => Ref.update(registry, (tracked) => {
|
|
160
|
-
const next = new Map(tracked);
|
|
161
|
-
next.delete(submissionId);
|
|
162
|
-
return next;
|
|
163
|
-
});
|
|
164
|
-
yield* Effect.addFinalizer(() => releaseTrackedOwnership(ledger, registry));
|
|
165
|
-
return SubmissionLedger.of({
|
|
166
|
-
capabilities: ledger.capabilities,
|
|
167
|
-
admit: ledger.admit,
|
|
168
|
-
markReady: ledger.markReady,
|
|
169
|
-
lookup: ledger.lookup,
|
|
170
|
-
resolveAdmission: ledger.resolveAdmission,
|
|
171
|
-
recordChildSettled: ledger.recordChildSettled,
|
|
172
|
-
reserveChildBudget: ledger.reserveChildBudget,
|
|
173
|
-
attachChildToReservation: ledger.attachChildToReservation,
|
|
174
|
-
beginChildBudgetRelease: ledger.beginChildBudgetRelease,
|
|
175
|
-
releaseChildBudget: ledger.releaseChildBudget,
|
|
176
|
-
claim: (request) => ledger.claim(request).pipe(Effect.tap((claimed) => claimed._tag === "Some" ? track(claimed.value.submissionId, claimed.value.ownershipToken) : Effect.void)),
|
|
177
|
-
renewOwnership: (request) => ledger.renewOwnership(request).pipe(Effect.tap((renewal) => track(request.submissionId, renewal.ownershipToken)), Effect.tapError((error) => error._tag === "OwnershipLost" ? untrack(request.submissionId) : Effect.void)),
|
|
178
|
-
releaseOwnership: (request) => ledger.releaseOwnership(request).pipe(Effect.tap(() => untrack(request.submissionId)), Effect.tapError((error) => error._tag === "OwnershipLost" ? untrack(request.submissionId) : Effect.void)),
|
|
179
|
-
markInputApplied: ledger.markInputApplied,
|
|
180
|
-
reserveSettlement: ledger.reserveSettlement,
|
|
181
|
-
finalizeSettlement: (request) => ledger.finalizeSettlement(request).pipe(Effect.tap(() => untrack(request.submissionId))),
|
|
182
|
-
requestAbort: ledger.requestAbort,
|
|
183
|
-
claimJoining: ledger.claimJoining,
|
|
184
|
-
markJoined: ledger.markJoined,
|
|
185
|
-
revertJoining: ledger.revertJoining,
|
|
186
|
-
suspend: (request) => ledger.suspend(request).pipe(Effect.tap(() => untrack(request.submissionId))),
|
|
187
|
-
recordApprovalDecision: ledger.recordApprovalDecision,
|
|
188
|
-
markUnknown: ledger.markUnknown,
|
|
189
|
-
recordUnknownResolution: ledger.recordUnknownResolution,
|
|
190
|
-
scanNonterminal: ledger.scanNonterminal,
|
|
191
|
-
loadRecoverySnapshot: ledger.loadRecoverySnapshot
|
|
192
|
-
});
|
|
193
|
-
}));
|
|
194
|
-
/**
|
|
195
|
-
* The DN Layer assembly (deployment §12: a Layer-assembly library, not an app entrypoint).
|
|
196
|
-
* `layer(options)` decodes the configuration, opens ONE SQLite database serving both the
|
|
197
|
-
* Conversation Log and the Submission Ledger (so claims fence the same producer epochs), wires
|
|
198
|
-
* the Node wake scheduler with its ledger-scan fallback, wraps the ledger with the shutdown
|
|
199
|
-
* ownership drain, defaults the Tool reconciliation policy to the fail-closed
|
|
200
|
-
* `ToolReconciler.uncertain` (override via `options.toolReconciler`), and provides a ready
|
|
201
|
-
* `DurableAgentRuntime` on top. Storage compatibility is
|
|
202
|
-
* verified during construction: an incompatible database file fails the Layer with
|
|
203
|
-
* `SqliteStorageCompatibilityError` before anything is mutated (DEPLOY-008).
|
|
204
|
-
*/
|
|
205
|
-
var NodeDurableRuntime = class NodeDurableRuntime {
|
|
206
|
-
/** Validated configuration Layer; fails typed when the supplied options are out of bounds. */
|
|
207
|
-
static configLayer(options) {
|
|
208
|
-
return Layer.effect(NodeDurableRuntimeConfig)(configFromOptions(options));
|
|
209
|
-
}
|
|
210
|
-
/** The full DN runtime stack over one SQLite file. */
|
|
211
|
-
static layer(options) {
|
|
212
|
-
const infrastructure = Layer.mergeAll(sqliteStorageConfigLayer, storageFailpointLayer({
|
|
213
|
-
filename: options.filename,
|
|
214
|
-
failpoint: options.storageFailpoint
|
|
215
|
-
}), SqliteClient.layer({ filename: options.filename }), NodeCrypto.layer);
|
|
216
|
-
const runtimeFailpointLayer = options.runtimeFailpoint === void 0 ? DurableRuntimeFailpoint.layer : Layer.succeed(DurableRuntimeFailpoint)({ hit: options.runtimeFailpoint });
|
|
217
|
-
const reconcilerLayer = options.toolReconciler ?? ToolReconciler.uncertain;
|
|
218
|
-
const bindingResolverLayer = AgentBindingResolver.layer(options.bindings ?? []);
|
|
219
|
-
const ports = Layer.mergeAll(conversationStoreLayer, nodeWakeSchedulerLayer.pipe(Layer.provideMerge(ownershipDrainLayer.pipe(Layer.provide(submissionLedgerLayer)))));
|
|
220
|
-
return DurableAgentRuntime.layer.pipe(Layer.provideMerge(Layer.mergeAll(ports, durableRuntimeConfigLayer, bindingResolverLayer)), Layer.provide(Layer.mergeAll(wakeSchedulerConfigLayer, runtimeFailpointLayer, reconcilerLayer)), Layer.provideMerge(infrastructure), Layer.provideMerge(NodeDurableRuntime.configLayer(options)));
|
|
221
|
-
}
|
|
222
|
-
};
|
|
223
|
-
//#endregion
|
|
224
|
-
//#region src/host.ts
|
|
225
|
-
/**
|
|
226
|
-
* Admission is not open on this host: it is shutting down (deployment §6 step 1, DEPLOY-005).
|
|
227
|
-
* Accepted work is unaffected — only NEW admissions are refused.
|
|
228
|
-
*/
|
|
229
|
-
var AdmissionClosed = class extends Schema.TaggedError()("AdmissionClosed", { message: Schema.String }) {};
|
|
230
|
-
const makeHost = Effect.gen(function* () {
|
|
231
|
-
const runtime = yield* DurableAgentRuntime;
|
|
232
|
-
const config = yield* NodeDurableRuntimeConfig;
|
|
233
|
-
const bindingResolver = yield* AgentBindingResolver;
|
|
234
|
-
const startupRecovery = yield* runtime.runRecovery;
|
|
235
|
-
const admission = yield* Ref.make(true);
|
|
236
|
-
yield* Effect.addFinalizer(() => Ref.set(admission, false));
|
|
237
|
-
const requireAdmission = Ref.get(admission).pipe(Effect.flatMap((open) => open ? Effect.void : Effect.fail(AdmissionClosed.make({ message: "The host is shutting down; admission is closed." }))));
|
|
238
|
-
const submit = (agent, input, options) => requireAdmission.pipe(Effect.andThen(runtime.submit(agent, input, options)));
|
|
239
|
-
const runWorkers = (worker) => Effect.forEach(Array.from({ length: config.workerConcurrency }, (_, index) => index), () => worker, {
|
|
240
|
-
concurrency: "unbounded",
|
|
241
|
-
discard: true
|
|
242
|
-
});
|
|
243
|
-
const runResolvedWorkers = runWorkers(runtime.runResolvedWorker.pipe(Effect.provideService(AgentBindingResolver, bindingResolver)));
|
|
244
|
-
return NodeDurableHost.of({
|
|
245
|
-
startupRecovery,
|
|
246
|
-
admissionOpen: Ref.get(admission),
|
|
247
|
-
submit,
|
|
248
|
-
awaitSettlement: runtime.awaitSettlement,
|
|
249
|
-
observe: runtime.observe,
|
|
250
|
-
abort: runtime.abort,
|
|
251
|
-
explain: runtime.explain,
|
|
252
|
-
explainConversation: runtime.explainConversation,
|
|
253
|
-
verify: runtime.verify,
|
|
254
|
-
retry: runtime.retry,
|
|
255
|
-
wake: runtime.wake,
|
|
256
|
-
scanObligations: runtime.scanObligations,
|
|
257
|
-
runWorkers,
|
|
258
|
-
runResolvedWorkers
|
|
259
|
-
});
|
|
260
|
-
});
|
|
261
|
-
/**
|
|
262
|
-
* Operational host lifecycle for the DN runtime (deployment §2/§5/§6).
|
|
263
|
-
*
|
|
264
|
-
* Startup gates run during Layer construction, so the service existing implies readiness:
|
|
265
|
-
* configuration was schema-decoded, the SQLite file passed the exact-version compatibility check,
|
|
266
|
-
* and every nonterminal Submission went through one full recovery pass BEFORE admission opened.
|
|
267
|
-
* `startupRecovery` is the auditable evidence of that reconciliation pass.
|
|
268
|
-
*
|
|
269
|
-
* Shutdown runs in reverse Layer order when the owning Scope closes: `submit` starts refusing
|
|
270
|
-
* with `AdmissionClosed` first, then the runtime Layer's ownership drain releases every claim
|
|
271
|
-
* still held so another host can take over the lanes immediately, then the SQLite resources
|
|
272
|
-
* close. Forced termination at any point stays safe — the durability protocol, not graceful
|
|
273
|
-
* shutdown, provides correctness (DEPLOY-006).
|
|
274
|
-
*/
|
|
275
|
-
var NodeDurableHost = class NodeDurableHost extends Context.Service()("@effect-agent/platform-node/NodeDurableHost") {
|
|
276
|
-
/** Host gates over an already-assembled `NodeDurableRuntime` stack. */
|
|
277
|
-
static layer = Layer.effect(NodeDurableHost)(makeHost);
|
|
278
|
-
/** The complete DN host: `NodeDurableRuntime.layer(options)` plus the host lifecycle gates. */
|
|
279
|
-
static layerStack(options) {
|
|
280
|
-
return NodeDurableHost.layer.pipe(Layer.provideMerge(NodeDurableRuntime.layer(options)));
|
|
281
|
-
}
|
|
282
|
-
};
|
|
283
|
-
//#endregion
|
|
284
|
-
export { AdmissionClosed, NodeDurableHost, NodeDurableRuntime, NodeDurableRuntimeConfig, NodeDurableRuntimeConfigValue, NodePlatformConfigError, NodeWakeSchedulerConfig, nodeWakeSchedulerLayer, ownershipDrainLayer };
|
|
285
|
-
|
|
286
|
-
//# sourceMappingURL=index.mjs.map
|
|
1
|
+
import { t as NodeWakeScheduler_exports } from "./NodeWakeScheduler.mjs";
|
|
2
|
+
import { t as NodeDurableAgentRuntime_exports } from "./NodeDurableAgentRuntime.mjs";
|
|
3
|
+
import { r as NodeDurableHost_exports } from "./NodeDurableHost-BMSajuQn.mjs";
|
|
4
|
+
import { t as NodeSubscriptions_exports } from "./NodeSubscriptions.mjs";
|
|
5
|
+
import { t as NodeScheduling_exports } from "./NodeScheduling.mjs";
|
|
6
|
+
export { NodeDurableAgentRuntime_exports as NodeDurableAgentRuntime, NodeDurableHost_exports as NodeDurableHost, NodeScheduling_exports as NodeScheduling, NodeSubscriptions_exports as NodeSubscriptions, NodeWakeScheduler_exports as NodeWakeScheduler };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
//#region \0rolldown/runtime.js
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __exportAll = (all, no_symbols) => {
|
|
4
|
+
let target = {};
|
|
5
|
+
for (var name in all) __defProp(target, name, {
|
|
6
|
+
get: all[name],
|
|
7
|
+
enumerable: true
|
|
8
|
+
});
|
|
9
|
+
if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
|
|
10
|
+
return target;
|
|
11
|
+
};
|
|
12
|
+
//#endregion
|
|
13
|
+
export { __exportAll as t };
|
package/package.json
CHANGED
|
@@ -1,45 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@effect-agent/platform-node",
|
|
3
|
-
"version": "0.1.0-beta.6",
|
|
4
|
-
"description": "Class DN layer assembly for Effect Agent: the durable Node/SQLite runtime host, wake scheduler, and ownership drain.",
|
|
5
|
-
"license": "MIT",
|
|
6
|
-
"repository": {
|
|
7
|
-
"type": "git",
|
|
8
|
-
"url": "git+https://github.com/danieljvdm/effect-agent.git",
|
|
9
|
-
"directory": "packages/platform-node"
|
|
10
|
-
},
|
|
11
|
-
"files": [
|
|
12
|
-
"dist",
|
|
13
|
-
"src"
|
|
14
|
-
],
|
|
15
|
-
"type": "module",
|
|
16
|
-
"exports": {
|
|
17
|
-
".": {
|
|
18
|
-
"types": "./dist/index.d.mts",
|
|
19
|
-
"default": "./dist/index.mjs"
|
|
20
|
-
}
|
|
21
|
-
},
|
|
22
|
-
"publishConfig": {
|
|
23
|
-
"access": "public"
|
|
24
|
-
},
|
|
25
|
-
"scripts": {
|
|
26
|
-
"build": "vp pack",
|
|
27
|
-
"check": "tsc --noEmit -p tsconfig.json",
|
|
28
|
-
"test": "vp test --passWithNoTests"
|
|
29
|
-
},
|
|
30
|
-
"dependencies": {
|
|
31
|
-
"@effect-agent/core": "0.1.0-beta.6",
|
|
32
|
-
"@effect-agent/session": "0.1.0-beta.6",
|
|
33
|
-
"@effect-agent/storage-sqlite": "0.1.0-beta.6",
|
|
34
|
-
"@effect/platform-node": "4.0.0-beta.107",
|
|
35
|
-
"@effect/sql-sqlite-node": "4.0.0-beta.107",
|
|
36
|
-
"effect": "4.0.0-beta.107"
|
|
37
|
-
},
|
|
38
|
-
"devDependencies": {
|
|
39
|
-
"@effect-agent/capabilities": "0.0.1-beta.5",
|
|
40
|
-
"@effect-agent/engine": "0.0.1-beta.5",
|
|
41
|
-
"@effect/vitest": "4.0.0-beta.107",
|
|
42
|
-
"typescript": "7.0.2",
|
|
43
|
-
"vite-plus": "0.2.6"
|
|
44
|
-
}
|
|
45
|
-
}
|
|
1
|
+
{"name":"@effect-agent/platform-node","version":"0.1.0-beta.60","dependencies":{"@effect-agent/core":"0.1.0-beta.60","@effect-agent/engine":"0.1.0-beta.60","@effect-agent/storage-sqlite":"0.1.0-beta.60","@effect-agent/thread":"0.1.0-beta.60","@effect-agent/workflow":"0.1.0-beta.60","@effect/platform-node":"4.0.0-rc.112","@effect/sql-sqlite-node":"4.0.0-rc.112"},"devDependencies":{"@effect-agent/capabilities":"0.1.0-beta.60","@effect/vitest":"4.0.0-rc.112","effect":"4.0.0-rc.112","typescript":"7.0.2","vite-plus":"0.3.0"},"peerDependencies":{"effect":"^4.0.0-rc.112"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./NodeDurableAgentRuntime":{"types":"./dist/NodeDurableAgentRuntime.d.mts","default":"./dist/NodeDurableAgentRuntime.mjs"},"./NodeDurableHost":{"types":"./dist/NodeDurableHost.d.mts","default":"./dist/NodeDurableHost.mjs"},"./NodeScheduling":{"types":"./dist/NodeScheduling.d.mts","default":"./dist/NodeScheduling.mjs"},"./NodeSubscriptions":{"types":"./dist/NodeSubscriptions.d.mts","default":"./dist/NodeSubscriptions.mjs"},"./NodeWakeScheduler":{"types":"./dist/NodeWakeScheduler.d.mts","default":"./dist/NodeWakeScheduler.mjs"},"./NodeWorkflow":{"types":"./dist/NodeWorkflow.d.mts","default":"./dist/NodeWorkflow.mjs"}},"description":"Class DN layer assembly for Effect Agent: the durable Node/SQLite runtime host, wake scheduler, and ownership drain.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/danieljvdm/effect-agent.git","directory":"packages/platform-node"},"files":["dist","src"],"type":"module","sideEffects":[],"publishConfig":{"access":"public"},"scripts":{"build":"vp pack","check":"tsc --noEmit -p tsconfig.json"}}
|