@decionis/agent-safe-pipeline 0.1.3 → 0.2.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.
Files changed (104) hide show
  1. package/README.md +477 -16
  2. package/dist/Index.d.ts +9 -0
  3. package/dist/Index.d.ts.map +1 -1
  4. package/dist/Index.js +8 -0
  5. package/dist/Index.js.map +1 -1
  6. package/dist/approval/PresenceApprovalCoordinator.d.ts +25 -0
  7. package/dist/approval/PresenceApprovalCoordinator.d.ts.map +1 -1
  8. package/dist/approval/PresenceApprovalCoordinator.js +54 -6
  9. package/dist/approval/PresenceApprovalCoordinator.js.map +1 -1
  10. package/dist/audit/AuditRecorder.d.ts +122 -0
  11. package/dist/audit/AuditRecorder.d.ts.map +1 -0
  12. package/dist/audit/AuditRecorder.js +312 -0
  13. package/dist/audit/AuditRecorder.js.map +1 -0
  14. package/dist/decision/CreateGate.d.ts +123 -0
  15. package/dist/decision/CreateGate.d.ts.map +1 -0
  16. package/dist/decision/CreateGate.js +211 -0
  17. package/dist/decision/CreateGate.js.map +1 -0
  18. package/dist/decision/DecionisGate.d.ts +109 -3
  19. package/dist/decision/DecionisGate.d.ts.map +1 -1
  20. package/dist/decision/DecionisGate.js +823 -46
  21. package/dist/decision/DecionisGate.js.map +1 -1
  22. package/dist/decision/DecisionAuthority.d.ts +76 -1
  23. package/dist/decision/DecisionAuthority.d.ts.map +1 -1
  24. package/dist/decision/DecisionAuthority.js.map +1 -1
  25. package/dist/decision/FixtureDecisionAuthority.d.ts +27 -1
  26. package/dist/decision/FixtureDecisionAuthority.d.ts.map +1 -1
  27. package/dist/decision/FixtureDecisionAuthority.js +47 -0
  28. package/dist/decision/FixtureDecisionAuthority.js.map +1 -1
  29. package/dist/decision/ImmutableGateDecision.d.ts.map +1 -1
  30. package/dist/decision/ImmutableGateDecision.js +26 -0
  31. package/dist/decision/ImmutableGateDecision.js.map +1 -1
  32. package/dist/decision/Provision.d.ts +33 -0
  33. package/dist/decision/Provision.d.ts.map +1 -0
  34. package/dist/decision/Provision.js +116 -0
  35. package/dist/decision/Provision.js.map +1 -0
  36. package/dist/decision/ShadowGate.d.ts +31 -0
  37. package/dist/decision/ShadowGate.d.ts.map +1 -0
  38. package/dist/decision/ShadowGate.js +79 -0
  39. package/dist/decision/ShadowGate.js.map +1 -0
  40. package/dist/execution/ActionRegistry.d.ts +66 -0
  41. package/dist/execution/ActionRegistry.d.ts.map +1 -1
  42. package/dist/execution/ActionRegistry.js +110 -1
  43. package/dist/execution/ActionRegistry.js.map +1 -1
  44. package/dist/execution/AuthorizationVerifier.d.ts +149 -1
  45. package/dist/execution/AuthorizationVerifier.d.ts.map +1 -1
  46. package/dist/execution/AuthorizationVerifier.js +302 -27
  47. package/dist/execution/AuthorizationVerifier.js.map +1 -1
  48. package/dist/execution/SafeExecutor.d.ts +102 -7
  49. package/dist/execution/SafeExecutor.d.ts.map +1 -1
  50. package/dist/execution/SafeExecutor.js +288 -17
  51. package/dist/execution/SafeExecutor.js.map +1 -1
  52. package/dist/http/ClientIdentification.d.ts +22 -0
  53. package/dist/http/ClientIdentification.d.ts.map +1 -0
  54. package/dist/http/ClientIdentification.js +44 -0
  55. package/dist/http/ClientIdentification.js.map +1 -0
  56. package/dist/http/Credential.d.ts +17 -0
  57. package/dist/http/Credential.d.ts.map +1 -0
  58. package/dist/http/Credential.js +5 -0
  59. package/dist/http/Credential.js.map +1 -0
  60. package/dist/http/StoredCredentials.d.ts +34 -0
  61. package/dist/http/StoredCredentials.d.ts.map +1 -0
  62. package/dist/http/StoredCredentials.js +85 -0
  63. package/dist/http/StoredCredentials.js.map +1 -0
  64. package/dist/intent/CanonicalIntentHasher.d.ts +1 -1
  65. package/dist/intent/CanonicalIntentHasher.d.ts.map +1 -1
  66. package/dist/intent/CanonicalIntentHasher.js +9 -2
  67. package/dist/intent/CanonicalIntentHasher.js.map +1 -1
  68. package/dist/intent/ExecutionIntent.d.ts +26 -2
  69. package/dist/intent/ExecutionIntent.d.ts.map +1 -1
  70. package/dist/intent/ExecutionIntent.js +11 -0
  71. package/dist/intent/ExecutionIntent.js.map +1 -1
  72. package/dist/intent/IntentCapture.d.ts +5 -0
  73. package/dist/intent/IntentCapture.d.ts.map +1 -1
  74. package/dist/intent/IntentCapture.js +15 -1
  75. package/dist/intent/IntentCapture.js.map +1 -1
  76. package/dist/report/DecisionReport.d.ts +22 -0
  77. package/dist/report/DecisionReport.d.ts.map +1 -0
  78. package/dist/report/DecisionReport.js +37 -0
  79. package/dist/report/DecisionReport.js.map +1 -0
  80. package/dist/report/DossierReport.d.ts +43 -0
  81. package/dist/report/DossierReport.d.ts.map +1 -0
  82. package/dist/report/DossierReport.js +130 -0
  83. package/dist/report/DossierReport.js.map +1 -0
  84. package/dist/report/HostedOutcome.d.ts +18 -0
  85. package/dist/report/HostedOutcome.d.ts.map +1 -0
  86. package/dist/report/HostedOutcome.js +24 -0
  87. package/dist/report/HostedOutcome.js.map +1 -0
  88. package/dist/shadow/ShadowPipeline.d.ts +75 -5
  89. package/dist/shadow/ShadowPipeline.d.ts.map +1 -1
  90. package/dist/shadow/ShadowPipeline.js +157 -7
  91. package/dist/shadow/ShadowPipeline.js.map +1 -1
  92. package/dist/testing/Index.d.ts +12 -0
  93. package/dist/testing/Index.d.ts.map +1 -0
  94. package/dist/testing/Index.js +12 -0
  95. package/dist/testing/Index.js.map +1 -0
  96. package/dist/testing/LocalAuthority.d.ts +292 -0
  97. package/dist/testing/LocalAuthority.d.ts.map +1 -0
  98. package/dist/testing/LocalAuthority.js +1124 -0
  99. package/dist/testing/LocalAuthority.js.map +1 -0
  100. package/dist/testing/LocalPresence.d.ts +210 -0
  101. package/dist/testing/LocalPresence.d.ts.map +1 -0
  102. package/dist/testing/LocalPresence.js +473 -0
  103. package/dist/testing/LocalPresence.js.map +1 -0
  104. package/package.json +40 -4
