@agent-relay/factory 0.1.57 → 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 +139 -1
- 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/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/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/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- 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 +32 -32
- package/dist/orchestrator/factory.d.ts +51 -0
- package/dist/orchestrator/factory.d.ts.map +1 -1
- package/dist/orchestrator/factory.js +263 -17
- package/dist/orchestrator/factory.js.map +1 -1
- package/dist/ports/index.d.ts +1 -1
- 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 +21 -0
- 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/testing/fakes.d.ts +4 -0
- package/dist/testing/fakes.d.ts.map +1 -1
- package/dist/testing/fakes.js +6 -0
- package/dist/testing/fakes.js.map +1 -1
- package/dist/triage/schema.d.ts +133 -0
- 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 +30 -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 +10 -1
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":"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"}
|