@agent-relay/factory 0.1.56 → 0.1.58
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 +148 -2
- package/dist/cli/fleet.d.ts +13 -0
- package/dist/cli/fleet.d.ts.map +1 -1
- package/dist/cli/fleet.js +431 -103
- package/dist/cli/fleet.js.map +1 -1
- package/dist/config/schema.d.ts +1107 -348
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +67 -6
- package/dist/config/schema.js.map +1 -1
- package/dist/cost/index.d.ts +3 -0
- package/dist/cost/index.d.ts.map +1 -0
- package/dist/cost/index.js +3 -0
- package/dist/cost/index.js.map +1 -0
- package/dist/cost/ledger.d.ts +69 -0
- package/dist/cost/ledger.d.ts.map +1 -0
- package/dist/cost/ledger.js +162 -0
- package/dist/cost/ledger.js.map +1 -0
- package/dist/cost/pricing.d.ts +18 -0
- package/dist/cost/pricing.d.ts.map +1 -0
- package/dist/cost/pricing.js +54 -0
- package/dist/cost/pricing.js.map +1 -0
- package/dist/feature-guardian/conversation.d.ts +251 -0
- package/dist/feature-guardian/conversation.d.ts.map +1 -0
- package/dist/feature-guardian/conversation.js +1893 -0
- package/dist/feature-guardian/conversation.js.map +1 -0
- package/dist/feature-guardian/index.d.ts +2 -0
- package/dist/feature-guardian/index.d.ts.map +1 -0
- package/dist/feature-guardian/index.js +2 -0
- package/dist/feature-guardian/index.js.map +1 -0
- package/dist/fleet/internal-fleet-client.d.ts +3 -1
- package/dist/fleet/internal-fleet-client.d.ts.map +1 -1
- package/dist/fleet/internal-fleet-client.js +81 -0
- package/dist/fleet/internal-fleet-client.js.map +1 -1
- package/dist/fleet/relay-fleet-client.d.ts +3 -1
- package/dist/fleet/relay-fleet-client.d.ts.map +1 -1
- package/dist/fleet/relay-fleet-client.js +48 -0
- package/dist/fleet/relay-fleet-client.js.map +1 -1
- package/dist/github/index.d.ts +2 -0
- package/dist/github/index.d.ts.map +1 -1
- package/dist/github/index.js +1 -0
- package/dist/github/index.js.map +1 -1
- package/dist/github/routed-pr-babysitter.d.ts +48 -0
- package/dist/github/routed-pr-babysitter.d.ts.map +1 -0
- package/dist/github/routed-pr-babysitter.js +197 -0
- package/dist/github/routed-pr-babysitter.js.map +1 -0
- package/dist/hosted/index.d.ts +1 -1
- package/dist/hosted/index.d.ts.map +1 -1
- package/dist/hosted/index.js +1 -1
- package/dist/hosted/index.js.map +1 -1
- package/dist/hosted/orchestrator.d.ts +1 -0
- package/dist/hosted/orchestrator.d.ts.map +1 -1
- package/dist/hosted/orchestrator.js +190 -1
- package/dist/hosted/orchestrator.js.map +1 -1
- package/dist/hosted/types.d.ts +4 -0
- package/dist/hosted/types.d.ts.map +1 -1
- package/dist/index.d.ts +8 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/intake/index.d.ts +4 -0
- package/dist/intake/index.d.ts.map +1 -0
- package/dist/intake/index.js +4 -0
- package/dist/intake/index.js.map +1 -0
- package/dist/intake/notion-relay-claim.d.ts +32 -0
- package/dist/intake/notion-relay-claim.d.ts.map +1 -0
- package/dist/intake/notion-relay-claim.js +173 -0
- package/dist/intake/notion-relay-claim.js.map +1 -0
- package/dist/intake/notion-relay-contract.d.ts +33 -0
- package/dist/intake/notion-relay-contract.d.ts.map +1 -0
- package/dist/intake/notion-relay-contract.js +163 -0
- package/dist/intake/notion-relay-contract.js.map +1 -0
- package/dist/intake/notion.d.ts +375 -0
- package/dist/intake/notion.d.ts.map +1 -0
- package/dist/intake/notion.js +773 -0
- package/dist/intake/notion.js.map +1 -0
- package/dist/mount/github-api-issue-read.d.ts +28 -0
- package/dist/mount/github-api-issue-read.d.ts.map +1 -0
- package/dist/mount/github-api-issue-read.js +163 -0
- package/dist/mount/github-api-issue-read.js.map +1 -0
- package/dist/mount/local-mount-preflight.d.ts +2 -0
- package/dist/mount/local-mount-preflight.d.ts.map +1 -1
- package/dist/mount/local-mount-preflight.js +59 -9
- package/dist/mount/local-mount-preflight.js.map +1 -1
- package/dist/mount/mount-auth-error.d.ts +41 -0
- package/dist/mount/mount-auth-error.d.ts.map +1 -0
- package/dist/mount/mount-auth-error.js +94 -0
- package/dist/mount/mount-auth-error.js.map +1 -0
- package/dist/mount/relayfile-binary.d.ts +5 -0
- package/dist/mount/relayfile-binary.d.ts.map +1 -1
- package/dist/mount/relayfile-binary.js +16 -2
- package/dist/mount/relayfile-binary.js.map +1 -1
- package/dist/mount/relayfile-cloud-mount-client.d.ts +18 -3
- package/dist/mount/relayfile-cloud-mount-client.d.ts.map +1 -1
- package/dist/mount/relayfile-cloud-mount-client.js +157 -13
- package/dist/mount/relayfile-cloud-mount-client.js.map +1 -1
- package/dist/mount/workspace-mirror.d.ts +13 -0
- package/dist/mount/workspace-mirror.d.ts.map +1 -0
- package/dist/mount/workspace-mirror.js +94 -0
- package/dist/mount/workspace-mirror.js.map +1 -0
- package/dist/observability/events.d.ts +715 -47
- package/dist/observability/events.d.ts.map +1 -1
- package/dist/observability/events.js +41 -0
- package/dist/observability/events.js.map +1 -1
- package/dist/orchestrator/factory.d.ts +51 -0
- package/dist/orchestrator/factory.d.ts.map +1 -1
- package/dist/orchestrator/factory.js +574 -50
- package/dist/orchestrator/factory.js.map +1 -1
- package/dist/ports/fleet.d.ts +11 -0
- package/dist/ports/fleet.d.ts.map +1 -1
- package/dist/ports/index.d.ts +2 -2
- package/dist/ports/index.d.ts.map +1 -1
- package/dist/ports/mount.d.ts +58 -1
- package/dist/ports/mount.d.ts.map +1 -1
- package/dist/ports/state.d.ts +42 -5
- package/dist/ports/state.d.ts.map +1 -1
- package/dist/state/file-state-store.d.ts +10 -1
- package/dist/state/file-state-store.d.ts.map +1 -1
- package/dist/state/file-state-store.js +91 -0
- package/dist/state/file-state-store.js.map +1 -1
- package/dist/state/in-memory-state-store.d.ts +10 -1
- package/dist/state/in-memory-state-store.d.ts.map +1 -1
- package/dist/state/in-memory-state-store.js +43 -0
- package/dist/state/in-memory-state-store.js.map +1 -1
- package/dist/telemetry.d.ts +9 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +8 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/testing/fakes.d.ts +8 -1
- package/dist/testing/fakes.d.ts.map +1 -1
- package/dist/testing/fakes.js +18 -0
- package/dist/testing/fakes.js.map +1 -1
- package/dist/triage/schema.d.ts +175 -42
- package/dist/triage/schema.d.ts.map +1 -1
- package/dist/triage/schema.js +19 -0
- package/dist/triage/schema.js.map +1 -1
- package/dist/types.d.ts +33 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/writeback/github.d.ts.map +1 -1
- package/dist/writeback/github.js +39 -0
- package/dist/writeback/github.js.map +1 -1
- package/package.json +15 -2
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export * from './webhook/index.js';
|
|
2
2
|
export * from './state/index.js';
|
|
3
|
+
export * from './cost/index.js';
|
|
3
4
|
export { FileStateStore, githubWatchStatePath } from './state/file-state-store.js';
|
|
4
5
|
export { FactoryConfigSchema, FACTORY_STATE_ROLES } from './config/schema.js';
|
|
5
6
|
export * from './environments/index.js';
|
|
@@ -8,6 +9,7 @@ export { linearByStatePath, linearCommentPath, linearIssuePath, } from './consta
|
|
|
8
9
|
export { slackMessagePath, slackReplyPath, } from './constants/slack.js';
|
|
9
10
|
export { agentSpecWithRenderedTask, mergePolicyLine, renderAgentTask, } from './dispatch/templates.js';
|
|
10
11
|
export * from './featuremap/index.js';
|
|
12
|
+
export * from './feature-guardian/index.js';
|
|
11
13
|
export { createRelayflowPolicyRegistry, dispatchRelayflowForChangeEvent, dispatchRelayflowForTrigger, RelayflowPolicyRegistry, triggerEventFromChangeEvent, } from './dispatch/relayflow-registry.js';
|
|
12
14
|
export { FACTORY_AGENT_EXIT_TIMEOUT_ENV, createFleet, parseOwnedBrokerAgentExitTimeoutMs, resolveOwnedBrokerAgentExitTimeoutMs, } from './fleet/create-fleet.js';
|
|
13
15
|
export { ensureRelayBroker } from './fleet/ensure-relay-broker.js';
|
|
@@ -15,6 +17,7 @@ export { InternalFleetClient } from './fleet/internal-fleet-client.js';
|
|
|
15
17
|
export { RelayFleetClient } from './fleet/relay-fleet-client.js';
|
|
16
18
|
export { RelayfileCloudMountClient, resolveFactoryWorkspace, } from './mount/relayfile-cloud-mount-client.js';
|
|
17
19
|
export { RelayfileGithubConnectionWrite } from './mount/relayfile-github-connection-write.js';
|
|
20
|
+
export { GithubApiIssueRead } from './mount/github-api-issue-read.js';
|
|
18
21
|
export { ensureFactoryIntegrations, inspectFactoryIntegration, openIntegrationUrl, } from './mount/relayfile-integration-preflight.js';
|
|
19
22
|
export { GhCliGithubMergeGate, GithubMergeGate, closeProbePr, defaultGhRunner, evaluateGithubMergeGate, explicitLinkedIssueKey, parseStandaloneBabysitTarget, readStandalonePullRequest, standaloneBabysitterAgentName, } from './github/index.js';
|
|
20
23
|
export { BatchTracker, DEFAULT_FACTORY_LOOP_HEARTBEAT_PATH, DEFAULT_FACTORY_LOOP_REGISTRY_PATH, FactoryEnvironmentReaper, FactoryReaper, checkFactoryLoopLiveness, createFactory, FactoryLoop, dependencyIdentity, findDependencyCycle, issueKey, isDispatchableIssue, isRealLinearIssue, githubIssuePathParts, parseGithubFactoryIssue, parseBlockedBy, parseLinearIssue, readLinearIssueWithCanonicalFallback, readFactoryInFlightRegistry, readFactoryLoopHeartbeat, reapFactoryEnvironmentsOnce, reapFactoryOrphansOnce, } from './orchestrator/index.js';
|
|
@@ -28,7 +31,7 @@ export { DEFAULT_VERIFICATION_E2E_IMAGE, DEFAULT_VERIFICATION_STACK_PATH, VERIFI
|
|
|
28
31
|
export { KubectlPortForwarder, StackDeploymentError, VerificationStackDeployer, deployVerificationStack, } from './environments/verification-stack-deployer.js';
|
|
29
32
|
export { KubernetesEnvironmentProvider } from './environments/kubernetes-provider.js';
|
|
30
33
|
export { CommandExecutionError, ProcessCommandRunner } from './environments/kubernetes-command.js';
|
|
31
|
-
export { FACTORY_CLOUD_EVENT_CONTRACT_V1, FACTORY_CLOUD_EVENT_MAX_BATCH_SIZE, FACTORY_CLOUD_EVENT_MAX_PAYLOAD_BYTES, FACTORY_CLOUD_EVENT_TYPES, FACTORY_CLOUD_CANCELLATION_REASONS_V1, FACTORY_CLOUD_RELEASE_REASONS_V1, FactoryCloudEventAttributesV1Schema, FactoryCloudEventBatchV1Schema, FactoryCloudEventInputV1Schema, FactoryCloudEventV1Schema, FactoryCloudInstanceV1Schema, FactoryCloudVerificationEvidenceV1Schema, FactoryCloudSpanIdV1Schema, FactoryCloudTraceIdV1Schema, createFactoryCloudEventV1, factoryCloudReleaseReasonV1, factoryRunTraceIdV1, isCriticalFactoryCloudEvent, } from './observability/events.js';
|
|
34
|
+
export { FACTORY_CLOUD_EVENT_CONTRACT_V1, FACTORY_CLOUD_EVENT_MAX_BATCH_SIZE, FACTORY_CLOUD_EVENT_MAX_PAYLOAD_BYTES, FACTORY_CLOUD_EVENT_TYPES, FACTORY_CLOUD_CANCELLATION_REASONS_V1, FACTORY_CLOUD_RELEASE_REASONS_V1, FactoryCloudEventAttributesV1Schema, FactoryCloudEventBatchV1Schema, FactoryCloudEventInputV1Schema, FactoryCloudEventV1Schema, FactoryCloudInstanceV1Schema, FactoryCloudRunCostV1Schema, FactoryCloudVerificationEvidenceV1Schema, FactoryCloudSpanIdV1Schema, FactoryCloudTraceIdV1Schema, createFactoryCloudEventV1, factoryCloudReleaseReasonV1, factoryRunTraceIdV1, isCriticalFactoryCloudEvent, } from './observability/events.js';
|
|
32
35
|
export { FileFactoryCloudEventOutbox } from './observability/outbox.js';
|
|
33
36
|
export { FactoryCloudReporter } from './observability/cloud-reporter.js';
|
|
34
37
|
export { LOAD_EVIDENCE_CONTRACT, LoadMeasurementsSchema, evaluateLoadSlo, parseK6LoadMeasurements, runLoad, serializeLoadEvidence, } from './environments/load-harness.js';
|
|
@@ -37,4 +40,5 @@ export { DEFAULT_K6_IMAGE, K6_EVIDENCE_PREFIX, KubectlLoadJobClient, createK6Loa
|
|
|
37
40
|
export { DEFAULT_VERIFICATION_DESCRIPTOR, VERIFICATION_EVIDENCE_CONTRACT, VerificationPipeline, VerificationTimeoutError, resolveGitHeadRevision, runE2eCommand, } from './environments/verification-pipeline.js';
|
|
38
41
|
export { loadVerificationGateStack } from './environments/verification-stack.js';
|
|
39
42
|
export { FACTORY_ENVIRONMENT_EXPIRES_ANNOTATION, FACTORY_ENVIRONMENT_ID_LABEL, FACTORY_ENVIRONMENT_MANAGED_LABEL, FACTORY_ENVIRONMENT_REPOSITORY_ANNOTATION, KubectlEnvironmentProvider, VerificationEnvironmentAbortError, defaultKubectlEnvironmentRunner, } from './environments/kubernetes-environment.js';
|
|
43
|
+
export * from './intake/index.js';
|
|
40
44
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { GhCliIssuePublisher, loadNotionIntakeManifest, normalizeNotionManifest, normalizeNotionPageId, parseChiefSpecHeader, runNotionIntake, type GithubIssuePublisher, type ExistingGithubIssue, type NotionIntakeManifest, type NotionIntakeClaim, type NotionIntakeClaimStore, type NotionIntakeReport, type NotionIntakeResult, type NotionIntakeTarget, type NotionContractDelivery, type NotionContractPublisher, type NotionRecipe, type NormalizedNotionTask, type WorkspaceTaskDispatcher, } from './notion.js';
|
|
2
|
+
export { RelayChannelNotionClaimStore, notionClaimChannelName, } from './notion-relay-claim.js';
|
|
3
|
+
export { RelayChannelNotionContractPublisher, contractChannelName, contractMarkerPrefix, } from './notion-relay-contract.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/intake/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,GAC7B,MAAM,UAAU,CAAA;AAEjB,OAAO,EACL,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EACL,mCAAmC,EACnC,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,yBAAyB,CAAA"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { GhCliIssuePublisher, loadNotionIntakeManifest, normalizeNotionManifest, normalizeNotionPageId, parseChiefSpecHeader, runNotionIntake, } from './notion.js';
|
|
2
|
+
export { RelayChannelNotionClaimStore, notionClaimChannelName, } from './notion-relay-claim.js';
|
|
3
|
+
export { RelayChannelNotionContractPublisher, contractChannelName, contractMarkerPrefix, } from './notion-relay-contract.js';
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/intake/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,GAchB,MAAM,UAAU,CAAA;AAEjB,OAAO,EACL,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EACL,mCAAmC,EACnC,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,yBAAyB,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { AgentRelay } from '@agent-relay/sdk';
|
|
2
|
+
import type { NotionIntakeClaim, NotionIntakeClaimStore } from './notion.js';
|
|
3
|
+
type RelayChannelClaimStoreOptions = {
|
|
4
|
+
workspaceKey: string;
|
|
5
|
+
baseUrl?: string;
|
|
6
|
+
publisherName?: string;
|
|
7
|
+
createRelay?: (options: {
|
|
8
|
+
workspaceKey: string;
|
|
9
|
+
baseUrl?: string;
|
|
10
|
+
agentToken?: string;
|
|
11
|
+
}) => ClaimRelay;
|
|
12
|
+
};
|
|
13
|
+
type ClaimRelay = Pick<AgentRelay, 'agents' | 'channels' | 'messages' | 'messaging'>;
|
|
14
|
+
/**
|
|
15
|
+
* Stores one immutable claim per Notion source key in a workspace-global Relay
|
|
16
|
+
* channel. Channel-name uniqueness is the cross-dispatcher compare-and-set;
|
|
17
|
+
* message idempotency is deliberately not used because it is actor-scoped and
|
|
18
|
+
* expires after a bounded interval.
|
|
19
|
+
*/
|
|
20
|
+
export declare class RelayChannelNotionClaimStore implements NotionIntakeClaimStore {
|
|
21
|
+
#private;
|
|
22
|
+
constructor(options: RelayChannelClaimStoreOptions);
|
|
23
|
+
claim(input: NotionIntakeClaim): Promise<{
|
|
24
|
+
status: 'claimed' | 'existing';
|
|
25
|
+
claim: NotionIntakeClaim;
|
|
26
|
+
}>;
|
|
27
|
+
get(sourceKey: string): Promise<NotionIntakeClaim | undefined>;
|
|
28
|
+
dispose(): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
export declare function notionClaimChannelName(sourceKey: string): string;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=notion-relay-claim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notion-relay-claim.d.ts","sourceRoot":"","sources":["../../src/intake/notion-relay-claim.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAI7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAWzE,KAAK,6BAA6B,GAAG;IACnC,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,UAAU,CAAA;CACvG,CAAA;AAED,KAAK,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC,CAAA;AAEpF;;;;;GAKG;AACH,qBAAa,4BAA6B,YAAW,sBAAsB;;gBAU7D,OAAO,EAAE,6BAA6B;IAQ5C,KAAK,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC;QAC7C,MAAM,EAAE,SAAS,GAAG,UAAU,CAAA;QAC9B,KAAK,EAAE,iBAAiB,CAAA;KACzB,CAAC;IAkCI,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAc9D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAuC/B;AAQD,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGhE"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { AgentRelay } from '@agent-relay/sdk';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
const CLAIM_MARKER = '---FACTORY NOTION INTAKE CLAIM V1---';
|
|
5
|
+
const claimRecordSchema = z.object({
|
|
6
|
+
version: z.literal(1),
|
|
7
|
+
sourceKey: z.string().min(1),
|
|
8
|
+
digest: z.string().regex(/^[0-9a-f]{64}$/u),
|
|
9
|
+
claimedAt: z.string().datetime(),
|
|
10
|
+
}).strict();
|
|
11
|
+
/**
|
|
12
|
+
* Stores one immutable claim per Notion source key in a workspace-global Relay
|
|
13
|
+
* channel. Channel-name uniqueness is the cross-dispatcher compare-and-set;
|
|
14
|
+
* message idempotency is deliberately not used because it is actor-scoped and
|
|
15
|
+
* expires after a bounded interval.
|
|
16
|
+
*/
|
|
17
|
+
export class RelayChannelNotionClaimStore {
|
|
18
|
+
#workspaceKey;
|
|
19
|
+
#baseUrl;
|
|
20
|
+
#publisherName;
|
|
21
|
+
#createRelay;
|
|
22
|
+
#workspaceRelay;
|
|
23
|
+
#agentRelay;
|
|
24
|
+
#relayReady;
|
|
25
|
+
#disposed = false;
|
|
26
|
+
constructor(options) {
|
|
27
|
+
this.#workspaceKey = options.workspaceKey;
|
|
28
|
+
this.#baseUrl = options.baseUrl;
|
|
29
|
+
this.#publisherName = options.publisherName ??
|
|
30
|
+
`factory-notion-claims-${process.pid}-${Date.now().toString(36)}`;
|
|
31
|
+
this.#createRelay = options.createRelay ?? ((relayOptions) => new AgentRelay(relayOptions));
|
|
32
|
+
}
|
|
33
|
+
async claim(input) {
|
|
34
|
+
if (this.#disposed)
|
|
35
|
+
throw new Error('Notion claim store has been disposed');
|
|
36
|
+
const record = claimRecordSchema.parse({ version: 1, ...input });
|
|
37
|
+
const claim = publicClaim(record);
|
|
38
|
+
const relay = await this.#relay();
|
|
39
|
+
const channel = notionClaimChannelName(claim.sourceKey);
|
|
40
|
+
try {
|
|
41
|
+
await relay.channels.create({
|
|
42
|
+
name: channel,
|
|
43
|
+
topic: `Immutable Factory Notion claim ${claim.digest}`,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
catch (createError) {
|
|
47
|
+
try {
|
|
48
|
+
await relay.channels.join(channel);
|
|
49
|
+
}
|
|
50
|
+
catch (joinError) {
|
|
51
|
+
throw new Error(`unable to create or observe durable Notion claim ${channel}`, {
|
|
52
|
+
cause: new AggregateError([createError, joinError]),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
status: 'existing',
|
|
57
|
+
claim: await readExistingClaim(relay, channel, claim.sourceKey),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const text = renderClaim(record);
|
|
61
|
+
const written = await relay.messages.send({ channel, text });
|
|
62
|
+
if (written.text !== text) {
|
|
63
|
+
throw new Error(`durable Notion claim acknowledgement did not match ${channel}`);
|
|
64
|
+
}
|
|
65
|
+
return { status: 'claimed', claim };
|
|
66
|
+
}
|
|
67
|
+
async get(sourceKey) {
|
|
68
|
+
if (this.#disposed)
|
|
69
|
+
throw new Error('Notion claim store has been disposed');
|
|
70
|
+
const relay = await this.#relay();
|
|
71
|
+
const channel = notionClaimChannelName(sourceKey);
|
|
72
|
+
try {
|
|
73
|
+
await relay.channels.get(channel);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
if (isMissingChannel(error))
|
|
77
|
+
return undefined;
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
await relay.channels.join(channel);
|
|
81
|
+
return await readExistingClaim(relay, channel, sourceKey);
|
|
82
|
+
}
|
|
83
|
+
async dispose() {
|
|
84
|
+
this.#disposed = true;
|
|
85
|
+
await this.#relayReady?.catch(() => undefined);
|
|
86
|
+
await this.#agentRelay?.messaging.events.disconnect().catch(() => undefined);
|
|
87
|
+
await this.#workspaceRelay?.agents.delete(this.#publisherName).catch(() => undefined);
|
|
88
|
+
this.#agentRelay = undefined;
|
|
89
|
+
this.#workspaceRelay = undefined;
|
|
90
|
+
this.#relayReady = undefined;
|
|
91
|
+
}
|
|
92
|
+
async #relay() {
|
|
93
|
+
if (this.#agentRelay)
|
|
94
|
+
return this.#agentRelay;
|
|
95
|
+
this.#relayReady ??= this.#initializeRelay();
|
|
96
|
+
try {
|
|
97
|
+
return await this.#relayReady;
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
this.#relayReady = undefined;
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async #initializeRelay() {
|
|
105
|
+
const options = {
|
|
106
|
+
workspaceKey: this.#workspaceKey,
|
|
107
|
+
...(this.#baseUrl ? { baseUrl: this.#baseUrl } : {}),
|
|
108
|
+
};
|
|
109
|
+
const workspaceRelay = this.#createRelay(options);
|
|
110
|
+
const registration = await workspaceRelay.agents.register({
|
|
111
|
+
name: this.#publisherName,
|
|
112
|
+
type: 'system',
|
|
113
|
+
});
|
|
114
|
+
if (this.#disposed) {
|
|
115
|
+
await workspaceRelay.agents.delete(this.#publisherName).catch(() => undefined);
|
|
116
|
+
throw new Error('Notion claim store was disposed during initialization');
|
|
117
|
+
}
|
|
118
|
+
this.#workspaceRelay = workspaceRelay;
|
|
119
|
+
this.#agentRelay = this.#createRelay({ ...options, agentToken: registration.token });
|
|
120
|
+
return this.#agentRelay;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function isMissingChannel(error) {
|
|
124
|
+
if (!error || typeof error !== 'object')
|
|
125
|
+
return false;
|
|
126
|
+
const record = error;
|
|
127
|
+
return record.code === 'channel_not_found' || record.status === 404;
|
|
128
|
+
}
|
|
129
|
+
export function notionClaimChannelName(sourceKey) {
|
|
130
|
+
const suffix = createHash('sha256').update(sourceKey).digest('hex');
|
|
131
|
+
return `factory-notion-claim-${suffix}`;
|
|
132
|
+
}
|
|
133
|
+
function renderClaim(claim) {
|
|
134
|
+
return `${CLAIM_MARKER}\n${JSON.stringify(claim)}`;
|
|
135
|
+
}
|
|
136
|
+
function publicClaim(record) {
|
|
137
|
+
return {
|
|
138
|
+
sourceKey: record.sourceKey,
|
|
139
|
+
digest: record.digest,
|
|
140
|
+
claimedAt: record.claimedAt,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
async function readExistingClaim(relay, channel, expectedSourceKey) {
|
|
144
|
+
const messages = await listAllMessages(relay, channel);
|
|
145
|
+
const records = messages
|
|
146
|
+
.filter((message) => message.text.startsWith(`${CLAIM_MARKER}\n`))
|
|
147
|
+
.map((message) => claimRecordSchema.parse(JSON.parse(message.text.slice(CLAIM_MARKER.length + 1))));
|
|
148
|
+
if (records.length !== 1) {
|
|
149
|
+
throw new Error(`durable Notion claim ${channel} has ${records.length} immutable claim records; refusing dispatch`);
|
|
150
|
+
}
|
|
151
|
+
const [claim] = records;
|
|
152
|
+
if (claim.sourceKey !== expectedSourceKey) {
|
|
153
|
+
throw new Error(`durable Notion claim ${channel} does not match its source key`);
|
|
154
|
+
}
|
|
155
|
+
return publicClaim(claim);
|
|
156
|
+
}
|
|
157
|
+
async function listAllMessages(relay, channel) {
|
|
158
|
+
const messages = [];
|
|
159
|
+
let before;
|
|
160
|
+
for (let pageNumber = 0; pageNumber < 100; pageNumber += 1) {
|
|
161
|
+
const page = await relay.messages.list(channel, { limit: 100, ...(before ? { before } : {}) });
|
|
162
|
+
messages.push(...page);
|
|
163
|
+
if (page.length < 100)
|
|
164
|
+
return messages;
|
|
165
|
+
const nextBefore = page.at(-1)?.id;
|
|
166
|
+
if (!nextBefore || nextBefore === before) {
|
|
167
|
+
throw new Error('durable Notion claim message pagination did not advance');
|
|
168
|
+
}
|
|
169
|
+
before = nextBefore;
|
|
170
|
+
}
|
|
171
|
+
throw new Error('durable Notion claim channel exceeds the 10,000-message safety limit');
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=notion-relay-claim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notion-relay-claim.js","sourceRoot":"","sources":["../../src/intake/notion-relay-claim.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { AgentRelay } from '@agent-relay/sdk';
|
|
2
|
+
import type { NotionContractDelivery, NotionContractPublisher } from './notion.js';
|
|
3
|
+
type RelayChannelContractPublisherOptions = {
|
|
4
|
+
workspaceKey: string;
|
|
5
|
+
baseUrl?: string;
|
|
6
|
+
publisherName?: string;
|
|
7
|
+
createRelay?: (options: {
|
|
8
|
+
workspaceKey: string;
|
|
9
|
+
baseUrl?: string;
|
|
10
|
+
agentToken?: string;
|
|
11
|
+
}) => ContractRelay;
|
|
12
|
+
};
|
|
13
|
+
type ContractRelay = Pick<AgentRelay, 'agents' | 'channels' | 'messages' | 'messaging'>;
|
|
14
|
+
/**
|
|
15
|
+
* Publishes digest-bound Notion bytes to a workspace-private Relay channel.
|
|
16
|
+
* Workers can reconstruct a read-only local mount snapshot on any fleet node
|
|
17
|
+
* without exposing the private page through a public lifecycle issue.
|
|
18
|
+
*/
|
|
19
|
+
export declare class RelayChannelNotionContractPublisher implements NotionContractPublisher {
|
|
20
|
+
#private;
|
|
21
|
+
constructor(options: RelayChannelContractPublisherOptions);
|
|
22
|
+
publish(input: {
|
|
23
|
+
pageId: string;
|
|
24
|
+
sourceKey: string;
|
|
25
|
+
content: string;
|
|
26
|
+
contentDigest: string;
|
|
27
|
+
}): Promise<NotionContractDelivery>;
|
|
28
|
+
dispose(): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
export declare function contractChannelName(pageId: string, sourceKey: string, contentDigest: string): string;
|
|
31
|
+
export declare function contractMarkerPrefix(pageId: string, contentDigest: string): string;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=notion-relay-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notion-relay-contract.d.ts","sourceRoot":"","sources":["../../src/intake/notion-relay-contract.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAG7C,OAAO,KAAK,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AAM/E,KAAK,oCAAoC,GAAG;IAC1C,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,aAAa,CAAA;CAC1G,CAAA;AAED,KAAK,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC,CAAA;AAEvF;;;;GAIG;AACH,qBAAa,mCAAoC,YAAW,uBAAuB;;gBAWrE,OAAO,EAAE,oCAAoC;IAQnD,OAAO,CAAC,KAAK,EAAE;QACnB,MAAM,EAAE,MAAM,CAAA;QACd,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;QACf,aAAa,EAAE,MAAM,CAAA;KACtB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAiE7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAuC/B;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAGpG;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAElF"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { AgentRelay } from '@agent-relay/sdk';
|
|
3
|
+
const CONTRACT_CHUNK_CHARACTERS = 6_000;
|
|
4
|
+
const CONTRACT_BEGIN = '---BEGIN FACTORY NOTION CONTRACT BASE64---';
|
|
5
|
+
const CONTRACT_END = '---END FACTORY NOTION CONTRACT BASE64---';
|
|
6
|
+
/**
|
|
7
|
+
* Publishes digest-bound Notion bytes to a workspace-private Relay channel.
|
|
8
|
+
* Workers can reconstruct a read-only local mount snapshot on any fleet node
|
|
9
|
+
* without exposing the private page through a public lifecycle issue.
|
|
10
|
+
*/
|
|
11
|
+
export class RelayChannelNotionContractPublisher {
|
|
12
|
+
#workspaceKey;
|
|
13
|
+
#baseUrl;
|
|
14
|
+
#publisherName;
|
|
15
|
+
#createRelay;
|
|
16
|
+
#cache = new Map();
|
|
17
|
+
#workspaceRelay;
|
|
18
|
+
#agentRelay;
|
|
19
|
+
#relayReady;
|
|
20
|
+
#disposed = false;
|
|
21
|
+
constructor(options) {
|
|
22
|
+
this.#workspaceKey = options.workspaceKey;
|
|
23
|
+
this.#baseUrl = options.baseUrl;
|
|
24
|
+
this.#publisherName = options.publisherName ??
|
|
25
|
+
`factory-notion-intake-${process.pid}-${Date.now().toString(36)}`;
|
|
26
|
+
this.#createRelay = options.createRelay ?? ((relayOptions) => new AgentRelay(relayOptions));
|
|
27
|
+
}
|
|
28
|
+
async publish(input) {
|
|
29
|
+
if (this.#disposed)
|
|
30
|
+
throw new Error('Notion contract publisher has been disposed');
|
|
31
|
+
const observedDigest = createHash('sha256').update(input.content).digest('hex');
|
|
32
|
+
if (observedDigest !== input.contentDigest) {
|
|
33
|
+
throw new Error('Notion contract changed before portable mount publication');
|
|
34
|
+
}
|
|
35
|
+
const cacheKey = `${input.sourceKey}\0${input.contentDigest}`;
|
|
36
|
+
const cached = this.#cache.get(cacheKey);
|
|
37
|
+
if (cached)
|
|
38
|
+
return cached;
|
|
39
|
+
const relay = await this.#relay();
|
|
40
|
+
const channel = contractChannelName(input.pageId, input.sourceKey, input.contentDigest);
|
|
41
|
+
try {
|
|
42
|
+
await relay.channels.join(channel);
|
|
43
|
+
}
|
|
44
|
+
catch (joinError) {
|
|
45
|
+
try {
|
|
46
|
+
await relay.channels.create({
|
|
47
|
+
name: channel,
|
|
48
|
+
topic: `Read-only Notion contract ${input.pageId}`,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch (createError) {
|
|
52
|
+
try {
|
|
53
|
+
await relay.channels.join(channel);
|
|
54
|
+
}
|
|
55
|
+
catch (finalJoinError) {
|
|
56
|
+
throw new Error(`unable to join or create Notion contract channel ${channel}`, {
|
|
57
|
+
cause: new AggregateError([joinError, createError, finalJoinError]),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const encoded = Buffer.from(input.content, 'utf8').toString('base64');
|
|
63
|
+
const chunks = splitContract(encoded);
|
|
64
|
+
const markerPrefix = contractMarkerPrefix(input.pageId, input.contentDigest);
|
|
65
|
+
const existing = await listAllMessages(relay, channel);
|
|
66
|
+
const messageIds = [];
|
|
67
|
+
for (let index = 0; index < chunks.length; index += 1) {
|
|
68
|
+
const marker = `${markerPrefix}${index + 1}/${chunks.length}`;
|
|
69
|
+
const expectedText = `${marker}\n${CONTRACT_BEGIN}\n${chunks[index]}\n${CONTRACT_END}`;
|
|
70
|
+
const idempotencyKey = createHash('sha256')
|
|
71
|
+
.update(`${input.sourceKey}\0${input.contentDigest}\0${index + 1}\0${chunks.length}`)
|
|
72
|
+
.digest('hex');
|
|
73
|
+
const prior = existing.find((message) => message.text.startsWith(`${marker}\n`));
|
|
74
|
+
const message = prior ?? await relay.messages.send({
|
|
75
|
+
channel,
|
|
76
|
+
text: expectedText,
|
|
77
|
+
idempotencyKey: `factory-notion-contract-v1:${idempotencyKey}`,
|
|
78
|
+
});
|
|
79
|
+
if (message.text !== expectedText) {
|
|
80
|
+
throw new Error(`portable Notion contract chunk ${index + 1} does not match its digest-bound marker`);
|
|
81
|
+
}
|
|
82
|
+
messageIds.push(message.id);
|
|
83
|
+
}
|
|
84
|
+
const delivery = {
|
|
85
|
+
kind: 'relay-channel',
|
|
86
|
+
channel,
|
|
87
|
+
messageIds,
|
|
88
|
+
encoding: 'base64-chunks-v1',
|
|
89
|
+
};
|
|
90
|
+
this.#cache.set(cacheKey, delivery);
|
|
91
|
+
return delivery;
|
|
92
|
+
}
|
|
93
|
+
async dispose() {
|
|
94
|
+
this.#disposed = true;
|
|
95
|
+
await this.#relayReady?.catch(() => undefined);
|
|
96
|
+
await this.#agentRelay?.messaging.events.disconnect().catch(() => undefined);
|
|
97
|
+
await this.#workspaceRelay?.agents.delete(this.#publisherName).catch(() => undefined);
|
|
98
|
+
this.#agentRelay = undefined;
|
|
99
|
+
this.#workspaceRelay = undefined;
|
|
100
|
+
this.#relayReady = undefined;
|
|
101
|
+
}
|
|
102
|
+
async #relay() {
|
|
103
|
+
if (this.#agentRelay)
|
|
104
|
+
return this.#agentRelay;
|
|
105
|
+
this.#relayReady ??= this.#initializeRelay();
|
|
106
|
+
try {
|
|
107
|
+
return await this.#relayReady;
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
this.#relayReady = undefined;
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async #initializeRelay() {
|
|
115
|
+
const options = {
|
|
116
|
+
workspaceKey: this.#workspaceKey,
|
|
117
|
+
...(this.#baseUrl ? { baseUrl: this.#baseUrl } : {}),
|
|
118
|
+
};
|
|
119
|
+
const workspaceRelay = this.#createRelay(options);
|
|
120
|
+
const registration = await workspaceRelay.agents.register({
|
|
121
|
+
name: this.#publisherName,
|
|
122
|
+
type: 'system',
|
|
123
|
+
});
|
|
124
|
+
if (this.#disposed) {
|
|
125
|
+
await workspaceRelay.agents.delete(this.#publisherName).catch(() => undefined);
|
|
126
|
+
throw new Error('Notion contract publisher was disposed during initialization');
|
|
127
|
+
}
|
|
128
|
+
this.#workspaceRelay = workspaceRelay;
|
|
129
|
+
this.#agentRelay = this.#createRelay({ ...options, agentToken: registration.token });
|
|
130
|
+
return this.#agentRelay;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export function contractChannelName(pageId, sourceKey, contentDigest) {
|
|
134
|
+
const sourceSuffix = createHash('sha256').update(sourceKey).digest('hex').slice(0, 8);
|
|
135
|
+
return `factory-notion-${pageId.slice(-8)}-${sourceSuffix}-${contentDigest.slice(0, 10)}`;
|
|
136
|
+
}
|
|
137
|
+
export function contractMarkerPrefix(pageId, contentDigest) {
|
|
138
|
+
return `factory-notion-contract-v1:${pageId}:${contentDigest}:part:`;
|
|
139
|
+
}
|
|
140
|
+
function splitContract(encoded) {
|
|
141
|
+
const chunks = [];
|
|
142
|
+
for (let offset = 0; offset < encoded.length; offset += CONTRACT_CHUNK_CHARACTERS) {
|
|
143
|
+
chunks.push(encoded.slice(offset, offset + CONTRACT_CHUNK_CHARACTERS));
|
|
144
|
+
}
|
|
145
|
+
return chunks.length > 0 ? chunks : [''];
|
|
146
|
+
}
|
|
147
|
+
async function listAllMessages(relay, channel) {
|
|
148
|
+
const messages = [];
|
|
149
|
+
let before;
|
|
150
|
+
for (let pageNumber = 0; pageNumber < 100; pageNumber += 1) {
|
|
151
|
+
const page = await relay.messages.list(channel, { limit: 100, ...(before ? { before } : {}) });
|
|
152
|
+
messages.push(...page);
|
|
153
|
+
if (page.length < 100)
|
|
154
|
+
return messages;
|
|
155
|
+
const nextBefore = page.at(-1)?.id;
|
|
156
|
+
if (!nextBefore || nextBefore === before) {
|
|
157
|
+
throw new Error('portable Notion contract message pagination did not advance');
|
|
158
|
+
}
|
|
159
|
+
before = nextBefore;
|
|
160
|
+
}
|
|
161
|
+
throw new Error('portable Notion contract digest channel exceeds the 10,000-message safety limit');
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=notion-relay-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notion-relay-contract.js","sourceRoot":"","sources":["../../src/intake/notion-relay-contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAK7C,MAAM,yBAAyB,GAAG,KAAK,CAAA;AACvC,MAAM,cAAc,GAAG,4CAA4C,CAAA;AACnE,MAAM,YAAY,GAAG,0CAA0C,CAAA;AAW/D;;;;GAIG;AACH,MAAM,OAAO,mCAAmC;IACrC,aAAa,CAAQ;IACrB,QAAQ,CAAS;IACjB,cAAc,CAAQ;IACtB,YAAY,CAAkE;IAC9E,MAAM,GAAG,IAAI,GAAG,EAAkC,CAAA;IAC3D,eAAe,CAAgB;IAC/B,WAAW,CAAgB;IAC3B,WAAW,CAAyB;IACpC,SAAS,GAAG,KAAK,CAAA;IAEjB,YAAY,OAA6C;QACvD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,YAAY,CAAA;QACzC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAA;QAC/B,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,aAAa;YACzC,yBAAyB,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAA;QACnE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC,CAAA;IAC7F,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAKb;QACC,IAAI,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;QAClF,MAAM,cAAc,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC/E,IAAI,cAAc,KAAK,KAAK,CAAC,aAAa,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAA;QAC9E,CAAC;QACD,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,aAAa,EAAE,CAAA;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACxC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAA;QAEzB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;QACjC,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,CAAA;QACvF,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACpC,CAAC;QAAC,OAAO,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAC1B,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,6BAA6B,KAAK,CAAC,MAAM,EAAE;iBACnD,CAAC,CAAA;YACJ,CAAC;YAAC,OAAO,WAAW,EAAE,CAAC;gBACrB,IAAI,CAAC;oBACH,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBACpC,CAAC;gBAAC,OAAO,cAAc,EAAE,CAAC;oBACxB,MAAM,IAAI,KAAK,CAAC,oDAAoD,OAAO,EAAE,EAAE;wBAC7E,KAAK,EAAE,IAAI,cAAc,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;qBACpE,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACrE,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;QACrC,MAAM,YAAY,GAAG,oBAAoB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC,CAAA;QAC5E,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACtD,MAAM,UAAU,GAAa,EAAE,CAAA;QAE/B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACtD,MAAM,MAAM,GAAG,GAAG,YAAY,GAAG,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAA;YAC7D,MAAM,YAAY,GAAG,GAAG,MAAM,KAAK,cAAc,KAAK,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,EAAE,CAAA;YACtF,MAAM,cAAc,GAAG,UAAU,CAAC,QAAQ,CAAC;iBACxC,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,aAAa,KAAK,KAAK,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;iBACpF,MAAM,CAAC,KAAK,CAAC,CAAA;YAChB,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,CAAA;YAChF,MAAM,OAAO,GAAG,KAAK,IAAI,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACjD,OAAO;gBACP,IAAI,EAAE,YAAY;gBAClB,cAAc,EAAE,8BAA8B,cAAc,EAAE;aAC/D,CAAC,CAAA;YACF,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,GAAG,CAAC,yCAAyC,CAAC,CAAA;YACvG,CAAC;YACD,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC7B,CAAC;QAED,MAAM,QAAQ,GAA2B;YACvC,IAAI,EAAE,eAAe;YACrB,OAAO;YACP,UAAU;YACV,QAAQ,EAAE,kBAAkB;SAC7B,CAAA;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;QACnC,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACrB,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;QAC9C,MAAM,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;QAC5E,MAAM,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;QACrF,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;QAC5B,IAAI,CAAC,eAAe,GAAG,SAAS,CAAA;QAChC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC,WAAW,CAAA;QAC7C,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,gBAAgB,EAAE,CAAA;QAC5C,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,WAAW,CAAA;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;YAC5B,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,OAAO,GAAG;YACd,YAAY,EAAE,IAAI,CAAC,aAAa;YAChC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrD,CAAA;QACD,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;QACjD,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;YACxD,IAAI,EAAE,IAAI,CAAC,cAAc;YACzB,IAAI,EAAE,QAAQ;SACf,CAAC,CAAA;QACF,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;YAC9E,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;QACjF,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,cAAc,CAAA;QACrC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC,CAAA;QACpF,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,SAAiB,EAAE,aAAqB;IAC1F,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACrF,OAAO,kBAAkB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAA;AAC3F,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,aAAqB;IACxE,OAAO,8BAA8B,MAAM,IAAI,aAAa,QAAQ,CAAA;AACtE,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACpC,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,IAAI,yBAAyB,EAAE,CAAC;QAClF,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,yBAAyB,CAAC,CAAC,CAAA;IACxE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AAC1C,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,KAAoB,EAAE,OAAe;IAClE,MAAM,QAAQ,GAAmB,EAAE,CAAA;IACnC,IAAI,MAA0B,CAAA;IAC9B,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,GAAG,EAAE,UAAU,IAAI,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC9F,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;QACtB,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG;YAAE,OAAO,QAAQ,CAAA;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;QAClC,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAA;QAChF,CAAC;QACD,MAAM,GAAG,UAAU,CAAA;IACrB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAA;AACpG,CAAC"}
|