@@ -0,0 +1,211 @@
1
+ import { DecionisGrantVerifier, } from "../execution/AuthorizationVerifier.js";
2
+ import { credentialsPath, readStoredCredentials, writeStoredCredentials, } from "../http/StoredCredentials.js";
3
+ import { DecionisGate } from "./DecionisGate.js";
4
+ import { fetchSignedDossier } from "../report/DossierReport.js";
5
+ import { provisionWorkspace, } from "./Provision.js";
6
+ import { ShadowGate } from "./ShadowGate.js";
7
+ const DEFAULT_API_URL = "https://api.decionis.com";
8
+ const TIMEOUT_PATTERN = /^\d{1,6}$/;
9
+ /**
10
+ * Selects the gate from the environment.
11
+ *
12
+ * `DECIONIS_API_KEY` unset: returns `local` itself, the same authority and
13
+ * verifier objects, with no client constructed and no network call. A caller
14
+ * that sets nothing gets exactly what it gets today.
15
+ *
16
+ * `DECIONIS_API_KEY` set: `DecionisGate` runs beside `local` through
17
+ * `ShadowGate`, in `DECIONIS_MODE` (`SHADOW` by default, `ENFORCEMENT` on
18
+ * request). `DECIONIS_TENANT_ID` is then required, because Decionis binds
19
+ * every intent to the key's own organization and refuses any other tenant.
20
+ * `DECIONIS_API_URL`, `DECIONIS_TIMEOUT_MS` and `DECIONIS_ALLOW_INSECURE_LOOPBACK`
21
+ * configure the connection the way the trusted executor's do.
22
+ */
23
+ export function createGate(options) {
24
+ const env = options.env ?? process.env;
25
+ const apiKey = env["DECIONIS_API_KEY"]?.trim();
26
+ if (apiKey === undefined || apiKey === "") {
27
+ return { ...options.local, mode: "LOCAL", tenantId: options.tenantId };
28
+ }
29
+ const mode = evaluationMode(env["DECIONIS_MODE"]);
30
+ const tenantId = env["DECIONIS_TENANT_ID"]?.trim();
31
+ if (tenantId === undefined || tenantId === "") {
32
+ throw new Error("DECIONIS_TENANT_ID_MISSING");
33
+ }
34
+ const timeoutMs = timeout(env["DECIONIS_TIMEOUT_MS"]);
35
+ const connection = {
36
+ baseUrl: env["DECIONIS_API_URL"]?.trim() || DEFAULT_API_URL,
37
+ apiKey,
38
+ allowInsecureLoopback: env["DECIONIS_ALLOW_INSECURE_LOOPBACK"]?.trim() === "true",
39
+ ...(timeoutMs === undefined ? {} : { timeoutMs }),
40
+ ...(options.fetch === undefined ? {} : { fetch: options.fetch }),
41
+ };
42
+ const hosted = new DecionisGate({
43
+ ...connection,
44
+ mode,
45
+ ...(options.source === undefined ? {} : { source: options.source }),
46
+ });
47
+ return {
48
+ mode,
49
+ tenantId,
50
+ authority: new ShadowGate(options.local.authority, hosted, mode),
51
+ // Only an ENFORCEMENT decision carries a grant Decionis will let a
52
+ // verifier claim; a SHADOW decision keeps the local verifier and grant.
53
+ verifier: mode === "ENFORCEMENT" ? new DecionisGrantVerifier(connection) : options.local.verifier,
54
+ };
55
+ }
56
+ function evaluationMode(raw) {
57
+ const value = raw?.trim().toUpperCase();
58
+ if (value === undefined || value === "" || value === "SHADOW")
59
+ return "SHADOW";
60
+ if (value === "ENFORCE" || value === "ENFORCEMENT")
61
+ return "ENFORCEMENT";
62
+ throw new Error("DECIONIS_MODE_INVALID");
63
+ }
64
+ function timeout(raw) {
65
+ const value = raw?.trim();
66
+ if (value === undefined || value === "")
67
+ return undefined;
68
+ if (!TIMEOUT_PATTERN.test(value))
69
+ throw new Error("DECIONIS_TIMEOUT_MS_INVALID");
70
+ return Number(value);
71
+ }
72
+ const HOSTED_VALUES = new Set(["1", "true", "yes", "on"]);
73
+ /** Whether `DECIONIS_HOSTED` asks for the hosted gate. */
74
+ export function hostedRequested(env) {
75
+ const value = env["DECIONIS_HOSTED"]?.trim().toLowerCase();
76
+ return value !== undefined && HOSTED_VALUES.has(value);
77
+ }
78
+ /**
79
+ * Where a hosted run's key comes from, in order: the environment, the
80
+ * credential this user keeps for this authority, and when there is none and
81
+ * `DECIONIS_HOSTED` asks, a free provisional workspace minted now, kept for
82
+ * the next run and named on standard error once. Null when nothing asks for
83
+ * the hosted path at all.
84
+ */
85
+ export async function resolveHostedCredentials(options = {}) {
86
+ const env = options.env ?? process.env;
87
+ const endpoint = env["DECIONIS_API_URL"]?.trim() || DEFAULT_API_URL;
88
+ const keyInEnvironment = env["DECIONIS_API_KEY"]?.trim() ?? "";
89
+ if (keyInEnvironment !== "") {
90
+ const tenantId = env["DECIONIS_TENANT_ID"]?.trim();
91
+ if (tenantId === undefined || tenantId === "")
92
+ throw new Error("DECIONIS_TENANT_ID_MISSING");
93
+ return {
94
+ credentials: {
95
+ source: "environment",
96
+ tenantId,
97
+ endpoint,
98
+ path: null,
99
+ provisional: false,
100
+ claim: null,
101
+ },
102
+ apiKey: keyInEnvironment,
103
+ env,
104
+ };
105
+ }
106
+ if (!hostedRequested(env))
107
+ return null;
108
+ if (env["NODE_ENV"] === "production")
109
+ throw new Error("DECIONIS_HOSTED_REFUSED_IN_PRODUCTION");
110
+ const storeOptions = options.store === false
111
+ ? null
112
+ : {
113
+ env,
114
+ ...(options.store?.home === undefined ? {} : { home: options.store.home }),
115
+ ...(options.store?.files === undefined ? {} : { files: options.store.files }),
116
+ };
117
+ const stored = storeOptions === null ? null : readStoredCredentials(storeOptions);
118
+ if (stored !== null &&
119
+ stored.tenantId !== null &&
120
+ (stored.endpoint ?? DEFAULT_API_URL) === endpoint) {
121
+ return {
122
+ credentials: {
123
+ source: "stored",
124
+ tenantId: stored.tenantId,
125
+ endpoint,
126
+ path: storeOptions === null ? null : credentialsPath(storeOptions),
127
+ provisional: stored.provisional === true,
128
+ claim: null,
129
+ },
130
+ apiKey: stored.apiKey,
131
+ env: { ...env, DECIONIS_API_KEY: stored.apiKey, DECIONIS_TENANT_ID: stored.tenantId },
132
+ };
133
+ }
134
+ const workspace = await (options.provision ?? provisionWorkspace)({
135
+ baseUrl: endpoint,
136
+ allowInsecureLoopback: env["DECIONIS_ALLOW_INSECURE_LOOPBACK"]?.trim() === "true",
137
+ ...(options.fetch === undefined ? {} : { fetch: options.fetch }),
138
+ ...(options.source === undefined ? {} : { source: options.source }),
139
+ ...(options.source?.example === undefined
140
+ ? {}
141
+ : { agentName: `agent-safe-pipeline ${options.source.example}` }),
142
+ });
143
+ const path = storeOptions === null
144
+ ? null
145
+ : writeStoredCredentials(storeOptions, {
146
+ apiKey: workspace.rawKey,
147
+ tenantId: workspace.orgId,
148
+ endpoint,
149
+ provisional: true,
150
+ });
151
+ const notice = options.notice ??
152
+ ((line) => {
153
+ process.stderr.write(`${line}\n`);
154
+ });
155
+ const decisions = workspace.limits["governed_decisions_per_month"];
156
+ notice(`decionis: provisioned a free workspace ${workspace.orgId} (provisional, no account${typeof decisions === "number" ? `; ${String(decisions)} governed decisions a month` : ""})`);
157
+ notice(path === null
158
+ ? "decionis: the key was not stored; the next run mints another workspace"
159
+ : `decionis: key stored at ${path}; the next run reuses this workspace`);
160
+ const note = workspace.claim["note"];
161
+ if (typeof note === "string" && note.length <= 500)
162
+ notice(`decionis: ${note}`);
163
+ return {
164
+ credentials: {
165
+ source: "provisioned",
166
+ tenantId: workspace.orgId,
167
+ endpoint,
168
+ path,
169
+ provisional: true,
170
+ claim: workspace.claim,
171
+ },
172
+ apiKey: workspace.rawKey,
173
+ env: { ...env, DECIONIS_API_KEY: workspace.rawKey, DECIONIS_TENANT_ID: workspace.orgId },
174
+ };
175
+ }
176
+ /**
177
+ * The gate `createGate` selects, with one more way onto Decionis: a single
178
+ * variable. `DECIONIS_HOSTED=1` with no key means the key this user already
179
+ * keeps for this authority, and when there is none, a free provisional
180
+ * workspace minted now, kept for the next run, and named on standard error
181
+ * once. A key in the environment still wins, and no variable at all is
182
+ * still the local pair. A provisional key evaluates in `SHADOW` only:
183
+ * recorded beside the local verdict, with a signed dossier, never governing
184
+ * execution; an owned key set in the environment takes the mode asked for.
185
+ */
186
+ export async function createHostedGate(options) {
187
+ const env = options.env ?? process.env;
188
+ const resolved = await resolveHostedCredentials(options);
189
+ if (resolved === null) {
190
+ return { ...createGate(options), credentials: null, fetchDossier: null };
191
+ }
192
+ const { credentials, apiKey } = resolved;
193
+ const gate = createGate({
194
+ ...options,
195
+ env: credentials.provisional ? { ...resolved.env, DECIONIS_MODE: "SHADOW" } : resolved.env,
196
+ });
197
+ return {
198
+ ...gate,
199
+ credentials,
200
+ fetchDossier: (dossierId) => fetchSignedDossier({
201
+ baseUrl: credentials.endpoint,
202
+ apiKey,
203
+ tenantId: credentials.tenantId,
204
+ dossierId,
205
+ allowInsecureLoopback: env["DECIONIS_ALLOW_INSECURE_LOOPBACK"]?.trim() === "true",
206
+ ...(options.fetch === undefined ? {} : { fetch: options.fetch }),
207
+ ...(options.source === undefined ? {} : { source: options.source }),
208
+ }),
209
+ };
210
+ }
211
+ //# sourceMappingURL=CreateGate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateGate.js","sourceRoot":"","sources":["../../src/decision/CreateGate.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,124 @@
1
+ import { type Credential } from "../http/Credential.js";
2
+ import { type ClientSource } from "../http/ClientIdentification.js";
1
3
  import type { CapturedIntent } from "../intent/ExecutionIntent.js";
