@spine-event-engine/storage 2.0.0-snapshot.21 → 2.0.0-snapshot.23
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 +7 -0
- package/REFERENCE.md +106 -1
- package/dist/entity/agent-execution-record-spec.d.ts +87 -0
- package/dist/entity/agent-execution-record-spec.d.ts.map +1 -0
- package/dist/entity/agent-execution-record-spec.js +230 -0
- package/dist/entity/agent-execution-record-spec.js.map +1 -0
- package/dist/entity/agent-execution-sizes.d.ts +30 -0
- package/dist/entity/agent-execution-sizes.d.ts.map +1 -0
- package/dist/entity/agent-execution-sizes.js +51 -0
- package/dist/entity/agent-execution-sizes.js.map +1 -0
- package/dist/entity/agent-execution-transitions.d.ts +71 -0
- package/dist/entity/agent-execution-transitions.d.ts.map +1 -0
- package/dist/entity/agent-execution-transitions.js +182 -0
- package/dist/entity/agent-execution-transitions.js.map +1 -0
- package/dist/entity/agent-execution-values.d.ts +142 -0
- package/dist/entity/agent-execution-values.d.ts.map +1 -0
- package/dist/entity/agent-execution-values.js +250 -0
- package/dist/entity/agent-execution-values.js.map +1 -0
- package/dist/entity/agent-execution.d.ts +234 -0
- package/dist/entity/agent-execution.d.ts.map +1 -0
- package/dist/entity/agent-execution.js +15 -0
- package/dist/entity/agent-execution.js.map +1 -0
- package/dist/entity/agent-history-conformance.d.ts +78 -0
- package/dist/entity/agent-history-conformance.d.ts.map +1 -0
- package/dist/entity/agent-history-conformance.js +493 -0
- package/dist/entity/agent-history-conformance.js.map +1 -0
- package/dist/entity/agent-history-provider-page.d.ts +39 -0
- package/dist/entity/agent-history-provider-page.d.ts.map +1 -0
- package/dist/entity/agent-history-provider-page.js +82 -0
- package/dist/entity/agent-history-provider-page.js.map +1 -0
- package/dist/entity/agent-history-record-spec.d.ts +79 -0
- package/dist/entity/agent-history-record-spec.d.ts.map +1 -0
- package/dist/entity/agent-history-record-spec.js +147 -0
- package/dist/entity/agent-history-record-spec.js.map +1 -0
- package/dist/entity/agent-history.d.ts +196 -0
- package/dist/entity/agent-history.d.ts.map +1 -0
- package/dist/entity/agent-history.js +136 -0
- package/dist/entity/agent-history.js.map +1 -0
- package/dist/event/event-store.d.ts +52 -4
- package/dist/event/event-store.d.ts.map +1 -1
- package/dist/event/event-store.js +153 -4
- package/dist/event/event-store.js.map +1 -1
- package/dist/internal/agent-execution.d.ts +51 -0
- package/dist/internal/agent-execution.d.ts.map +1 -0
- package/dist/internal/agent-execution.js +53 -0
- package/dist/internal/agent-execution.js.map +1 -0
- package/dist/internal/agent-history.d.ts +48 -0
- package/dist/internal/agent-history.d.ts.map +1 -0
- package/dist/internal/agent-history.js +52 -0
- package/dist/internal/agent-history.js.map +1 -0
- package/dist/internal/entity-history.d.ts +11 -0
- package/dist/internal/entity-history.d.ts.map +1 -1
- package/dist/internal/entity-history.js +10 -0
- package/dist/internal/entity-history.js.map +1 -1
- package/dist/internal/tenancy.d.ts +87 -1
- package/dist/internal/tenancy.d.ts.map +1 -1
- package/dist/internal/tenancy.js +39 -0
- package/dist/internal/tenancy.js.map +1 -1
- package/dist/memory/agent-execution-head-index.d.ts +52 -0
- package/dist/memory/agent-execution-head-index.d.ts.map +1 -0
- package/dist/memory/agent-execution-head-index.js +91 -0
- package/dist/memory/agent-execution-head-index.js.map +1 -0
- package/dist/memory/agent-history-index.d.ts +49 -0
- package/dist/memory/agent-history-index.d.ts.map +1 -0
- package/dist/memory/agent-history-index.js +239 -0
- package/dist/memory/agent-history-index.js.map +1 -0
- package/dist/memory/agent-history-mutation-queue.d.ts +17 -0
- package/dist/memory/agent-history-mutation-queue.d.ts.map +1 -0
- package/dist/memory/agent-history-mutation-queue.js +31 -0
- package/dist/memory/agent-history-mutation-queue.js.map +1 -0
- package/dist/memory/in-memory-agent-execution.d.ts +21 -0
- package/dist/memory/in-memory-agent-execution.d.ts.map +1 -0
- package/dist/memory/in-memory-agent-execution.js +587 -0
- package/dist/memory/in-memory-agent-execution.js.map +1 -0
- package/dist/memory/in-memory-agent-history.d.ts +21 -0
- package/dist/memory/in-memory-agent-history.d.ts.map +1 -0
- package/dist/memory/in-memory-agent-history.js +133 -0
- package/dist/memory/in-memory-agent-history.js.map +1 -0
- package/dist/memory/in-memory-entity-commit.d.ts +17 -0
- package/dist/memory/in-memory-entity-commit.d.ts.map +1 -1
- package/dist/memory/in-memory-entity-commit.js +47 -3
- package/dist/memory/in-memory-entity-commit.js.map +1 -1
- package/dist/memory/in-memory-entity-history.d.ts +1 -1
- package/dist/memory/in-memory-entity-history.d.ts.map +1 -1
- package/dist/memory/in-memory-entity-history.js.map +1 -1
- package/dist/memory/in-memory-storage-backend.d.ts +18 -0
- package/dist/memory/in-memory-storage-backend.d.ts.map +1 -1
- package/dist/memory/in-memory-storage-backend.js +71 -0
- package/dist/memory/in-memory-storage-backend.js.map +1 -1
- package/dist/memory/in-memory-storage-factory.d.ts +37 -2
- package/dist/memory/in-memory-storage-factory.d.ts.map +1 -1
- package/dist/memory/in-memory-storage-factory.js +144 -3
- package/dist/memory/in-memory-storage-factory.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -5,6 +5,13 @@ includes an in-memory implementation for local development and tests. Use it
|
|
|
5
5
|
when an application needs a small record store, or when an adapter needs to
|
|
6
6
|
implement the same storage contract for a durable provider.
|
|
7
7
|
|
|
8
|
+
Agents use the configured storage provider to retain accepted work and the
|
|
9
|
+
recorded model interaction. The in-memory factory keeps these records only while
|
|
10
|
+
the process runs; choose a database provider when they must survive a restart.
|
|
11
|
+
Applications read an Agent's history through its repository, as shown in the
|
|
12
|
+
[support example](https://github.com/SpineEventEngine/spine-ts/blob/master/examples/support/README.md). Adapter implementation
|
|
13
|
+
details are in the [coding-agent reference](REFERENCE.md#provider-spi).
|
|
14
|
+
|
|
8
15
|
This is an experimental snapshot package. Use Node 24 or newer and generated
|
|
9
16
|
Protobuf record schemas before configuring storage.
|
|
10
17
|
|
package/REFERENCE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @spine-event-engine/storage reference
|
|
2
2
|
|
|
3
|
-
This reference is for agents working with the Spine TS storage contract.
|
|
3
|
+
This reference is for coding agents working with the Spine TS storage contract.
|
|
4
4
|
|
|
5
5
|
## Public entry point
|
|
6
6
|
|
|
@@ -19,6 +19,111 @@ history and Entity commit contracts, query values, tenant boundaries/catalogs,
|
|
|
19
19
|
and delivery-cleanup handles. The storage root intentionally does not export
|
|
20
20
|
these provider seams; application code uses its root storage contracts instead.
|
|
21
21
|
|
|
22
|
+
The provider entry point also exports `AgentHistoryStorage`,
|
|
23
|
+
`AgentHistoryStorageFactories`, `AgentHistoryKeys`, and
|
|
24
|
+
`AgentHistoryConformance`. Calling `AgentHistoryStorageFactories.create()` to
|
|
25
|
+
open a handle fails if the supplied factory has not registered the capability.
|
|
26
|
+
Agent repository registration requires this capability. Opening the actual
|
|
27
|
+
tenant handle also checks the selected provider before accepting Agent work.
|
|
28
|
+
Agent history's append-only entries
|
|
29
|
+
retain the original conversation record or Event envelope,
|
|
30
|
+
ID, and occurrence time. The full, conversation, System, and domain views use
|
|
31
|
+
separate indexes. Conversation reads require a `ConversationId`. The complete
|
|
32
|
+
order is occurrence seconds and nanoseconds descending, then conversation,
|
|
33
|
+
System, domain, then unsigned UTF-8 record ID ascending. `AgentHistoryKeys`
|
|
34
|
+
derives a sortable index value from that order; it is not a record identity.
|
|
35
|
+
|
|
36
|
+
Provider reads require a positive count and accept an optional complete
|
|
37
|
+
ordering-key boundary and positive byte limit. Omitting the byte limit adds no
|
|
38
|
+
provider-contract default. A configured byte limit counts the sum of serialized
|
|
39
|
+
`AgentHistoryEntry` wrapper lengths, excluding provider framing. A page reports
|
|
40
|
+
whether older entries remain; if the first entry exceeds a configured byte
|
|
41
|
+
limit, the read rejects. Limits never remove stored entries. Identical repeated appends
|
|
42
|
+
are accepted, while different content with the same category and record ID
|
|
43
|
+
is rejected. `AgentHistoryConformance` runs reusable view, order, paging,
|
|
44
|
+
scope, and retention checks for adapter implementations. The memory provider
|
|
45
|
+
retains entries across handles sharing a backend during the process lifetime;
|
|
46
|
+
it does not provide restart durability.
|
|
47
|
+
The PostgreSQL, MySQL, and Datastore providers store complete entries in one
|
|
48
|
+
tenant-scoped `agent_history` record family with native full, category, and
|
|
49
|
+
conversation ordering indexes. Each derives a bounded physical record ID from
|
|
50
|
+
the full state type, Agent key, category, and original record ID, then checks
|
|
51
|
+
immutable payload equality on repeated appends. Their provider references
|
|
52
|
+
specify physical index and payload constraints.
|
|
53
|
+
|
|
54
|
+
## Tenant catalog paging
|
|
55
|
+
|
|
56
|
+
Storage adapters implement `TenantCatalog.page({ count, signal, after? })` from
|
|
57
|
+
the provider entry point. `count` is a positive safe integer and bounds
|
|
58
|
+
native candidates examined, including candidates filtered out as unrelated
|
|
59
|
+
namespaces. `signal` accepts a native `AbortSignal`; `TenantCatalogSignal`
|
|
60
|
+
describes the required members without requiring DOM declarations in storage
|
|
61
|
+
consumers. `TenantCatalogReads.require()` performs common request validation.
|
|
62
|
+
|
|
63
|
+
A `TenantCatalogPage` returns complete `boundaries`, `hasMore`, and an opaque
|
|
64
|
+
`after` continuation when more candidates remain. Pass that continuation to the
|
|
65
|
+
same catalog instance. Forged or cross-catalog continuations are rejected; the
|
|
66
|
+
cursor is an in-process value, not a durable domain record. An empty page can
|
|
67
|
+
still have more candidates. Continue until `hasMore` is false, rather than
|
|
68
|
+
stopping at the first empty page. Repeating a valid continuation may repeat the
|
|
69
|
+
page. A fresh sweep starts without a continuation.
|
|
70
|
+
|
|
71
|
+
Memory pages use an admission-time index and capture its length for that sweep;
|
|
72
|
+
PostgreSQL and MySQL page their configured tenant collections. Datastore pages
|
|
73
|
+
its bounded early-admission cache and then native namespace metadata using a
|
|
74
|
+
query limit and native cursor. A tenant can appear in both phases. Existing
|
|
75
|
+
Agent claims prevent that duplicate discovery from running the same accepted
|
|
76
|
+
invocation concurrently. An empty native `MORE_RESULTS_AFTER_LIMIT` tail that repeats its cursor ends
|
|
77
|
+
that sweep; other continuing pages must advance. Datastore destroys its query
|
|
78
|
+
stream when the caller cancels the read.
|
|
79
|
+
|
|
80
|
+
Catalogs check cancellation before starting work and before returning a result.
|
|
81
|
+
Paging is a finite traversal, not an atomic catalog snapshot: a concurrent
|
|
82
|
+
admission can appear in the current or next sweep. Agent recovery uses this
|
|
83
|
+
paged contract; the separate `all()` operation remains available for existing
|
|
84
|
+
callers that require the complete catalog.
|
|
85
|
+
|
|
86
|
+
## Agent execution storage
|
|
87
|
+
|
|
88
|
+
`AgentExecutionStorageFactories` opens the provider-only execution handle for an
|
|
89
|
+
Agent repository and tenant. `supports()` checks factory registration without
|
|
90
|
+
opening a tenant. It does not replace the provider checks made when admitting
|
|
91
|
+
work. Application code configures a storage factory; it does not claim or poll
|
|
92
|
+
these records directly.
|
|
93
|
+
|
|
94
|
+
The handle's `capacity` reports encoded execution, per-instance and history-record
|
|
95
|
+
limits plus a transaction payload limit where the provider enforces one.
|
|
96
|
+
`AgentExecutionSizes` measures the full internal Protobuf wrappers, including
|
|
97
|
+
scope and metadata. The runtime must allow for the bounded response and complete
|
|
98
|
+
record overhead before dispatch; a payload limit is not a history retention rule.
|
|
99
|
+
|
|
100
|
+
`admit()` stores the original signal, typed recipient and selected handlers once.
|
|
101
|
+
`claim()` permits one execution at a time for an Agent instance. `renew()`,
|
|
102
|
+
`update()`, `complete()` and `markDelivered()` check the current claim token.
|
|
103
|
+
Updates also compare the exact previously read record. Completion compares the
|
|
104
|
+
initial Entity Version and stores the Entity changes, mandatory histories, model
|
|
105
|
+
preferences and original outgoing signals in one provider operation. This includes
|
|
106
|
+
handlers that change no state or produce only a Command.
|
|
107
|
+
|
|
108
|
+
Pending queries read one pending invocation per Agent instance from an index. A page
|
|
109
|
+
carries its original time cutoff and the provider-observed continuation, so the
|
|
110
|
+
caller can continue even when another execution claims a returned invocation.
|
|
111
|
+
These internal pages are separate from application history pages. Eligibility
|
|
112
|
+
and claim expiry use Spine `Time`; original Inbox order determines which signal
|
|
113
|
+
runs next within an instance.
|
|
114
|
+
|
|
115
|
+
Each saved output can receive one delivery plan before transport begins. The
|
|
116
|
+
plan and original envelope cannot be replaced. `markDelivered()` requires that
|
|
117
|
+
plan and a current claim. The framework's internal EventStore retry operation
|
|
118
|
+
accepts an identical existing envelope; ordinary public EventStore append still
|
|
119
|
+
rejects duplicate IDs. Delivery retries must still visit every saved recipient.
|
|
120
|
+
These records do not make downstream application callbacks execute exactly once.
|
|
121
|
+
|
|
122
|
+
The memory implementation coordinates changes only within a shared in-process
|
|
123
|
+
backend. PostgreSQL, transactional MySQL and Datastore use native transactions.
|
|
124
|
+
Database query, index and payload requirements are documented in each provider's
|
|
125
|
+
reference. No execution-storage operation trims the Agent's history.
|
|
126
|
+
|
|
22
127
|
## Record storage
|
|
23
128
|
|
|
24
129
|
`StorageFactory.createRecordStorage(context, spec, group?)` returns an
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { Timestamp } from "@bufbuild/protobuf/wkt";
|
|
2
|
+
import { type AgentExecutionHead, type AgentExecutionRecord, type AgentExecutionScope, type AgentInboxOrder, type AgentInvocationKey, type AgentSignalKey } from "@spine-event-engine/proto/generated/spine/server/agent/execution_record_pb.js";
|
|
3
|
+
import { RecordSpec } from "../record/record-spec.js";
|
|
4
|
+
import { StorageGroup } from "../record/storage-group.js";
|
|
5
|
+
/**
|
|
6
|
+
* Describes physical execution record families and their indexed keys.
|
|
7
|
+
*/
|
|
8
|
+
interface AgentExecutionRecordLayout {
|
|
9
|
+
/**
|
|
10
|
+
* Shared invocation record family.
|
|
11
|
+
*/
|
|
12
|
+
readonly invocationGroup: StorageGroup;
|
|
13
|
+
/**
|
|
14
|
+
* Shared per-instance claim and preference family.
|
|
15
|
+
*/
|
|
16
|
+
readonly headGroup: StorageGroup;
|
|
17
|
+
/**
|
|
18
|
+
* Encodes the complete Agent instance scope.
|
|
19
|
+
*
|
|
20
|
+
* @param scope Generated state type and Agent key.
|
|
21
|
+
* @returns Complete encoded Agent instance scope.
|
|
22
|
+
*/
|
|
23
|
+
scope(scope: AgentExecutionScope): string;
|
|
24
|
+
/**
|
|
25
|
+
* Encodes full Agent scope for binary-collated continuations.
|
|
26
|
+
*
|
|
27
|
+
* @param scope Generated state type and Agent key.
|
|
28
|
+
* @returns Binary-collated Agent instance scope key.
|
|
29
|
+
*/
|
|
30
|
+
scopeOrder(scope: AgentExecutionScope): string;
|
|
31
|
+
/**
|
|
32
|
+
* Encodes the original source and Agent scope.
|
|
33
|
+
*
|
|
34
|
+
* @param key Original Agent invocation identity.
|
|
35
|
+
* @returns Complete immutable invocation key.
|
|
36
|
+
*/
|
|
37
|
+
invocation(key: AgentInvocationKey): string;
|
|
38
|
+
/**
|
|
39
|
+
* Encodes the typed original Command or Event ID.
|
|
40
|
+
*
|
|
41
|
+
* @param signal Original signal identity.
|
|
42
|
+
* @returns Complete typed source signal key.
|
|
43
|
+
*/
|
|
44
|
+
signal(signal: AgentSignalKey): string;
|
|
45
|
+
/**
|
|
46
|
+
* Encodes full Inbox time, version and source ID for binary order.
|
|
47
|
+
*
|
|
48
|
+
* @param order Original Inbox order.
|
|
49
|
+
* @returns Complete binary-collated Inbox order key.
|
|
50
|
+
*/
|
|
51
|
+
order(order: AgentInboxOrder): string;
|
|
52
|
+
/**
|
|
53
|
+
* Encodes provider eligibility time and complete Agent scope.
|
|
54
|
+
*
|
|
55
|
+
* @param eligibleAt Time when this head becomes eligible.
|
|
56
|
+
* @param scope Generated state type and Agent key.
|
|
57
|
+
* @returns Complete binary-collated eligibility and scope key.
|
|
58
|
+
*/
|
|
59
|
+
pendingKey(eligibleAt: Timestamp, scope: AgentExecutionScope): string;
|
|
60
|
+
/**
|
|
61
|
+
* Encodes the strict upper bound before all scopes at this time.
|
|
62
|
+
*
|
|
63
|
+
* @param asOf Fixed eligibility cutoff for the page.
|
|
64
|
+
* @returns Strict eligibility upper-bound key.
|
|
65
|
+
*/
|
|
66
|
+
pendingLower(asOf: Timestamp): string;
|
|
67
|
+
/**
|
|
68
|
+
* Creates the indexed invocation record specification.
|
|
69
|
+
*
|
|
70
|
+
* @param digest Fixed-width digest of the complete indexed value.
|
|
71
|
+
* @returns Invocation record layout and complete native index columns.
|
|
72
|
+
*/
|
|
73
|
+
invocationSpec(digest: (value: string) => string): RecordSpec<string, AgentExecutionRecord>;
|
|
74
|
+
/**
|
|
75
|
+
* Creates the indexed per-instance head specification.
|
|
76
|
+
*
|
|
77
|
+
* @param digest Fixed-width digest of the complete indexed value.
|
|
78
|
+
* @returns Per-instance head layout and complete native index columns.
|
|
79
|
+
*/
|
|
80
|
+
headSpec(digest: (value: string) => string): RecordSpec<string, AgentExecutionHead>;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Materializes complete Agent execution records and full indexed identities.
|
|
84
|
+
*/
|
|
85
|
+
export declare const AgentExecutionRecords: AgentExecutionRecordLayout;
|
|
86
|
+
export {};
|
|
87
|
+
//# sourceMappingURL=agent-execution-record-spec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-execution-record-spec.d.ts","sourceRoot":"","sources":["../../src/entity/agent-execution-record-spec.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACpB,MAAM,+EAA+E,CAAC;AAIvF,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAM1D;;GAEG;AACH,UAAU,0BAA0B;IAClC;;OAEG;IACH,QAAQ,CAAC,eAAe,EAAE,YAAY,CAAC;IAEvC;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IAEjC;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAAC;IAE1C;;;;;OAKG;IACH,UAAU,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAAC;IAE/C;;;;;OAKG;IACH,UAAU,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,CAAC;IAE5C;;;;;OAKG;IACH,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC;IAEvC;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAAC;IAEtC;;;;;;OAMG;IACH,UAAU,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAAC;IAEtE;;;;;OAKG;IACH,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;IAEtC;;;;;OAKG;IACH,cAAc,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAE5F;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CACrF;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,0BA8KnC,CAAC"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026, CodeMatters. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
|
5
|
+
* in compliance with the License. You may obtain a copy of the License at
|
|
6
|
+
*
|
|
7
|
+
* https://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
*
|
|
9
|
+
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
|
10
|
+
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
|
11
|
+
* or implied. See the License for the specific language governing permissions and limitations under
|
|
12
|
+
* the License.
|
|
13
|
+
*/
|
|
14
|
+
import { ScalarType } from "@bufbuild/protobuf";
|
|
15
|
+
import { AgentExecutionHeadSchema, AgentExecutionRecordSchema, } from "@spine-event-engine/proto/generated/spine/server/agent/execution_record_pb.js";
|
|
16
|
+
import { RecordColumn } from "../record/record-column.js";
|
|
17
|
+
import { ColumnTypes } from "../record/column-type.js";
|
|
18
|
+
import { RecordSpec } from "../record/record-spec.js";
|
|
19
|
+
import { StorageGroup } from "../record/storage-group.js";
|
|
20
|
+
const string = ColumnTypes.scalar(ScalarType.STRING);
|
|
21
|
+
const invocationGroup = new StorageGroup("agent_execution");
|
|
22
|
+
const headGroup = new StorageGroup("agent_execution_head");
|
|
23
|
+
/**
|
|
24
|
+
* Materializes complete Agent execution records and full indexed identities.
|
|
25
|
+
*/
|
|
26
|
+
export const AgentExecutionRecords = {
|
|
27
|
+
/**
|
|
28
|
+
* Shared physical invocation family inside one provider tenant.
|
|
29
|
+
*/
|
|
30
|
+
invocationGroup: invocationGroup,
|
|
31
|
+
/**
|
|
32
|
+
* Shared physical per-instance head family inside one provider tenant.
|
|
33
|
+
*/
|
|
34
|
+
headGroup: headGroup,
|
|
35
|
+
/**
|
|
36
|
+
* Encodes complete Agent scope without truncation.
|
|
37
|
+
*
|
|
38
|
+
* @param scope Generated state type and canonical typed Agent key.
|
|
39
|
+
* @returns Unambiguous complete scope text.
|
|
40
|
+
*/
|
|
41
|
+
scope(scope) {
|
|
42
|
+
if (!scope.stateType || !scope.agentKey)
|
|
43
|
+
throw new TypeError("Agent execution requires complete state type and Agent key.");
|
|
44
|
+
return JSON.stringify([scope.stateType, scope.agentKey]);
|
|
45
|
+
},
|
|
46
|
+
/**
|
|
47
|
+
* Encodes every scope byte for unambiguous binary continuation order.
|
|
48
|
+
*
|
|
49
|
+
* @param scope Generated state type and canonical typed Agent key.
|
|
50
|
+
* @returns Prefix-safe full ordering text.
|
|
51
|
+
*/
|
|
52
|
+
scopeOrder(scope) {
|
|
53
|
+
this.scope(scope);
|
|
54
|
+
return `${utf8Hex(scope.stateType)}!${utf8Hex(scope.agentKey)}`;
|
|
55
|
+
},
|
|
56
|
+
/**
|
|
57
|
+
* Encodes one original source identity within its Agent scope.
|
|
58
|
+
*
|
|
59
|
+
* @param key Agent instance and original Command or Event ID.
|
|
60
|
+
* @returns Complete immutable invocation identity.
|
|
61
|
+
*/
|
|
62
|
+
invocation(key) {
|
|
63
|
+
if (key.scope === undefined || key.sourceSignal === undefined)
|
|
64
|
+
throw new TypeError("Agent execution requires scope and original source ID.");
|
|
65
|
+
return JSON.stringify([this.scope(key.scope), this.signal(key.sourceSignal)]);
|
|
66
|
+
},
|
|
67
|
+
/**
|
|
68
|
+
* Encodes a typed source ID without optional MessageId Version metadata.
|
|
69
|
+
*
|
|
70
|
+
* @param signal Original Command or Event identity.
|
|
71
|
+
* @returns Complete typed source identity.
|
|
72
|
+
*/
|
|
73
|
+
signal(signal) {
|
|
74
|
+
const id = signal.id;
|
|
75
|
+
if (id.case === "command" && id.value.uuid)
|
|
76
|
+
return JSON.stringify(["command", id.value.uuid]);
|
|
77
|
+
if (id.case === "event" && id.value.value)
|
|
78
|
+
return JSON.stringify(["event", id.value.value]);
|
|
79
|
+
throw new TypeError("Agent execution requires an original Command or Event ID.");
|
|
80
|
+
},
|
|
81
|
+
/**
|
|
82
|
+
* Encodes full Timestamp, Inbox version and source ID for native binary order.
|
|
83
|
+
*
|
|
84
|
+
* @param order Existing Inbox acceptance order.
|
|
85
|
+
* @returns Prefix-safe order text.
|
|
86
|
+
*/
|
|
87
|
+
order(order) {
|
|
88
|
+
const at = order.receivedAt;
|
|
89
|
+
if (at === undefined ||
|
|
90
|
+
order.sourceSignal === undefined ||
|
|
91
|
+
order.inboxVersion < 0n ||
|
|
92
|
+
order.inboxVersion > 18446744073709551615n)
|
|
93
|
+
throw new TypeError("Agent execution requires complete Inbox order.");
|
|
94
|
+
if (at.seconds < -62135596800n ||
|
|
95
|
+
at.seconds > 253402300799n ||
|
|
96
|
+
at.nanos < 0 ||
|
|
97
|
+
at.nanos > 999_999_999)
|
|
98
|
+
throw new RangeError("Agent Inbox Timestamp is out of range.");
|
|
99
|
+
const seconds = (at.seconds + 62135596800n).toString().padStart(12, "0");
|
|
100
|
+
const nanos = at.nanos.toString().padStart(9, "0");
|
|
101
|
+
const version = order.inboxVersion.toString().padStart(20, "0");
|
|
102
|
+
const signal = order.sourceSignal.id;
|
|
103
|
+
const id = signal.case === "command"
|
|
104
|
+
? signal.value.uuid
|
|
105
|
+
: signal.case === "event"
|
|
106
|
+
? signal.value.value
|
|
107
|
+
: undefined;
|
|
108
|
+
if (!id)
|
|
109
|
+
throw new TypeError("Agent Inbox order requires an original source ID.");
|
|
110
|
+
const rank = signal.case === "command" ? "0" : "1";
|
|
111
|
+
return `${seconds}:${nanos}:${version}:${rank}${utf8Hex(id)}`;
|
|
112
|
+
},
|
|
113
|
+
/**
|
|
114
|
+
* Encodes full provider eligibility time and complete instance scope.
|
|
115
|
+
*
|
|
116
|
+
* @param eligibleAt Time when this head becomes eligible.
|
|
117
|
+
* @param scope Generated state type and Agent key.
|
|
118
|
+
* @returns Complete binary-collated eligibility and scope key.
|
|
119
|
+
*/
|
|
120
|
+
pendingKey(eligibleAt, scope) {
|
|
121
|
+
return `${timestampKey(eligibleAt)}!${this.scopeOrder(scope)}`;
|
|
122
|
+
},
|
|
123
|
+
/**
|
|
124
|
+
* Returns an exclusive upper bound before all scopes at the sampled time.
|
|
125
|
+
*
|
|
126
|
+
* @param asOf Fixed eligibility cutoff for the page.
|
|
127
|
+
* @returns Strict eligibility upper-bound key.
|
|
128
|
+
*/
|
|
129
|
+
pendingLower(asOf) {
|
|
130
|
+
return `${timestampKey(asOf)}!`;
|
|
131
|
+
},
|
|
132
|
+
/**
|
|
133
|
+
* Builds materialized invocation columns under one fixed-width provider digest.
|
|
134
|
+
*
|
|
135
|
+
* @param digest Physical identity digest of the full logical key.
|
|
136
|
+
* @returns Shared native record specification.
|
|
137
|
+
*/
|
|
138
|
+
invocationSpec(digest) {
|
|
139
|
+
return new RecordSpec({
|
|
140
|
+
sourceType: AgentExecutionRecordSchema,
|
|
141
|
+
recordType: AgentExecutionRecordSchema,
|
|
142
|
+
idKind: "string",
|
|
143
|
+
extractId: (record) => digest(this.invocation(requiredInvocation(record))),
|
|
144
|
+
columns: [
|
|
145
|
+
new RecordColumn("state_type", string, (record) => requiredInvocation(record).scope.stateType),
|
|
146
|
+
new RecordColumn("agent_key", string, (record) => requiredInvocation(record).scope.agentKey),
|
|
147
|
+
new RecordColumn("scope_digest", string, (record) => digest(this.scope(requiredInvocation(record).scope))),
|
|
148
|
+
new RecordColumn("status", string, (record) => String(record.status)),
|
|
149
|
+
new RecordColumn("order_key", string, (record) => this.order(requiredOrder(record))),
|
|
150
|
+
],
|
|
151
|
+
});
|
|
152
|
+
},
|
|
153
|
+
/**
|
|
154
|
+
* Builds materialized current-head columns under one provider digest.
|
|
155
|
+
*
|
|
156
|
+
* @param digest Physical identity digest of the full Agent scope.
|
|
157
|
+
* @returns Shared native head specification.
|
|
158
|
+
*/
|
|
159
|
+
headSpec(digest) {
|
|
160
|
+
return new RecordSpec({
|
|
161
|
+
sourceType: AgentExecutionHeadSchema,
|
|
162
|
+
recordType: AgentExecutionHeadSchema,
|
|
163
|
+
idKind: "string",
|
|
164
|
+
extractId: (record) => digest(this.scope(requiredScope(record))),
|
|
165
|
+
columns: [
|
|
166
|
+
new RecordColumn("state_type", string, (record) => requiredScope(record).stateType),
|
|
167
|
+
new RecordColumn("agent_key", string, (record) => requiredScope(record).agentKey),
|
|
168
|
+
new RecordColumn("scope_digest", string, (record) => digest(this.scope(requiredScope(record)))),
|
|
169
|
+
new RecordColumn("state_digest", string, (record) => digest(requiredScope(record).stateType)),
|
|
170
|
+
new RecordColumn("pending_key", string, (record) => headPendingKey(record, this)),
|
|
171
|
+
],
|
|
172
|
+
});
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
/**
|
|
176
|
+
* Reads the immutable accepted invocation identity from a record.
|
|
177
|
+
*/
|
|
178
|
+
function requiredInvocation(record) {
|
|
179
|
+
const key = record.accepted?.key;
|
|
180
|
+
if (key?.scope === undefined || key.sourceSignal === undefined)
|
|
181
|
+
throw new TypeError("Agent execution record requires its original invocation key.");
|
|
182
|
+
return key;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Reads the original Inbox order from a record.
|
|
186
|
+
*/
|
|
187
|
+
function requiredOrder(record) {
|
|
188
|
+
const order = record.accepted?.order;
|
|
189
|
+
if (order === undefined)
|
|
190
|
+
throw new TypeError("Agent execution record requires Inbox order.");
|
|
191
|
+
return order;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Reads the complete Agent instance scope from a head.
|
|
195
|
+
*/
|
|
196
|
+
function requiredScope(head) {
|
|
197
|
+
if (head.scope === undefined)
|
|
198
|
+
throw new TypeError("Agent execution head requires its scope.");
|
|
199
|
+
return head.scope;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Encodes an optional lease expiry for native index eligibility.
|
|
203
|
+
*/
|
|
204
|
+
function timestampKey(value) {
|
|
205
|
+
if (value.seconds < -62135596800n ||
|
|
206
|
+
value.seconds > 253402300799n ||
|
|
207
|
+
value.nanos < 0 ||
|
|
208
|
+
value.nanos > 999_999_999)
|
|
209
|
+
throw new RangeError("Agent execution Timestamp is out of range.");
|
|
210
|
+
return `${(value.seconds + 62135596800n).toString().padStart(12, "0")}:${value.nanos.toString().padStart(9, "0")}`;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Materializes the head candidate or a value beyond every valid Timestamp.
|
|
214
|
+
*/
|
|
215
|
+
function headPendingKey(head, layout) {
|
|
216
|
+
const present = [head.pending, head.pendingOrder, head.eligibleAt].filter((value) => value !== undefined).length;
|
|
217
|
+
if (present === 0)
|
|
218
|
+
return "~";
|
|
219
|
+
if (present !== 3 || head.eligibleAt === undefined)
|
|
220
|
+
throw new TypeError("Agent execution head has incomplete discovery metadata.");
|
|
221
|
+
return layout.pendingKey(head.eligibleAt, requiredScope(head));
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Encodes every UTF-8 byte without locale-dependent collation.
|
|
225
|
+
*/
|
|
226
|
+
function utf8Hex(value) {
|
|
227
|
+
const encoder = new globalThis.TextEncoder();
|
|
228
|
+
return [...encoder.encode(value)].map((byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=agent-execution-record-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-execution-record-spec.js","sourceRoot":"","sources":["../../src/entity/agent-execution-record-spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { AgentHistoryEntry } from "@spine-event-engine/proto/agent";
|
|
2
|
+
import { type AgentExecutionHead, type AgentExecutionRecord, type AgentExecutionScope } from "@spine-event-engine/proto/generated/spine/server/agent/execution_record_pb.js";
|
|
3
|
+
/**
|
|
4
|
+
* Calculates complete internal Protobuf row sizes before an external Agent call.
|
|
5
|
+
*/
|
|
6
|
+
export declare const AgentExecutionSizes: {
|
|
7
|
+
/**
|
|
8
|
+
* Calculates the retained execution journal and accepted source facts.
|
|
9
|
+
*
|
|
10
|
+
* @param record Complete execution record proposed for persistence.
|
|
11
|
+
* @returns Exact serialized execution-record bytes.
|
|
12
|
+
*/
|
|
13
|
+
record(record: AgentExecutionRecord): number;
|
|
14
|
+
/**
|
|
15
|
+
* Calculates per-instance claim, eligibility and preferences.
|
|
16
|
+
*
|
|
17
|
+
* @param head Complete head proposed for persistence.
|
|
18
|
+
* @returns Exact serialized head bytes.
|
|
19
|
+
*/
|
|
20
|
+
head(head: AgentExecutionHead): number;
|
|
21
|
+
/**
|
|
22
|
+
* Calculates a history entry inside its persisted scope envelope.
|
|
23
|
+
*
|
|
24
|
+
* @param scope Generated state type and canonical Agent key.
|
|
25
|
+
* @param entry Original conversation, System or domain entry.
|
|
26
|
+
* @returns Exact serialized internal history-record bytes.
|
|
27
|
+
*/
|
|
28
|
+
history(scope: AgentExecutionScope, entry: AgentHistoryEntry): number;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=agent-execution-sizes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-execution-sizes.d.ts","sourceRoot":"","sources":["../../src/entity/agent-execution-sizes.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACzB,MAAM,+EAA+E,CAAC;AAKvF;;GAEG;AACH,eAAO,MAAM,mBAAmB;IAC9B;;;;;OAKG;mBACY,oBAAoB,GAAG,MAAM;IAI5C;;;;;OAKG;eACQ,kBAAkB,GAAG,MAAM;IAItC;;;;;;OAMG;mBACY,mBAAmB,SAAS,iBAAiB,GAAG,MAAM;CAMtE,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026, CodeMatters. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
|
5
|
+
* in compliance with the License. You may obtain a copy of the License at
|
|
6
|
+
*
|
|
7
|
+
* https://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
*
|
|
9
|
+
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
|
10
|
+
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
|
11
|
+
* or implied. See the License for the specific language governing permissions and limitations under
|
|
12
|
+
* the License.
|
|
13
|
+
*/
|
|
14
|
+
import { toBinary } from "@bufbuild/protobuf";
|
|
15
|
+
import { AgentExecutionHeadSchema, AgentExecutionRecordSchema, } from "@spine-event-engine/proto/generated/spine/server/agent/execution_record_pb.js";
|
|
16
|
+
import { AgentHistoryRecordSchema } from "@spine-event-engine/proto/generated/spine/server/agent/history_record_pb.js";
|
|
17
|
+
import { AgentHistoryRecords } from "./agent-history-record-spec.js";
|
|
18
|
+
/**
|
|
19
|
+
* Calculates complete internal Protobuf row sizes before an external Agent call.
|
|
20
|
+
*/
|
|
21
|
+
export const AgentExecutionSizes = {
|
|
22
|
+
/**
|
|
23
|
+
* Calculates the retained execution journal and accepted source facts.
|
|
24
|
+
*
|
|
25
|
+
* @param record Complete execution record proposed for persistence.
|
|
26
|
+
* @returns Exact serialized execution-record bytes.
|
|
27
|
+
*/
|
|
28
|
+
record(record) {
|
|
29
|
+
return toBinary(AgentExecutionRecordSchema, record).length;
|
|
30
|
+
},
|
|
31
|
+
/**
|
|
32
|
+
* Calculates per-instance claim, eligibility and preferences.
|
|
33
|
+
*
|
|
34
|
+
* @param head Complete head proposed for persistence.
|
|
35
|
+
* @returns Exact serialized head bytes.
|
|
36
|
+
*/
|
|
37
|
+
head(head) {
|
|
38
|
+
return toBinary(AgentExecutionHeadSchema, head).length;
|
|
39
|
+
},
|
|
40
|
+
/**
|
|
41
|
+
* Calculates a history entry inside its persisted scope envelope.
|
|
42
|
+
*
|
|
43
|
+
* @param scope Generated state type and canonical Agent key.
|
|
44
|
+
* @param entry Original conversation, System or domain entry.
|
|
45
|
+
* @returns Exact serialized internal history-record bytes.
|
|
46
|
+
*/
|
|
47
|
+
history(scope, entry) {
|
|
48
|
+
return toBinary(AgentHistoryRecordSchema, AgentHistoryRecords.record(scope.stateType, scope.agentKey, entry)).length;
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=agent-execution-sizes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-execution-sizes.js","sourceRoot":"","sources":["../../src/entity/agent-execution-sizes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EACL,wBAAwB,EACxB,0BAA0B,GAI3B,MAAM,+EAA+E,CAAC;AACvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,6EAA6E,CAAC;AAEvH,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC;;;;;OAKG;IACH,MAAM,CAAC,MAA4B;QACjC,OAAO,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC;IAC7D,CAAC;IAED;;;;;OAKG;IACH,IAAI,CAAC,IAAwB;QAC3B,OAAO,QAAQ,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC;IACzD,CAAC;IAED;;;;;;OAMG;IACH,OAAO,CAAC,KAA0B,EAAE,KAAwB;QAC1D,OAAO,QAAQ,CACb,wBAAwB,EACxB,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CACnE,CAAC,MAAM,CAAC;IACX,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { type AgentExecutionRecord, type AgentOutgoingSignal, type AgentSavedDispatchTarget, type AgentSignalKey } from "@spine-event-engine/proto/generated/spine/server/agent/execution_record_pb.js";
|
|
2
|
+
/**
|
|
3
|
+
* Enforces immutable saved output envelopes and one-time route preparation.
|
|
4
|
+
*/
|
|
5
|
+
export declare const AgentExecutionTransitions: {
|
|
6
|
+
/**
|
|
7
|
+
* Rejects an initial completion that claims transport acceptance or a saved route.
|
|
8
|
+
*
|
|
9
|
+
* @param record Persisted Agent execution record.
|
|
10
|
+
*/
|
|
11
|
+
assertCompletion(record: AgentExecutionRecord): void;
|
|
12
|
+
/**
|
|
13
|
+
* Reads the complete typed ID of one original outgoing envelope.
|
|
14
|
+
*
|
|
15
|
+
* @param output Original Event or Command envelope.
|
|
16
|
+
* @returns Kind and nonempty source ID.
|
|
17
|
+
*/
|
|
18
|
+
originalId(output: AgentOutgoingSignal): string;
|
|
19
|
+
/**
|
|
20
|
+
* Accepts only absent-to-present saved-plan installation after completion.
|
|
21
|
+
*
|
|
22
|
+
* @param next Proposed next execution record.
|
|
23
|
+
* @param prior Previously persisted execution record.
|
|
24
|
+
*/
|
|
25
|
+
assertUpdate(prior: AgentExecutionRecord, next: AgentExecutionRecord): void;
|
|
26
|
+
/**
|
|
27
|
+
* Validates a persisted plan before acknowledging each selected original ID.
|
|
28
|
+
*
|
|
29
|
+
* @param record Persisted Agent execution record.
|
|
30
|
+
* @param signals Original outgoing signal identities.
|
|
31
|
+
*/
|
|
32
|
+
assertDelivery(record: AgentExecutionRecord, signals: readonly AgentSignalKey[]): void;
|
|
33
|
+
/**
|
|
34
|
+
* Checks complete binding identities and typed repository recipients.
|
|
35
|
+
*
|
|
36
|
+
* @param output Saved outgoing signal.
|
|
37
|
+
*/
|
|
38
|
+
validatePlan(output: AgentOutgoingSignal): void;
|
|
39
|
+
/**
|
|
40
|
+
* Rejects a target that cannot be rebound to the original output kind.
|
|
41
|
+
*
|
|
42
|
+
* @param output Saved outgoing signal.
|
|
43
|
+
* @param target Prepared delivery target.
|
|
44
|
+
*/
|
|
45
|
+
validateTarget(output: AgentOutgoingSignal, target: AgentSavedDispatchTarget): void;
|
|
46
|
+
/**
|
|
47
|
+
* Compares complete original plan bytes after installation.
|
|
48
|
+
*
|
|
49
|
+
* @param left First value in the comparison.
|
|
50
|
+
* @param right Second value in the comparison.
|
|
51
|
+
* @returns Whether both saved dispatch plans have identical bytes.
|
|
52
|
+
*/
|
|
53
|
+
samePlan(left: AgentOutgoingSignal, right: AgentOutgoingSignal): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Compares every execution field after masking the newly installed plans.
|
|
56
|
+
*
|
|
57
|
+
* @param left First value in the comparison.
|
|
58
|
+
* @param right Second value in the comparison.
|
|
59
|
+
* @returns Whether both execution records have identical bytes.
|
|
60
|
+
*/
|
|
61
|
+
sameRecord(left: AgentExecutionRecord, right: AgentExecutionRecord): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Matches a selected typed original Event or Command ID.
|
|
64
|
+
*
|
|
65
|
+
* @param output Saved outgoing signal.
|
|
66
|
+
* @param signal Original signal identity.
|
|
67
|
+
* @returns Whether the saved output has the original signal identity.
|
|
68
|
+
*/
|
|
69
|
+
matches(output: AgentOutgoingSignal, signal: AgentSignalKey): boolean;
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=agent-execution-transitions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-execution-transitions.d.ts","sourceRoot":"","sources":["../../src/entity/agent-execution-transitions.ts"],"names":[],"mappings":"AAeA,OAAO,EAKL,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACpB,MAAM,+EAA+E,CAAC;AAEvF;;GAEG;AACH,eAAO,MAAM,yBAAyB;IACpC;;;;OAIG;6BACsB,oBAAoB,GAAG,IAAI;IAYpD;;;;;OAKG;uBACgB,mBAAmB,GAAG,MAAM;IAc/C;;;;;OAKG;wBACiB,oBAAoB,QAAQ,oBAAoB,GAAG,IAAI;IA6B3E;;;;;OAKG;2BACoB,oBAAoB,WAAW,SAAS,cAAc,EAAE,GAAG,IAAI;IAQtF;;;;OAIG;yBACkB,mBAAmB,GAAG,IAAI;IAK/C;;;;;OAKG;2BACoB,mBAAmB,UAAU,wBAAwB,GAAG,IAAI;IA2BnF;;;;;;OAMG;mBACY,mBAAmB,SAAS,mBAAmB,GAAG,OAAO;IAOxE;;;;;;OAMG;qBACc,oBAAoB,SAAS,oBAAoB,GAAG,OAAO;IAM5E;;;;;;OAMG;oBACa,mBAAmB,UAAU,cAAc,GAAG,OAAO;CAUtE,CAAC"}
|