@oharness/sync 0.1.0 → 0.2.1

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 ADDED
@@ -0,0 +1,20 @@
1
+ # @oharness/sync
2
+
3
+ The session sync server: stores conversations so a session started on one
4
+ machine can be resumed on another.
5
+
6
+ ```bash
7
+ npx @oharness/sync --help
8
+ ```
9
+
10
+ It reads no configuration file. Whatever deploys it — a container's
11
+ environment, a systemd unit, a platform's variable store — is the only source
12
+ of configuration, because a sync server that reads a file from the working
13
+ directory is a sync server whose destination a repository can change.
14
+
15
+ Tokens are verified by signature rather than by asking an auth service, so
16
+ nothing on the request path depends on another service being up. Without a
17
+ signing secret configured it degrades to a self-hosted mode: a `users.json` and
18
+ tokens handed out by hand.
19
+
20
+ Documentation: [Running your own sync server](../../docs/pages/self-hosted-sync.md)
package/dist/main.js CHANGED
@@ -2,6 +2,8 @@
2
2
  import { userPath } from "@oharness/engine/paths.ts";
3
3
  import { errorMessage } from "@oharness/engine/core/errors.ts";
4
4
  import { issueToken, readUsers, startSyncServer } from "./server.js";
5
+ import { authConfiguration } from "./memory-auth.js";
6
+ import { r2Configuration } from "./r2-memory-store.js";
5
7
  /**
6
8
  * The sync server's entry point — a separate binary because it is a separate
7
9
  * decision. Running the harness never starts one.
@@ -40,7 +42,43 @@ subscribers are not issued one by hand:
40
42
  OHARNESS_SYNC_JWT_AUDIENCE required aud (Supabase: authenticated)
41
43
  OHARNESS_SYNC_TEAMS_CLAIM claim carrying team ids (default: teams)
42
44
 
45
+ Memory sync at /v1/memory/* additionally requires server-only environment:
46
+ OHARNESS_SYNC_AUTH_URL Supabase project origin (online user validation)
47
+ OHARNESS_SYNC_AUTH_KEY Supabase publishable/anon key, not a service-role key
48
+ R2_ACCOUNT_ID Cloudflare account id
49
+ R2_MEMORY_BUCKET private Memory bucket
50
+ R2_ACCESS_KEY_ID bucket-scoped Object Read & Write credential
51
+ R2_SECRET_ACCESS_KEY matching secret
52
+
53
+ Missing Memory configuration never disables the session feed or health endpoint.
54
+
43
55
  Locally issued tokens keep working either way.`;
56
+ /**
57
+ * One line about Memory, printed because its absence is otherwise silent.
58
+ *
59
+ * Nothing set is the ordinary self-hosted case and says so quietly. Some of it
60
+ * set is a mistake — a deploy that lost a variable, or a name typed once — and
61
+ * that is the case worth a mark in the margin, because every other signal this
62
+ * process gives off will look healthy: the port opens, /v1/health answers, and
63
+ * session feeds sync. The names of missing variables are printed. No value is,
64
+ * whether or not it is the secret one.
65
+ */
66
+ function memoryLine(env) {
67
+ const names = ["OHARNESS_SYNC_AUTH_URL", "OHARNESS_SYNC_AUTH_KEY",
68
+ "R2_ACCOUNT_ID", "R2_MEMORY_BUCKET", "R2_ACCESS_KEY_ID", "R2_SECRET_ACCESS_KEY"];
69
+ if (names.every((name) => !env[name]))
70
+ return "memory off (no Memory environment)";
71
+ const missing = names.filter((name) => !env[name]);
72
+ if (missing.length)
73
+ return `! memory off — missing ${missing.join(", ")}`;
74
+ const store = r2Configuration(env);
75
+ if ("problem" in store)
76
+ return `! memory off — ${store.problem}`;
77
+ const auth = authConfiguration(env);
78
+ if (!auth)
79
+ return "! memory off — OHARNESS_SYNC_AUTH_URL is not a bare https origin";
80
+ return `memory ${store.bucket} · auth ${new URL(auth.origin).host}`;
81
+ }
44
82
  async function main() {
45
83
  const argv = process.argv.slice(2);
46
84
  if (argv.includes("-h") || argv.includes("--help")) {
@@ -93,6 +131,7 @@ async function main() {
93
131
  console.log(`\noharness sync · ${server.url}`);
94
132
  console.log(`storage ${root}`);
95
133
  console.log(signedIn ? "accounts signed tokens, plus users.json" : "accounts users.json only");
134
+ console.log(memoryLine(env));
96
135
  if (!users.length && !signedIn) {
97
136
  console.log("\n! No users yet — nothing can authenticate.");
98
137
  console.log("! Run: oharness-sync token <your-name>\n");
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface Note {
2
+ id: string;
3
+ summary: string;
4
+ body: string;
5
+ tags: string[];
6
+ createdAt: number;
7
+ updatedAt?: number;
8
+ }
9
+ export interface ObjectStore {
10
+ get(key: string, signal: AbortSignal): Promise<{
11
+ text: string;
12
+ etag: string;
13
+ } | undefined>;
14
+ put(key: string, text: string, condition: {
15
+ match?: string;
16
+ absent?: boolean;
17
+ }, signal: AbortSignal): Promise<string>;
18
+ }
19
+ export declare class MemoryFailure extends Error {
20
+ status: number;
21
+ constructor(status: number, code: string);
22
+ }
23
+ export declare function hashNote(note?: Note): string | null;
24
+ /** No database table: immutable Markdown objects + one conditionally updated manifest. */
25
+ export declare function createMemoryApi(options: {
26
+ store(): ObjectStore;
27
+ authenticate(token: string): Promise<string | undefined>;
28
+ }): (request: Request, action: string) => Promise<Response>;
@@ -0,0 +1,166 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ export class MemoryFailure extends Error {
3
+ status;
4
+ constructor(status, code) { super(code); this.status = status; }
5
+ }
6
+ const validId = (x) => typeof x === 'string' && /^[a-zA-Z0-9_-]{1,128}$/.test(x) && !['__proto__', 'constructor', 'prototype'].includes(x);
7
+ const object = (x) => !!x && typeof x === 'object' && !Array.isArray(x);
8
+ export function hashNote(note) {
9
+ return note ? createHash('sha256').update(JSON.stringify([note.id, note.summary, note.body, note.tags, note.createdAt])).digest('hex') : null;
10
+ }
11
+ function parseNote(value) {
12
+ if (!object(value) || !validId(value.id) || typeof value.summary !== 'string' || !value.summary.trim() || value.summary !== value.summary.trim() || value.summary.length > 500 || /[\r\n]/.test(value.summary) ||
13
+ typeof value.body !== 'string' || Buffer.byteLength(value.body) > 128 * 1024 || value.body !== value.body.trim() ||
14
+ !Array.isArray(value.tags) || value.tags.length > 30 || value.tags.some((tag) => typeof tag !== 'string' || !/^[^\s,\r\n]{1,64}$/.test(tag)) ||
15
+ !Number.isSafeInteger(value.createdAt) || value.createdAt < 0)
16
+ throw new MemoryFailure(400, 'invalid_note');
17
+ return { id: value.id, summary: value.summary, body: value.body, tags: [...value.tags], createdAt: value.createdAt,
18
+ ...(Number.isSafeInteger(value.updatedAt) && value.updatedAt >= 0 ? { updatedAt: value.updatedAt } : {}) };
19
+ }
20
+ function encode(note) { const { body, ...metadata } = note; return '---\n' + JSON.stringify(metadata) + '\n---\n' + body + '\n'; }
21
+ function decode(text) {
22
+ const match = /^---\n([^\n]+)\n---\n([\s\S]*)$/.exec(text);
23
+ if (!match)
24
+ throw new MemoryFailure(502, 'invalid_memory_object');
25
+ return parseNote({ ...JSON.parse(match[1]), body: match[2].trim() });
26
+ }
27
+ const reply = (status, body) => Response.json(body, { status, headers: { 'cache-control': 'no-store', 'x-content-type-options': 'nosniff' } });
28
+ async function readBody(request) {
29
+ const reader = request.body?.getReader();
30
+ if (!reader)
31
+ throw new MemoryFailure(400, 'invalid_body');
32
+ const chunks = [];
33
+ let size = 0;
34
+ try {
35
+ for (;;) {
36
+ const { done, value } = await reader.read();
37
+ if (done)
38
+ break;
39
+ size += value.length;
40
+ if (size > 3 * 1024 * 1024) {
41
+ await reader.cancel();
42
+ throw new MemoryFailure(413, 'memory_quota_exceeded');
43
+ }
44
+ chunks.push(value);
45
+ }
46
+ return JSON.parse(Buffer.concat(chunks).toString('utf8'));
47
+ }
48
+ finally {
49
+ reader.releaseLock();
50
+ }
51
+ }
52
+ /** No database table: immutable Markdown objects + one conditionally updated manifest. */
53
+ export function createMemoryApi(options) {
54
+ const limits = new Map();
55
+ return async (request, action) => {
56
+ try {
57
+ if (request.method !== 'POST' || !['identity', 'snapshot', 'commit'].includes(action))
58
+ throw new MemoryFailure(404, 'unknown_action');
59
+ if (request.headers.has('origin'))
60
+ throw new MemoryFailure(403, 'native_client_required');
61
+ const token = /^Bearer ([^\s]{1,8192})$/i.exec(request.headers.get('authorization') ?? '')?.[1];
62
+ const user = token ? await options.authenticate(token) : undefined;
63
+ if (!validId(user))
64
+ throw new MemoryFailure(401, 'sign_in_required');
65
+ const now = Date.now();
66
+ for (const [id, limit] of limits)
67
+ if (now - limit.start > 60000)
68
+ limits.delete(id);
69
+ let limit = limits.get(user);
70
+ if (!limit) {
71
+ if (limits.size >= 5000)
72
+ throw new MemoryFailure(429, 'rate_limited');
73
+ limit = { start: now, count: 0 };
74
+ limits.set(user, limit);
75
+ }
76
+ if (++limit.count > 60)
77
+ throw new MemoryFailure(429, 'rate_limited');
78
+ if (request.headers.get('content-type')?.split(';')[0] !== 'application/json')
79
+ throw new MemoryFailure(415, 'json_required');
80
+ const input = await readBody(request);
81
+ if (!object(input) || input.expectedPrincipal !== user)
82
+ throw new MemoryFailure(403, 'account_mismatch');
83
+ // Reject attempts to select another tenant or arbitrary object path, even unused fields.
84
+ const fields = action === 'identity' ? ['expectedPrincipal'] : action === 'snapshot' ? ['expectedPrincipal', 'project', 'knownEtag'] : ['expectedPrincipal', 'project', 'etag', 'changes'];
85
+ if (Object.keys(input).some((key) => !fields.includes(key)))
86
+ throw new MemoryFailure(400, 'unknown_field');
87
+ if (action === 'identity')
88
+ return reply(200, { principal: user });
89
+ if (!validId(input.project))
90
+ throw new MemoryFailure(400, 'invalid_project');
91
+ const store = options.store();
92
+ const signal = AbortSignal.any([request.signal, AbortSignal.timeout(50000)]);
93
+ const prefix = `users/${user}/projects/${input.project}/memory/`;
94
+ const stored = await store.get(prefix + 'manifest.json', signal);
95
+ if (action === 'snapshot' && stored && input.knownEtag === stored.etag)
96
+ return reply(200, { principal: user, etag: stored.etag, unchanged: true });
97
+ let manifest = stored ? JSON.parse(stored.text) : { version: 1, entries: [] };
98
+ const validate = (m) => {
99
+ if (m.version !== 1 || !Array.isArray(m.entries) || m.entries.length > 500)
100
+ throw new MemoryFailure(413, 'memory_quota_exceeded');
101
+ const seen = new Set();
102
+ for (const entry of m.entries) {
103
+ if (!validId(entry.id) || seen.has(entry.id) || !(entry.hash === null || typeof entry.hash === 'string' && /^[a-f0-9]{64}$/.test(entry.hash) && validId(entry.revision)))
104
+ throw new MemoryFailure(502, 'invalid_manifest');
105
+ seen.add(entry.id);
106
+ }
107
+ };
108
+ validate(manifest);
109
+ let etag = stored?.etag ?? null;
110
+ const changed = new Map();
111
+ if (action === 'commit') {
112
+ if (input.etag !== etag)
113
+ throw new MemoryFailure(409, 'revision_conflict');
114
+ if (!Array.isArray(input.changes) || !input.changes.length || input.changes.length > 500)
115
+ throw new MemoryFailure(400, 'invalid_changes');
116
+ const entries = new Map(manifest.entries.map((entry) => [entry.id, entry]));
117
+ for (const change of input.changes) {
118
+ if (!object(change) || !validId(change.id) || changed.has(change.id))
119
+ throw new MemoryFailure(400, 'invalid_changes');
120
+ const note = change.note === undefined ? undefined : parseNote(change.note);
121
+ if ((note && note.id !== change.id) || hashNote(note) !== change.hash)
122
+ throw new MemoryFailure(400, 'hash_mismatch');
123
+ changed.set(change.id, note);
124
+ entries.set(change.id, { id: change.id, hash: change.hash, ...(note ? { revision: randomUUID() } : {}) });
125
+ }
126
+ manifest = { version: 1, entries: [...entries.values()].sort((a, b) => a.id.localeCompare(b.id)) };
127
+ validate(manifest);
128
+ }
129
+ // Validate full result/quotas BEFORE writing any object or publishing the manifest.
130
+ const output = [];
131
+ // Bound concurrent reads: large manifests must not require 500 serial R2 round trips.
132
+ for (let offset = 0; offset < manifest.entries.length; offset += 8) {
133
+ const batch = await Promise.all(manifest.entries.slice(offset, offset + 8).map(async (entry) => {
134
+ let note = changed.get(entry.id);
135
+ if (entry.hash && !changed.has(entry.id)) {
136
+ const item = await store.get(prefix + `objects/${entry.id}/${entry.revision}.md`, signal);
137
+ if (!item)
138
+ throw new MemoryFailure(502, 'missing_memory_object');
139
+ note = decode(item.text);
140
+ }
141
+ if (hashNote(note) !== entry.hash || note && note.id !== entry.id)
142
+ throw new MemoryFailure(502, 'memory_integrity_error');
143
+ return { id: entry.id, hash: entry.hash, ...(note ? { note } : {}) };
144
+ }));
145
+ output.push(...batch);
146
+ }
147
+ if (Buffer.byteLength(JSON.stringify(output)) > 2 * 1024 * 1024)
148
+ throw new MemoryFailure(413, 'memory_quota_exceeded');
149
+ if (action === 'commit') {
150
+ for (let offset = 0; offset < manifest.entries.length; offset += 8) {
151
+ await Promise.all(manifest.entries.slice(offset, offset + 8).map(async (entry) => {
152
+ const note = changed.get(entry.id);
153
+ if (note)
154
+ await store.put(prefix + `objects/${entry.id}/${entry.revision}.md`, encode(note), { absent: true }, signal);
155
+ }));
156
+ }
157
+ etag = await store.put(prefix + 'manifest.json', JSON.stringify(manifest), etag ? { match: etag } : { absent: true }, signal);
158
+ }
159
+ return reply(200, { principal: user, etag, entries: output });
160
+ }
161
+ catch (error) {
162
+ return error instanceof MemoryFailure ? reply(error.status, { code: error.message }) : reply(502, { code: 'memory_sync_failed' });
163
+ }
164
+ };
165
+ }
166
+ //# sourceMappingURL=memory-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-api.js","sourceRoot":"","sources":["../src/memory-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * The Auth half of Memory's deployment configuration, resolved without a request.
3
+ *
4
+ * Split out of the authenticator so the startup line in main.ts can report the
5
+ * same verdict the first request would reach. Two copies of these rules would
6
+ * agree on the day they were written and not for long after, and the copy that
7
+ * drifts is the one that says a misconfigured service is fine.
8
+ *
9
+ * Anything but a bare https origin is refused: a path, a query, embedded
10
+ * credentials, or plain http anywhere but loopback. The origin is deployment
11
+ * configuration and never a client input, so a surprising one is a mistake
12
+ * rather than a case to accommodate.
13
+ */
14
+ export declare function authConfiguration(env?: NodeJS.ProcessEnv): {
15
+ origin: string;
16
+ key: string;
17
+ } | undefined;
18
+ /** Preserve online account validation: anonymous/deleted accounts cannot sync Memory.
19
+ * Credentials and the Auth origin are deployment configuration, never client inputs.
20
+ * Session feeds retain their existing JWT/local-token authentication.
21
+ */
22
+ export declare function createMemoryAuthenticator(env?: NodeJS.ProcessEnv, http?: typeof fetch): (token: string) => Promise<string | undefined>;
@@ -0,0 +1,77 @@
1
+ import { MemoryFailure } from "./memory-api.js";
2
+ /**
3
+ * The Auth half of Memory's deployment configuration, resolved without a request.
4
+ *
5
+ * Split out of the authenticator so the startup line in main.ts can report the
6
+ * same verdict the first request would reach. Two copies of these rules would
7
+ * agree on the day they were written and not for long after, and the copy that
8
+ * drifts is the one that says a misconfigured service is fine.
9
+ *
10
+ * Anything but a bare https origin is refused: a path, a query, embedded
11
+ * credentials, or plain http anywhere but loopback. The origin is deployment
12
+ * configuration and never a client input, so a surprising one is a mistake
13
+ * rather than a case to accommodate.
14
+ */
15
+ export function authConfiguration(env = process.env) {
16
+ const base = env["OHARNESS_SYNC_AUTH_URL"];
17
+ const key = env["OHARNESS_SYNC_AUTH_KEY"];
18
+ if (!base || !key)
19
+ return undefined;
20
+ let url;
21
+ try {
22
+ url = new URL(base);
23
+ }
24
+ catch {
25
+ return undefined;
26
+ }
27
+ if (url.username || url.password || url.search || url.hash || url.pathname !== "/" ||
28
+ (url.protocol !== "https:" && !(url.protocol === "http:" && ["localhost", "127.0.0.1", "[::1]"].includes(url.hostname)))) {
29
+ return undefined;
30
+ }
31
+ return { origin: url.origin, key };
32
+ }
33
+ /** Preserve online account validation: anonymous/deleted accounts cannot sync Memory.
34
+ * Credentials and the Auth origin are deployment configuration, never client inputs.
35
+ * Session feeds retain their existing JWT/local-token authentication.
36
+ */
37
+ export function createMemoryAuthenticator(env = process.env, http = fetch) {
38
+ return async (token) => {
39
+ const configuration = authConfiguration(env);
40
+ if (!configuration)
41
+ throw new MemoryFailure(503, "auth_not_configured");
42
+ const response = await http(configuration.origin + "/auth/v1/user", {
43
+ headers: { apikey: configuration.key, authorization: "Bearer " + token },
44
+ redirect: "error", signal: AbortSignal.timeout(10000),
45
+ });
46
+ if (!response.ok) {
47
+ await response.body?.cancel();
48
+ if (response.status === 401 || response.status === 403)
49
+ return undefined;
50
+ throw new MemoryFailure(502, "auth_unavailable");
51
+ }
52
+ const reader = response.body?.getReader();
53
+ if (!reader)
54
+ return undefined;
55
+ const chunks = [];
56
+ let size = 0;
57
+ try {
58
+ for (;;) {
59
+ const { value, done } = await reader.read();
60
+ if (done)
61
+ break;
62
+ size += value.byteLength;
63
+ if (size > 128 * 1024) {
64
+ await reader.cancel();
65
+ throw new MemoryFailure(502, "auth_response_too_large");
66
+ }
67
+ chunks.push(value);
68
+ }
69
+ }
70
+ finally {
71
+ reader.releaseLock();
72
+ }
73
+ const user = JSON.parse(Buffer.concat(chunks).toString("utf8"));
74
+ return user && user.is_anonymous !== true && typeof user.id === "string" ? user.id : undefined;
75
+ };
76
+ }
77
+ //# sourceMappingURL=memory-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-auth.js","sourceRoot":"","sources":["../src/memory-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { ObjectStore } from './memory-api.ts';
2
+ /**
3
+ * The bucket half of Memory's deployment configuration, resolved without a request.
4
+ *
5
+ * The store below is built on the first Memory request rather than at startup,
6
+ * which means a service missing one of these four variables boots, answers the
7
+ * health check and serves session feeds exactly like a working one — and fails
8
+ * only when a user presses sync, in their client rather than in any log here.
9
+ * main.ts prints what this function says so that gap is visible on the way up;
10
+ * it has to be this function and not a second copy of these rules, because the
11
+ * copy that drifts is the one that calls a broken deployment healthy.
12
+ *
13
+ * The problem is returned as prose for that line and deliberately names no
14
+ * value: which variable is wrong is the useful half, and its contents are a
15
+ * credential.
16
+ */
17
+ export declare function r2Configuration(env?: NodeJS.ProcessEnv): {
18
+ account: string;
19
+ bucket: string;
20
+ accessKeyId: string;
21
+ secretAccessKey: string;
22
+ } | {
23
+ problem: string;
24
+ };
25
+ /** The only R2-specific layer. Never used by the desktop/browser bundle. */
26
+ export declare function createR2MemoryStore(env?: NodeJS.ProcessEnv): ObjectStore;
@@ -0,0 +1,88 @@
1
+ import { S3Client, GetObjectCommand, PutObjectCommand } from '@aws-sdk/client-s3';
2
+ import { MemoryFailure } from "./memory-api.js";
3
+ /**
4
+ * The bucket half of Memory's deployment configuration, resolved without a request.
5
+ *
6
+ * The store below is built on the first Memory request rather than at startup,
7
+ * which means a service missing one of these four variables boots, answers the
8
+ * health check and serves session feeds exactly like a working one — and fails
9
+ * only when a user presses sync, in their client rather than in any log here.
10
+ * main.ts prints what this function says so that gap is visible on the way up;
11
+ * it has to be this function and not a second copy of these rules, because the
12
+ * copy that drifts is the one that calls a broken deployment healthy.
13
+ *
14
+ * The problem is returned as prose for that line and deliberately names no
15
+ * value: which variable is wrong is the useful half, and its contents are a
16
+ * credential.
17
+ */
18
+ export function r2Configuration(env = process.env) {
19
+ const account = env.R2_ACCOUNT_ID, bucket = env.R2_MEMORY_BUCKET;
20
+ const accessKeyId = env.R2_ACCESS_KEY_ID, secretAccessKey = env.R2_SECRET_ACCESS_KEY;
21
+ const fields = [['R2_ACCOUNT_ID', account], ['R2_MEMORY_BUCKET', bucket],
22
+ ['R2_ACCESS_KEY_ID', accessKeyId], ['R2_SECRET_ACCESS_KEY', secretAccessKey]];
23
+ if (!account || !bucket || !accessKeyId || !secretAccessKey) {
24
+ return { problem: `missing ${fields.filter(([, value]) => !value).map(([name]) => name).join(', ')}` };
25
+ }
26
+ if (!/^[a-f0-9]{32}$/.test(account))
27
+ return { problem: 'R2_ACCOUNT_ID is not a 32-character account id' };
28
+ if (!/^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$/.test(bucket))
29
+ return { problem: 'R2_MEMORY_BUCKET is not a valid bucket name' };
30
+ return { account, bucket, accessKeyId, secretAccessKey };
31
+ }
32
+ /** The only R2-specific layer. Never used by the desktop/browser bundle. */
33
+ export function createR2MemoryStore(env = process.env) {
34
+ const configuration = r2Configuration(env);
35
+ if ('problem' in configuration)
36
+ throw new MemoryFailure(503, 'r2_not_configured');
37
+ const { account, bucket, accessKeyId, secretAccessKey } = configuration;
38
+ const client = new S3Client({ region: 'auto', endpoint: `https://${account}.r2.cloudflarestorage.com`, maxAttempts: 1,
39
+ credentials: { accessKeyId, secretAccessKey } });
40
+ const safeKey = (key) => {
41
+ if (!/^users\/[a-zA-Z0-9_-]+\/projects\/[a-zA-Z0-9_-]+\/memory\/(manifest\.json|objects\/[a-zA-Z0-9_-]+\/[a-zA-Z0-9_-]+\.md)$/.test(key))
42
+ throw new MemoryFailure(400, 'invalid_object_key');
43
+ };
44
+ return {
45
+ async get(key, signal) {
46
+ safeKey(key);
47
+ try {
48
+ const result = await client.send(new GetObjectCommand({ Bucket: bucket, Key: key }), { abortSignal: signal });
49
+ if (!result.Body || !result.ETag)
50
+ throw new MemoryFailure(502, 'invalid_object');
51
+ const parts = [];
52
+ let size = 0;
53
+ for await (const part of result.Body) {
54
+ size += part.length;
55
+ if (size > 512 * 1024) {
56
+ result.Body.destroy?.();
57
+ throw new MemoryFailure(413, 'object_too_large');
58
+ }
59
+ parts.push(part);
60
+ }
61
+ return { text: Buffer.concat(parts).toString('utf8'), etag: result.ETag };
62
+ }
63
+ catch (error) {
64
+ if (error?.name === 'NoSuchKey')
65
+ return undefined;
66
+ throw error;
67
+ }
68
+ },
69
+ async put(key, text, condition, signal) {
70
+ safeKey(key);
71
+ try {
72
+ const result = await client.send(new PutObjectCommand({ Bucket: bucket, Key: key, Body: text,
73
+ ContentType: key.endsWith('.md') ? 'text/markdown; charset=utf-8' : 'application/json', CacheControl: 'no-store',
74
+ ...(condition.match ? { IfMatch: condition.match } : {}), ...(condition.absent ? { IfNoneMatch: '*' } : {}),
75
+ }), { abortSignal: signal });
76
+ if (!result.ETag)
77
+ throw new MemoryFailure(502, 'missing_etag');
78
+ return result.ETag;
79
+ }
80
+ catch (error) {
81
+ if ([409, 412].includes(error?.$metadata?.httpStatusCode))
82
+ throw new MemoryFailure(409, 'revision_conflict');
83
+ throw error;
84
+ }
85
+ },
86
+ };
87
+ }
88
+ //# sourceMappingURL=r2-memory-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"r2-memory-store.js","sourceRoot":"","sources":["../src/r2-memory-store.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { ObjectStore } from "./memory-api.ts";
1
2
  import type { JwtOptions } from "@oharness/engine/util/jwt.ts";
2
3
  /**
3
4
  * The optional half of sync.
@@ -46,6 +47,11 @@ export interface SyncServerOptions {
46
47
  * required, and users.json keeps working whether or not it is set.
47
48
  */
48
49
  jwt?: JwtOptions;
50
+ /** Overrides for embedding/tests. Memory otherwise uses this service's Auth/R2 environment. */
51
+ memory?: {
52
+ store(): ObjectStore;
53
+ authenticate(token: string): Promise<string | undefined>;
54
+ };
49
55
  }
50
56
  export interface SyncServer {
51
57
  url: string;
package/dist/server.js CHANGED
@@ -2,6 +2,10 @@ import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
2
2
  import { createServer } from "node:http";
3
3
  import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
4
4
  import path from "node:path";
5
+ import { Readable } from "node:stream";
6
+ import { createMemoryApi } from "./memory-api.js";
7
+ import { createMemoryAuthenticator } from "./memory-auth.js";
8
+ import { createR2MemoryStore } from "./r2-memory-store.js";
5
9
  import { errorMessage } from "@oharness/engine/core/errors.ts";
6
10
  import { parseJson } from "@oharness/engine/util/json.ts";
7
11
  import { Feed, listProjects } from "./feed.js";
@@ -10,6 +14,11 @@ import { DEFAULT_PULL_LIMIT, MAX_BODY_BYTES, MAX_PUSH_RECORDS, MAX_WAIT_SECONDS,
10
14
  export async function startSyncServer(opts) {
11
15
  const host = opts.host ?? "127.0.0.1";
12
16
  const verifier = opts.jwt ? new JwtVerifier(opts.jwt) : undefined;
17
+ let memoryStore;
18
+ const memory = createMemoryApi(opts.memory ?? {
19
+ store: () => memoryStore ??= createR2MemoryStore(),
20
+ authenticate: createMemoryAuthenticator(),
21
+ });
13
22
  const feeds = new Map();
14
23
  const feed = (owner, project) => {
15
24
  const key = `${owner.kind}\u0000${owner.id}\u0000${project}`;
@@ -30,6 +39,41 @@ export async function startSyncServer(opts) {
30
39
  // health check nobody wires up.
31
40
  if (route === "GET /v1/health")
32
41
  return send(res, 200, { ok: true });
42
+ // Memory uses the same sync process, but has a snapshot/CAS protocol rather
43
+ // than the session feed's append/cursor protocol. Do not decode note bodies here.
44
+ if (url.pathname.startsWith("/v1/memory/")) {
45
+ if (req.method !== "POST")
46
+ return send(res, 405, { error: "POST required" });
47
+ const aborter = new AbortController();
48
+ const abort = () => { if (!res.writableEnded)
49
+ aborter.abort(); };
50
+ req.once("aborted", abort);
51
+ res.once("close", abort);
52
+ const deadline = setTimeout(() => { aborter.abort(); req.destroy(); }, 60000);
53
+ deadline.unref();
54
+ try {
55
+ const headers = new Headers();
56
+ for (const [name, value] of Object.entries(req.headers)) {
57
+ if (value !== undefined)
58
+ headers.set(name, Array.isArray(value) ? value.join(", ") : value);
59
+ }
60
+ const request = new Request("http://sync.local" + url.pathname, {
61
+ method: "POST", headers, body: Readable.toWeb(req), duplex: "half", signal: aborter.signal,
62
+ });
63
+ const response = await memory(request, url.pathname.slice("/v1/memory/".length));
64
+ if (!res.destroyed) {
65
+ res.statusCode = response.status;
66
+ response.headers.forEach((value, name) => res.setHeader(name, value));
67
+ res.end(Buffer.from(await response.arrayBuffer()));
68
+ }
69
+ }
70
+ finally {
71
+ clearTimeout(deadline);
72
+ req.off("aborted", abort);
73
+ res.off("close", abort);
74
+ }
75
+ return;
76
+ }
33
77
  const user = await authenticate(opts.root, req, verifier);
34
78
  if (!user) {
35
79
  res.setHeader("www-authenticate", "Bearer");
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AA4DvB,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAuB;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;IAEtC,MAAM,IAAI,GAAG,CAAC,KAAY,EAAE,OAAe,EAAQ,EAAE;QACnD,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;QAC7D,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAC3C,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACvC,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,MAAM,CAAC,GAAoB,EAAE,GAAmB;QAC7D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;QACjF,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QAE9C,0EAA0E;QAC1E,gCAAgC;QAChC,IAAI,KAAK,KAAK,gBAAgB;YAAE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpE,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED;;;;;;;WAOG;QACH,MAAM,KAAK,GAAG,CAAC,KAAgC,EAAqB,EAAE;YACpE,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACpF,CAAC,CAAC;QAEF,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;gBAClD,IAAI,CAAC,KAAK;oBAAE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;gBAC1E,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YAC5E,CAAC;YAED,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,CAA2B,CAAC;gBAC7D,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrE,IAAI,CAAC,OAAO;oBAAE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;gBAEtE,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACnF,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACvF,sEAAsE;gBACtE,gEAAgE;gBAChE,IAAI,OAAO,CAAC,MAAM,GAAG,gBAAgB,IAAI,QAAQ,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;oBAC5E,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,gBAAgB,mBAAmB,EAAE,CAAC,CAAC;gBACnF,CAAC;gBAED,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAC3E,IAAI,CAAC,KAAK;oBAAE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;gBAE1E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBACpE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YAChC,CAAC;YAED,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBACtD,IAAI,CAAC,OAAO;oBAAE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;gBAEtE,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;gBAC7E,MAAM,KAAK,GAAG,KAAK,CACjB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,kBAAkB,EAC9E,CAAC,EACD,kBAAkB,CACnB,CAAC;gBACF,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC,CAAC;gBAEvG,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;gBAClD,IAAI,CAAC,KAAK;oBAAE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;gBAE1E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBACpC,qEAAqE;gBACrE,uCAAuC;gBACvC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;oBAAE,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBAEjF,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBAC3D,MAAM,MAAM,GAAiB;oBAC3B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;oBACpE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,WAAW,CAAiB;oBAC5F,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,WAAW,CAAkB;oBAC/F,IAAI;iBACL,CAAC;gBACF,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YAChC,CAAC;YAED;gBACE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE;YACvC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IAEtF,OAAO;QACL,GAAG,EAAE,UAAU,IAAI,IAAI,IAAI,EAAE;QAC7B,IAAI;QACJ,KAAK,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC;KACjC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY;IAC1C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACzF,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,SAAS,CAAyB,GAAG,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAChE,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK;SACtB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE,EAAE,KAAK,QAAQ,IAAI,OAAO,IAAI,EAAE,SAAS,KAAK,QAAQ,CAAC;SACrF,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACd,GAAG,IAAI;QACP,sEAAsE;QACtE,kEAAkE;QAClE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;KACxF,CAAC,CAAC,CAAC;AACR,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,EAAU,EAAE,QAAkB,EAAE;IAC7E,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACvE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAE/E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC3C,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;IAC1C,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzE,MAAM,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,IAAI,CAAC,KAAa;IACzB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,IAAY,EACZ,GAAoB,EACpB,QAAsB;IAEtB,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrF,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEhC,4EAA4E;IAC5E,4EAA4E;IAC5E,yEAAyE;IACzE,IAAI,QAAQ,EAAE,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC9B,yEAAyE;QACzE,2EAA2E;QAC3E,2DAA2D;QAC3D,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IAChE,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE3C,KAAK,MAAM,IAAI,IAAI,MAAM,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1C,2EAA2E;QAC3E,qEAAqE;QACrE,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;IACpF,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,8EAA8E;AAE9E,SAAS,QAAQ,CAAC,KAAc;IAC9B,MAAM,MAAM,GAAG,KAAmB,CAAC;IACnC,OAAO,OAAO,CACZ,MAAM;QACJ,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;QAClC,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ;QAC7B,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ;QAC9B,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CACpC,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,MAAM,OAAO,GAAG,KAAoB,CAAC;IACrC,OAAO,OAAO,CACZ,OAAO;QACL,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ;QAC9B,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ;QAC/B,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,CACxC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAuC;IAC1D,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACxD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,IAAY;IACrD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,IAAI,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAa;IAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;QACpB,cAAc,EAAE,iCAAiC;QACjD,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;KAC7C,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,GAAoB;IAC1C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;QAC9B,IAAI,IAAK,KAAgB,CAAC,MAAM,CAAC;QACjC,4EAA4E;QAC5E,2BAA2B;QAC3B,IAAI,IAAI,GAAG,cAAc;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,SAAS,CAA0B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1F,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,9 +1,26 @@
1
1
  {
2
2
  "name": "@oharness/sync",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "The optional sync server: orders opaque transcript records so two machines can hand each other a session.",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
+ "author": "Litbox LLC",
8
+ "homepage": "https://oharness.ai",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/Jet1217/OHarness.git",
12
+ "directory": "packages/sync"
13
+ },
14
+ "bugs": {
15
+ "url": "https://github.com/Jet1217/OHarness/issues"
16
+ },
17
+ "keywords": [
18
+ "agent",
19
+ "sync",
20
+ "session",
21
+ "transcript",
22
+ "harness"
23
+ ],
7
24
  "engines": {
8
25
  "node": ">=22.6.0"
9
26
  },
@@ -31,6 +48,7 @@
31
48
  "build": "rm -rf dist && tsc -p tsconfig.build.json"
32
49
  },
33
50
  "dependencies": {
34
- "@oharness/engine": "0.1.0"
51
+ "@aws-sdk/client-s3": "3.1125.0",
52
+ "@oharness/engine": "0.2.1"
35
53
  }
36
54
  }