2
- import { type DecisionAuthority, type DecisionEvidence, type GateDecision } from "./DecisionAuthority.js";
4
+ import { type DecisionAuthority, type DecisionEvaluationMode, type DecisionEvaluationOptions, type DecisionEvidence, type GateDecision, type ManagedEscalationState } from "./DecisionAuthority.js";
5
+ export type ManagedEscalationPendingStatus = "PENDING_PRESENCE" | "PRESENCE_REQUESTED" | "AWAITING_APPROVER" | "PRESENCE_VERIFIED" | "REAUTHORIZING";
6
+ export type ManagedEscalationBlockedStatus = "EXPIRED" | "REJECTED" | "BLOCKED" | "CANCELLED";
7
+ interface ManagedEscalationStatusBase {
8
+ readonly escalationId: string;
9
+ readonly intentId: string;
10
+ readonly actionHash: string;
11
+ readonly expiresAt: string;
12
+ readonly reasonCodes: readonly string[];
13
+ }
14
+ /** Strict, secret-free view of one Decionis-managed Presence escalation. */
15
+ export type ManagedEscalationStatusResult = ManagedEscalationStatusBase & ({
16
+ readonly status: ManagedEscalationPendingStatus;
17
+ readonly outcome: "ESCALATE_PENDING";
18
+ readonly decision: null;
19
+ } | {
20
+ readonly status: "GRANT_READY";
21
+ readonly outcome: "ALLOW";
22
+ readonly decision: GateDecision;
23
+ } | {
24
+ readonly status: ManagedEscalationBlockedStatus;
25
+ readonly outcome: "BLOCK";
26
+ readonly decision: null;
27
+ } | {
28
+ readonly status: "FAILED";
29
+ readonly outcome: "ERROR";
30
+ readonly decision: null;
31
+ });
32
+ export interface ManagedEscalationStatusOptions {
33
+ readonly signal?: AbortSignal;
34
+ /** Injectable epoch-millisecond clock for deterministic tests. */
35
+ readonly clock?: () => number;
36
+ }
37
+ export interface ManagedAuthorizationWaitOptions extends ManagedEscalationStatusOptions {
38
+ readonly maxAttempts?: number;
39
+ readonly initialDelayMs?: number;
40
+ readonly maxDelayMs?: number;
41
+ readonly sleep?: (delayMs: number, signal?: AbortSignal) => Promise<void>;
42
+ /** Injectable [0, 1] jitter source for deterministic tests. */
43
+ readonly random?: () => number;
44
+ }
3
45
  export interface DecionisGateOptions {
4
46
  readonly baseUrl: string;
5
- readonly apiKey: string;
47
+ /**
48
+ * The server-side Decionis credential, as a value or as a function read at
49
+ * the moment of use. A deployment whose credential rotates gives the
50
+ * function: the next request carries the new value, and a request already
51
+ * in flight keeps the one it started with, without anyone rebuilding this
52
+ * client and the executor around it.
53
+ */
54
+ readonly apiKey: Credential;
6
55
  readonly timeoutMs?: number;
7
56
  readonly fetch?: typeof fetch;
8
57
  readonly allowInsecureLoopback?: boolean;
58
+ /**
59
+ * `ENFORCEMENT` (default) asks Decionis for an executable decision.
60
+ * `SHADOW` asks Decionis to evaluate and record the exact intent without
61
+ * issuing a grant; the gate then never returns an authorization, even if a
62
+ * response carries one.
63
+ */
64
+ readonly mode?: DecisionEvaluationMode;
65
+ /**
66
+ * Where this integration came from, carried in the `User-Agent` of every
67
+ * call beside the package name and version. It is client identification
68
+ * for the authority's own accounting: not decision input, not part of the
69
+ * intent or its hash, and not part of the record the authority leaves.
70
+ */
71
+ readonly source?: ClientSource;
9
72
  }
10
73
  export declare class DecionisGate implements DecisionAuthority {
74
+ readonly evaluationMode: DecisionEvaluationMode;
11
75
  private readonly baseUrl;
12
76
  private readonly apiKey;
13
77
  private readonly timeoutMs;
14
78
  private readonly fetchImpl;
79
+ private readonly userAgent;
80
+ private readonly pendingAuthorizationWaits;
15
81
  constructor(options: DecionisGateOptions);
16
- evaluate(captured: CapturedIntent, evidence?: DecisionEvidence): Promise<GateDecision>;
82
+ evaluate(captured: CapturedIntent, evidence?: DecisionEvidence, options?: DecisionEvaluationOptions): Promise<GateDecision>;
83
+ /** Performs one authenticated, read-only status lookup against Decionis. */
84
+ getManagedEscalationStatus(captured: CapturedIntent, escalation: ManagedEscalationState, options?: ManagedEscalationStatusOptions): Promise<ManagedEscalationStatusResult>;
85
+ /**
86
+ * Waits only on Decionis. Presence credentials, invitation locators, and
87
+ * receipt evidence never cross this client boundary in managed mode.
88
+ */
89
+ waitForAuthorization(captured: CapturedIntent, pendingDecision: GateDecision, options?: ManagedAuthorizationWaitOptions): Promise<GateDecision>;
90
+ private waitForAuthorizationInternal;
91
+ private decisionFromResponse;
92
+ private initialManagedState;
93
+ private statusResult;
94
+ private expectedStateFailure;
95
+ private statusBindingFailure;
96
+ private managedDeadline;
97
+ private waitBoundaryFailure;
98
+ private terminalWaitDecision;
99
+ private expiredWaitDecision;
100
+ private failedWaitDecision;
101
+ private failedManagedStatus;
102
+ private expiredManagedStatus;
103
+ private failedStatusFromBase;
104
+ private validEscalationRequest;
105
+ private static managedStateFromWire;
106
+ private static managedStateFromStatus;
107
+ private static managedStateFromStatusResult;
108
+ private static isPendingStatus;
109
+ private static validManagedStateSemantics;
110
+ private static waitConfiguration;
111
+ private static backoffDelay;
112
+ private static boundedSleep;
113
+ private static sleep;
114
+ private static clockNow;
115
+ private static signalAborted;
116
+ private static isBoundedIdentifier;
117
+ /**
118
+ * The contract returns an `ERROR` decision body on 409 and 503 so the
119
+ * refusal is evidence-bearing. Anything else fails closed generically.
120
+ */
121
+ private static failedResponse;
17
122
  }
123
+ export {};
18
124
  //# sourceMappingURL=DecionisGate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DecionisGate.d.ts","sourceRoot":"","sources":["../../src/decision/DecionisGate.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAClB,MAAM,wBAAwB,CAAC;AA4BhC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAC9B,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAC1C;AAED,qBAAa,YAAa,YAAW,iBAAiB;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAEtB,OAAO,EAAE,mBAAmB;IAUlC,QAAQ,CACnB,QAAQ,EAAE,cAAc,EACxB,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,OAAO,CAAC,YAAY,CAAC;CAmEzB"}
1
+ {"version":3,"file":"DecionisGate.d.ts","sourceRoot":"","sources":["../../src/decision/DecionisGate.ts"],"names":[],"mappings":"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"}