unfairly 0.3.0 → 0.5.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/CHANGELOG.md +37 -0
- package/README.md +45 -1
- package/dist/auth/browser-flow.d.ts +15 -0
- package/dist/auth/browser-flow.d.ts.map +1 -0
- package/dist/auth/browser-flow.js +1 -0
- package/dist/auth/browser-flow.js.map +1 -0
- package/dist/cmd/init.d.ts +10 -0
- package/dist/cmd/init.d.ts.map +1 -0
- package/dist/cmd/init.js +11 -4
- package/dist/cmd/init.js.map +1 -0
- package/dist/cmd/login.d.ts +21 -0
- package/dist/cmd/login.d.ts.map +1 -0
- package/dist/cmd/login.js +1 -0
- package/dist/cmd/login.js.map +1 -0
- package/dist/cmd/mcp.d.ts +2 -0
- package/dist/cmd/mcp.d.ts.map +1 -0
- package/dist/cmd/mcp.js +1 -0
- package/dist/cmd/mcp.js.map +1 -0
- package/dist/cmd/pull.d.ts +2 -0
- package/dist/cmd/pull.d.ts.map +1 -0
- package/dist/cmd/pull.js +9 -0
- package/dist/cmd/pull.js.map +1 -0
- package/dist/cmd/push.d.ts +2 -0
- package/dist/cmd/push.d.ts.map +1 -0
- package/dist/cmd/push.js +1 -0
- package/dist/cmd/push.js.map +1 -0
- package/dist/cmd/resolve.d.ts +2 -0
- package/dist/cmd/resolve.d.ts.map +1 -0
- package/dist/cmd/resolve.js +1 -0
- package/dist/cmd/resolve.js.map +1 -0
- package/dist/cmd/setup.d.ts +20 -0
- package/dist/cmd/setup.d.ts.map +1 -0
- package/dist/cmd/setup.js +1 -0
- package/dist/cmd/setup.js.map +1 -0
- package/dist/cmd/status.d.ts +2 -0
- package/dist/cmd/status.d.ts.map +1 -0
- package/dist/cmd/status.js +1 -0
- package/dist/cmd/status.js.map +1 -0
- package/dist/cmd/watch.d.ts +2 -0
- package/dist/cmd/watch.d.ts.map +1 -0
- package/dist/cmd/watch.js +1 -0
- package/dist/cmd/watch.js.map +1 -0
- package/dist/hosts/claude-code.d.ts +23 -0
- package/dist/hosts/claude-code.d.ts.map +1 -0
- package/dist/hosts/claude-code.js +1 -0
- package/dist/hosts/claude-code.js.map +1 -0
- package/dist/hosts/codex.d.ts +39 -0
- package/dist/hosts/codex.d.ts.map +1 -0
- package/dist/hosts/codex.js +1 -0
- package/dist/hosts/codex.js.map +1 -0
- package/dist/hosts/shell-env.d.ts +16 -0
- package/dist/hosts/shell-env.d.ts.map +1 -0
- package/dist/hosts/shell-env.js +1 -0
- package/dist/hosts/shell-env.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/client.d.ts +46 -0
- package/dist/lib/client.d.ts.map +1 -0
- package/dist/lib/client.js +58 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/events/emit.d.ts +17 -0
- package/dist/lib/events/emit.d.ts.map +1 -0
- package/dist/lib/events/emit.js +28 -0
- package/dist/lib/events/emit.js.map +1 -0
- package/dist/lib/index.d.ts +13 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +11 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/transport.d.ts +46 -0
- package/dist/lib/transport.d.ts.map +1 -0
- package/dist/lib/transport.js +85 -0
- package/dist/lib/transport.js.map +1 -0
- package/dist/lib/types/index.d.ts +167 -0
- package/dist/lib/types/index.d.ts.map +1 -0
- package/dist/lib/types/index.js +50 -0
- package/dist/lib/types/index.js.map +1 -0
- package/dist/lib/vault/checkpoint.d.ts +12 -0
- package/dist/lib/vault/checkpoint.d.ts.map +1 -0
- package/dist/lib/vault/checkpoint.js +18 -0
- package/dist/lib/vault/checkpoint.js.map +1 -0
- package/dist/lib/vault/read.d.ts +4 -0
- package/dist/lib/vault/read.d.ts.map +1 -0
- package/dist/lib/vault/read.js +9 -0
- package/dist/lib/vault/read.js.map +1 -0
- package/dist/lib/vault/search.d.ts +8 -0
- package/dist/lib/vault/search.d.ts.map +1 -0
- package/dist/lib/vault/search.js +10 -0
- package/dist/lib/vault/search.js.map +1 -0
- package/dist/sync/api.d.ts +80 -0
- package/dist/sync/api.d.ts.map +1 -0
- package/dist/sync/api.js +1 -0
- package/dist/sync/api.js.map +1 -0
- package/dist/sync/autoloader.d.ts +7 -0
- package/dist/sync/autoloader.d.ts.map +1 -0
- package/dist/sync/autoloader.js +138 -0
- package/dist/sync/autoloader.js.map +1 -0
- package/dist/sync/conflict.d.ts +12 -0
- package/dist/sync/conflict.d.ts.map +1 -0
- package/dist/sync/conflict.js +1 -0
- package/dist/sync/conflict.js.map +1 -0
- package/dist/sync/credentials.d.ts +8 -0
- package/dist/sync/credentials.d.ts.map +1 -0
- package/dist/sync/credentials.js +1 -0
- package/dist/sync/credentials.js.map +1 -0
- package/dist/sync/files.d.ts +43 -0
- package/dist/sync/files.d.ts.map +1 -0
- package/dist/sync/files.js +1 -0
- package/dist/sync/files.js.map +1 -0
- package/dist/sync/manifest.d.ts +31 -0
- package/dist/sync/manifest.d.ts.map +1 -0
- package/dist/sync/manifest.js +1 -0
- package/dist/sync/manifest.js.map +1 -0
- package/package.json +26 -5
- package/dist/hosts/codex.test.js +0 -64
- package/dist/hosts/shell-env.test.js +0 -71
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `createUnfairlyClient` — public factory for the agent runtime SDK.
|
|
3
|
+
*
|
|
4
|
+
* Resolves API base URL + token from explicit options or env vars. The
|
|
5
|
+
* default base URL is the hosted Unfairly app; self-hosters override it.
|
|
6
|
+
*
|
|
7
|
+
* The returned client is fluent-ish: `client.vault("slug").search(...)`
|
|
8
|
+
* mirrors how the MCP tools read in the wild. Stays HTTP-only — there's
|
|
9
|
+
* no Supabase or admin client in this package. Server work happens at
|
|
10
|
+
* `/api/sdk/v1/*` and reuses the shared `src/lib/vault/*` helpers.
|
|
11
|
+
*/
|
|
12
|
+
import { type FetchLike, type TransportFn } from "./transport.js";
|
|
13
|
+
import { makeVaultSearch } from "./vault/search.js";
|
|
14
|
+
import { makeVaultRead } from "./vault/read.js";
|
|
15
|
+
import { makeVaultCheckpoint } from "./vault/checkpoint.js";
|
|
16
|
+
import { makeEmit } from "./events/emit.js";
|
|
17
|
+
import type { MeResponse } from "./types/index.js";
|
|
18
|
+
export type UnfairlyClientOptions = {
|
|
19
|
+
/** MCP token (`mcp_xxx...`). Falls back to `process.env.UNFAIRLY_API_KEY`. */
|
|
20
|
+
apiKey?: string;
|
|
21
|
+
/** Override the API base URL (self-hosted / preview). */
|
|
22
|
+
baseUrl?: string;
|
|
23
|
+
/** Optional fetch impl override (mostly for tests). */
|
|
24
|
+
fetchImpl?: FetchLike;
|
|
25
|
+
/** Per-request timeout in ms. Default 30s. */
|
|
26
|
+
timeoutMs?: number;
|
|
27
|
+
};
|
|
28
|
+
export type VaultClient = {
|
|
29
|
+
search: ReturnType<typeof makeVaultSearch>;
|
|
30
|
+
readDocument: ReturnType<typeof makeVaultRead>;
|
|
31
|
+
checkpoint: ReturnType<typeof makeVaultCheckpoint>;
|
|
32
|
+
};
|
|
33
|
+
export type UnfairlyClient = {
|
|
34
|
+
/** Identify the token owner + the vaults you can reach. */
|
|
35
|
+
me(): Promise<MeResponse>;
|
|
36
|
+
/** Per-vault scoped helpers. */
|
|
37
|
+
vault(slug: string): VaultClient;
|
|
38
|
+
/** Emit a closed-allowlist event into the Unfairly Inngest queue. */
|
|
39
|
+
event: {
|
|
40
|
+
emit: ReturnType<typeof makeEmit>;
|
|
41
|
+
};
|
|
42
|
+
/** Escape hatch for callers that need to call an arbitrary route. */
|
|
43
|
+
raw: TransportFn;
|
|
44
|
+
};
|
|
45
|
+
export declare function createUnfairlyClient(opts?: UnfairlyClientOptions): UnfairlyClient;
|
|
46
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAmB,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,MAAM,MAAM,qBAAqB,GAAG;IAClC,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;IAC3C,YAAY,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;IAC/C,UAAU,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,2DAA2D;IAC3D,EAAE,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1B,gCAAgC;IAChC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IACjC,qEAAqE;IACrE,KAAK,EAAE;QAAE,IAAI,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAA;KAAE,CAAC;IAC7C,qEAAqE;IACrE,GAAG,EAAE,WAAW,CAAC;CAClB,CAAC;AAyBF,wBAAgB,oBAAoB,CAClC,IAAI,GAAE,qBAA0B,GAC/B,cAAc,CA0BhB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `createUnfairlyClient` — public factory for the agent runtime SDK.
|
|
3
|
+
*
|
|
4
|
+
* Resolves API base URL + token from explicit options or env vars. The
|
|
5
|
+
* default base URL is the hosted Unfairly app; self-hosters override it.
|
|
6
|
+
*
|
|
7
|
+
* The returned client is fluent-ish: `client.vault("slug").search(...)`
|
|
8
|
+
* mirrors how the MCP tools read in the wild. Stays HTTP-only — there's
|
|
9
|
+
* no Supabase or admin client in this package. Server work happens at
|
|
10
|
+
* `/api/sdk/v1/*` and reuses the shared `src/lib/vault/*` helpers.
|
|
11
|
+
*/
|
|
12
|
+
import { createTransport } from "./transport.js";
|
|
13
|
+
import { makeVaultSearch } from "./vault/search.js";
|
|
14
|
+
import { makeVaultRead } from "./vault/read.js";
|
|
15
|
+
import { makeVaultCheckpoint } from "./vault/checkpoint.js";
|
|
16
|
+
import { makeEmit } from "./events/emit.js";
|
|
17
|
+
const DEFAULT_BASE_URL = "https://app.unfairly.ai";
|
|
18
|
+
function resolveApiKey(opts) {
|
|
19
|
+
const key = opts.apiKey ??
|
|
20
|
+
(typeof process !== "undefined" && process.env
|
|
21
|
+
? process.env.UNFAIRLY_API_KEY ?? process.env.UNFAIRLY_MCP_TOKEN
|
|
22
|
+
: undefined);
|
|
23
|
+
if (!key) {
|
|
24
|
+
throw new Error("unfairly: missing apiKey. Pass `{ apiKey }` or set UNFAIRLY_API_KEY in your environment.");
|
|
25
|
+
}
|
|
26
|
+
return key;
|
|
27
|
+
}
|
|
28
|
+
function resolveBaseUrl(opts) {
|
|
29
|
+
return (opts.baseUrl ??
|
|
30
|
+
(typeof process !== "undefined" && process.env
|
|
31
|
+
? process.env.UNFAIRLY_BASE_URL ?? DEFAULT_BASE_URL
|
|
32
|
+
: DEFAULT_BASE_URL));
|
|
33
|
+
}
|
|
34
|
+
export function createUnfairlyClient(opts = {}) {
|
|
35
|
+
const apiKey = resolveApiKey(opts);
|
|
36
|
+
const baseUrl = resolveBaseUrl(opts);
|
|
37
|
+
const request = createTransport({
|
|
38
|
+
apiKey,
|
|
39
|
+
baseUrl,
|
|
40
|
+
fetchImpl: opts.fetchImpl,
|
|
41
|
+
timeoutMs: opts.timeoutMs,
|
|
42
|
+
});
|
|
43
|
+
const emit = makeEmit(request);
|
|
44
|
+
return {
|
|
45
|
+
me: () => request({
|
|
46
|
+
method: "GET",
|
|
47
|
+
path: "/api/sdk/v1/me",
|
|
48
|
+
}),
|
|
49
|
+
vault: (slug) => ({
|
|
50
|
+
search: makeVaultSearch(request, slug),
|
|
51
|
+
readDocument: makeVaultRead(request, slug),
|
|
52
|
+
checkpoint: makeVaultCheckpoint(request, slug),
|
|
53
|
+
}),
|
|
54
|
+
event: { emit },
|
|
55
|
+
raw: request,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,eAAe,EAAoC,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,MAAM,gBAAgB,GAAG,yBAAyB,CAAC;AA8BnD,SAAS,aAAa,CAAC,IAA2B;IAChD,MAAM,GAAG,GACP,IAAI,CAAC,MAAM;QACX,CAAC,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG;YAC5C,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB;YAChE,CAAC,CAAC,SAAS,CAAC,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,0FAA0F,CAC3F,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAC,IAA2B;IACjD,OAAO,CACL,IAAI,CAAC,OAAO;QACZ,CAAC,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG;YAC5C,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,gBAAgB;YACnD,CAAC,CAAC,gBAAgB,CAAC,CACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,OAA8B,EAAE;IAEhC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,eAAe,CAAC;QAC9B,MAAM;QACN,OAAO;QACP,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE/B,OAAO;QACL,EAAE,EAAE,GAAG,EAAE,CACP,OAAO,CAAa;YAClB,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,gBAAgB;SACvB,CAAC;QACJ,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC;YACxB,MAAM,EAAE,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC;YACtC,YAAY,EAAE,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC;YAC1C,UAAU,EAAE,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC;SAC/C,CAAC;QACF,KAAK,EAAE,EAAE,IAAI,EAAE;QACf,GAAG,EAAE,OAAO;KACb,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { TransportFn } from "../transport.js";
|
|
2
|
+
import { ALLOWED_EVENT_NAMES, EVENT_PAYLOAD_SCHEMAS, type AllowedEventName, type EventPayload } from "../types/index.js";
|
|
3
|
+
export { ALLOWED_EVENT_NAMES, EVENT_PAYLOAD_SCHEMAS, type AllowedEventName, type EventPayload, };
|
|
4
|
+
export type EmitResult = {
|
|
5
|
+
ok: true;
|
|
6
|
+
event_id?: string;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Emit a closed-allowlist event to the Unfairly events surface.
|
|
10
|
+
*
|
|
11
|
+
* Client-side validation matches the server's zod schema so callers get
|
|
12
|
+
* a synchronous error before the network round-trip. The server still
|
|
13
|
+
* validates — never trust the client — but this saves a round-trip on
|
|
14
|
+
* dev typos.
|
|
15
|
+
*/
|
|
16
|
+
export declare function makeEmit(request: TransportFn): <E extends AllowedEventName>(event: E, data: EventPayload<E>) => Promise<EmitResult>;
|
|
17
|
+
//# sourceMappingURL=emit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../../src/lib/events/emit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,gBAAgB,EACrB,KAAK,YAAY,GAClB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,WAAW,IAChB,CAAC,SAAS,gBAAgB,EACnD,OAAO,CAAC,EACR,MAAM,YAAY,CAAC,CAAC,CAAC,KACpB,OAAO,CAAC,UAAU,CAAC,CAmBvB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ALLOWED_EVENT_NAMES, EVENT_PAYLOAD_SCHEMAS, } from "../types/index.js";
|
|
2
|
+
export { ALLOWED_EVENT_NAMES, EVENT_PAYLOAD_SCHEMAS, };
|
|
3
|
+
/**
|
|
4
|
+
* Emit a closed-allowlist event to the Unfairly events surface.
|
|
5
|
+
*
|
|
6
|
+
* Client-side validation matches the server's zod schema so callers get
|
|
7
|
+
* a synchronous error before the network round-trip. The server still
|
|
8
|
+
* validates — never trust the client — but this saves a round-trip on
|
|
9
|
+
* dev typos.
|
|
10
|
+
*/
|
|
11
|
+
export function makeEmit(request) {
|
|
12
|
+
return async function emit(event, data) {
|
|
13
|
+
if (!ALLOWED_EVENT_NAMES.includes(event)) {
|
|
14
|
+
throw new Error(`unfairly: unknown event "${event}". Allowed: ${ALLOWED_EVENT_NAMES.join(", ")}`);
|
|
15
|
+
}
|
|
16
|
+
const schema = EVENT_PAYLOAD_SCHEMAS[event];
|
|
17
|
+
const parsed = schema.safeParse(data);
|
|
18
|
+
if (!parsed.success) {
|
|
19
|
+
throw new Error(`unfairly: invalid payload for "${event}": ${JSON.stringify(parsed.error.flatten())}`);
|
|
20
|
+
}
|
|
21
|
+
return request({
|
|
22
|
+
method: "POST",
|
|
23
|
+
path: "/api/sdk/v1/events/emit",
|
|
24
|
+
body: { event, data: parsed.data },
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=emit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../../../src/lib/events/emit.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GAGtB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GAGtB,CAAC;AAIF;;;;;;;GAOG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAoB;IAC3C,OAAO,KAAK,UAAU,IAAI,CACxB,KAAQ,EACR,IAAqB;QAErB,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CACb,4BAA4B,KAAK,eAAe,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACjF,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,kCAAkC,KAAK,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CACtF,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAa;YACzB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,yBAAyB;YAC/B,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;SACnC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `unfairly` package library surface.
|
|
3
|
+
*
|
|
4
|
+
* Anything exported here is part of the public API contract. Keep this
|
|
5
|
+
* file curated — internal helpers (transport internals, CLI prompts)
|
|
6
|
+
* are NOT exported even though they live in this package.
|
|
7
|
+
*/
|
|
8
|
+
export { createUnfairlyClient } from "./client.js";
|
|
9
|
+
export type { UnfairlyClient, UnfairlyClientOptions, VaultClient, } from "./client.js";
|
|
10
|
+
export { ALLOWED_EVENT_NAMES, EVENT_PAYLOAD_SCHEMAS, } from "./types/index.js";
|
|
11
|
+
export type { AllowedEventName, EventPayload, CheckpointInput, CheckpointResult, TrustTier, SearchHit, SearchDocumentSummary, SearchResponse, VaultDocument, MeResponse, SdkErrorBody, } from "./types/index.js";
|
|
12
|
+
export { UnfairlyApiError } from "./transport.js";
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,WAAW,GACZ,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,qBAAqB,EACrB,cAAc,EACd,aAAa,EACb,UAAU,EACV,YAAY,GACb,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `unfairly` package library surface.
|
|
3
|
+
*
|
|
4
|
+
* Anything exported here is part of the public API contract. Keep this
|
|
5
|
+
* file curated — internal helpers (transport internals, CLI prompts)
|
|
6
|
+
* are NOT exported even though they live in this package.
|
|
7
|
+
*/
|
|
8
|
+
export { createUnfairlyClient } from "./client.js";
|
|
9
|
+
export { ALLOWED_EVENT_NAMES, EVENT_PAYLOAD_SCHEMAS, } from "./types/index.js";
|
|
10
|
+
export { UnfairlyApiError } from "./transport.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAOnD,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAe1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP transport for the SDK.
|
|
3
|
+
*
|
|
4
|
+
* Stays intentionally tiny: builds a request, hits the Unfairly REST
|
|
5
|
+
* surface, parses JSON, throws a typed `UnfairlyApiError` on non-2xx.
|
|
6
|
+
*
|
|
7
|
+
* The `fetchImpl` override exists so tests can drop a fake fetch in
|
|
8
|
+
* without monkey-patching globalThis. Don't bake msw in here — keep this
|
|
9
|
+
* runtime-agnostic so the SDK works in Node, Bun, edge runtimes, etc.
|
|
10
|
+
*
|
|
11
|
+
* Token redaction: we never log the bearer token. The shape we log is
|
|
12
|
+
* `{ length, last4 }` only — see `redactToken`.
|
|
13
|
+
*/
|
|
14
|
+
import type { SdkErrorBody } from "./types/index.js";
|
|
15
|
+
export type FetchLike = typeof fetch;
|
|
16
|
+
export type TransportOptions = {
|
|
17
|
+
baseUrl: string;
|
|
18
|
+
apiKey: string;
|
|
19
|
+
fetchImpl?: FetchLike;
|
|
20
|
+
/** Per-request timeout in ms. Default 30s. */
|
|
21
|
+
timeoutMs?: number;
|
|
22
|
+
/** Optional User-Agent override; defaults to `unfairly/<version>`. */
|
|
23
|
+
userAgent?: string;
|
|
24
|
+
};
|
|
25
|
+
export declare class UnfairlyApiError extends Error {
|
|
26
|
+
readonly status: number;
|
|
27
|
+
readonly body: SdkErrorBody | {
|
|
28
|
+
raw: string;
|
|
29
|
+
};
|
|
30
|
+
constructor(status: number, body: SdkErrorBody | {
|
|
31
|
+
raw: string;
|
|
32
|
+
}, message?: string);
|
|
33
|
+
}
|
|
34
|
+
export declare function redactToken(token: string): {
|
|
35
|
+
length: number;
|
|
36
|
+
last4: string;
|
|
37
|
+
};
|
|
38
|
+
export type RequestOptions = {
|
|
39
|
+
method?: "GET" | "POST" | "PUT" | "DELETE";
|
|
40
|
+
path: string;
|
|
41
|
+
body?: unknown;
|
|
42
|
+
query?: Record<string, string | number | boolean | undefined>;
|
|
43
|
+
};
|
|
44
|
+
export declare function createTransport(opts: TransportOptions): <T>(req: RequestOptions) => Promise<T>;
|
|
45
|
+
export type TransportFn = ReturnType<typeof createTransport>;
|
|
46
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/lib/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC;AAErC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;gBAElC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,OAAO,CAAC,EAAE,MAAM;CAMnF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAK5E;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;CAC/D,CAAC;AAEF,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,IAWtB,CAAC,EAAE,KAAK,cAAc,KAAG,OAAO,CAAC,CAAC,CAAC,CAiDlE;AAED,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP transport for the SDK.
|
|
3
|
+
*
|
|
4
|
+
* Stays intentionally tiny: builds a request, hits the Unfairly REST
|
|
5
|
+
* surface, parses JSON, throws a typed `UnfairlyApiError` on non-2xx.
|
|
6
|
+
*
|
|
7
|
+
* The `fetchImpl` override exists so tests can drop a fake fetch in
|
|
8
|
+
* without monkey-patching globalThis. Don't bake msw in here — keep this
|
|
9
|
+
* runtime-agnostic so the SDK works in Node, Bun, edge runtimes, etc.
|
|
10
|
+
*
|
|
11
|
+
* Token redaction: we never log the bearer token. The shape we log is
|
|
12
|
+
* `{ length, last4 }` only — see `redactToken`.
|
|
13
|
+
*/
|
|
14
|
+
export class UnfairlyApiError extends Error {
|
|
15
|
+
status;
|
|
16
|
+
body;
|
|
17
|
+
constructor(status, body, message) {
|
|
18
|
+
super(message ?? (("error" in body && body.error) || `Request failed (${status})`));
|
|
19
|
+
this.name = "UnfairlyApiError";
|
|
20
|
+
this.status = status;
|
|
21
|
+
this.body = body;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function redactToken(token) {
|
|
25
|
+
return {
|
|
26
|
+
length: token.length,
|
|
27
|
+
last4: token.slice(-4),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function createTransport(opts) {
|
|
31
|
+
const fetchImpl = opts.fetchImpl ?? globalThis.fetch;
|
|
32
|
+
if (!fetchImpl) {
|
|
33
|
+
throw new Error("unfairly: no fetch implementation found. Pass `fetchImpl` or run on Node 18+ / a fetch-capable runtime.");
|
|
34
|
+
}
|
|
35
|
+
const baseUrl = opts.baseUrl.replace(/\/$/, "");
|
|
36
|
+
const timeoutMs = opts.timeoutMs ?? 30_000;
|
|
37
|
+
const userAgent = opts.userAgent ?? "unfairly/0.5.0";
|
|
38
|
+
return async function request(req) {
|
|
39
|
+
const url = new URL(baseUrl + req.path);
|
|
40
|
+
if (req.query) {
|
|
41
|
+
for (const [k, v] of Object.entries(req.query)) {
|
|
42
|
+
if (v === undefined)
|
|
43
|
+
continue;
|
|
44
|
+
url.searchParams.set(k, String(v));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const controller = new AbortController();
|
|
48
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
49
|
+
let res;
|
|
50
|
+
try {
|
|
51
|
+
res = await fetchImpl(url.toString(), {
|
|
52
|
+
method: req.method ?? "GET",
|
|
53
|
+
headers: {
|
|
54
|
+
Authorization: `Bearer ${opts.apiKey}`,
|
|
55
|
+
"Content-Type": "application/json",
|
|
56
|
+
Accept: "application/json",
|
|
57
|
+
"User-Agent": userAgent,
|
|
58
|
+
},
|
|
59
|
+
body: req.body === undefined ? undefined : JSON.stringify(req.body),
|
|
60
|
+
signal: controller.signal,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
clearTimeout(timer);
|
|
65
|
+
}
|
|
66
|
+
const text = await res.text();
|
|
67
|
+
let parsed = null;
|
|
68
|
+
if (text) {
|
|
69
|
+
try {
|
|
70
|
+
parsed = JSON.parse(text);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
parsed = { raw: text };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (!res.ok) {
|
|
77
|
+
const body = parsed && typeof parsed === "object"
|
|
78
|
+
? parsed
|
|
79
|
+
: { raw: text };
|
|
80
|
+
throw new UnfairlyApiError(res.status, body);
|
|
81
|
+
}
|
|
82
|
+
return parsed;
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/lib/transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK shared types.
|
|
3
|
+
*
|
|
4
|
+
* `ALLOWED_EVENT_NAMES` is the CLOSED allowlist of events external callers
|
|
5
|
+
* are allowed to emit via `/api/sdk/v1/events/emit`. The server validates
|
|
6
|
+
* incoming events against this same list and per-event payload schema
|
|
7
|
+
* before forwarding to Inngest. Adding an event here without also adding
|
|
8
|
+
* a schema below + an Inngest function on the server side means the event
|
|
9
|
+
* lands in the queue with nobody listening — keep the three in lockstep.
|
|
10
|
+
*
|
|
11
|
+
* Why a closed list: Codex flagged an earlier draft as an "arbitrary
|
|
12
|
+
* event injection" vector. Anything that's not on this list is rejected
|
|
13
|
+
* with a 400, regardless of token scope.
|
|
14
|
+
*/
|
|
15
|
+
import { z } from "zod";
|
|
16
|
+
export declare const ALLOWED_EVENT_NAMES: readonly ["growth-agent/signal.detected", "funding-agent/update.requested", "vault/content.landed"];
|
|
17
|
+
export type AllowedEventName = (typeof ALLOWED_EVENT_NAMES)[number];
|
|
18
|
+
export declare const EVENT_PAYLOAD_SCHEMAS: {
|
|
19
|
+
readonly "growth-agent/signal.detected": z.ZodObject<{
|
|
20
|
+
signal_id: z.ZodString;
|
|
21
|
+
source: z.ZodEnum<["x-listener", "linkedin-listener", "hn-listener", "manual"]>;
|
|
22
|
+
trust_tier: z.ZodEnum<["gold", "silver", "bronze"]>;
|
|
23
|
+
dedupe_key: z.ZodString;
|
|
24
|
+
payload: z.ZodObject<{
|
|
25
|
+
text: z.ZodString;
|
|
26
|
+
blocks: z.ZodOptional<z.ZodArray<z.ZodUnknown, "many">>;
|
|
27
|
+
url: z.ZodOptional<z.ZodString>;
|
|
28
|
+
author: z.ZodOptional<z.ZodString>;
|
|
29
|
+
}, "strip", z.ZodTypeAny, {
|
|
30
|
+
text: string;
|
|
31
|
+
url?: string | undefined;
|
|
32
|
+
blocks?: unknown[] | undefined;
|
|
33
|
+
author?: string | undefined;
|
|
34
|
+
}, {
|
|
35
|
+
text: string;
|
|
36
|
+
url?: string | undefined;
|
|
37
|
+
blocks?: unknown[] | undefined;
|
|
38
|
+
author?: string | undefined;
|
|
39
|
+
}>;
|
|
40
|
+
}, "strip", z.ZodTypeAny, {
|
|
41
|
+
trust_tier: "gold" | "silver" | "bronze";
|
|
42
|
+
signal_id: string;
|
|
43
|
+
source: "x-listener" | "linkedin-listener" | "hn-listener" | "manual";
|
|
44
|
+
dedupe_key: string;
|
|
45
|
+
payload: {
|
|
46
|
+
text: string;
|
|
47
|
+
url?: string | undefined;
|
|
48
|
+
blocks?: unknown[] | undefined;
|
|
49
|
+
author?: string | undefined;
|
|
50
|
+
};
|
|
51
|
+
}, {
|
|
52
|
+
trust_tier: "gold" | "silver" | "bronze";
|
|
53
|
+
signal_id: string;
|
|
54
|
+
source: "x-listener" | "linkedin-listener" | "hn-listener" | "manual";
|
|
55
|
+
dedupe_key: string;
|
|
56
|
+
payload: {
|
|
57
|
+
text: string;
|
|
58
|
+
url?: string | undefined;
|
|
59
|
+
blocks?: unknown[] | undefined;
|
|
60
|
+
author?: string | undefined;
|
|
61
|
+
};
|
|
62
|
+
}>;
|
|
63
|
+
readonly "funding-agent/update.requested": z.ZodObject<{
|
|
64
|
+
vault_slug: z.ZodString;
|
|
65
|
+
window: z.ZodDefault<z.ZodEnum<["7d", "14d", "30d"]>>;
|
|
66
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
67
|
+
}, "strip", z.ZodTypeAny, {
|
|
68
|
+
vault_slug: string;
|
|
69
|
+
window: "7d" | "14d" | "30d";
|
|
70
|
+
reason?: string | undefined;
|
|
71
|
+
}, {
|
|
72
|
+
vault_slug: string;
|
|
73
|
+
window?: "7d" | "14d" | "30d" | undefined;
|
|
74
|
+
reason?: string | undefined;
|
|
75
|
+
}>;
|
|
76
|
+
readonly "vault/content.landed": z.ZodObject<{
|
|
77
|
+
vault_slug: z.ZodString;
|
|
78
|
+
document_id: z.ZodString;
|
|
79
|
+
trust_tier: z.ZodEnum<["gold", "silver", "bronze"]>;
|
|
80
|
+
source: z.ZodOptional<z.ZodString>;
|
|
81
|
+
}, "strip", z.ZodTypeAny, {
|
|
82
|
+
trust_tier: "gold" | "silver" | "bronze";
|
|
83
|
+
vault_slug: string;
|
|
84
|
+
document_id: string;
|
|
85
|
+
source?: string | undefined;
|
|
86
|
+
}, {
|
|
87
|
+
trust_tier: "gold" | "silver" | "bronze";
|
|
88
|
+
vault_slug: string;
|
|
89
|
+
document_id: string;
|
|
90
|
+
source?: string | undefined;
|
|
91
|
+
}>;
|
|
92
|
+
};
|
|
93
|
+
export type EventPayload<E extends AllowedEventName> = z.infer<(typeof EVENT_PAYLOAD_SCHEMAS)[E]>;
|
|
94
|
+
/**
|
|
95
|
+
* Checkpoint write payload. Intentionally OMITS `actor_email` /
|
|
96
|
+
* `actor_kind`: the server derives identity from the token owner. The
|
|
97
|
+
* SDK route rejects request bodies that include those fields.
|
|
98
|
+
*/
|
|
99
|
+
export type CheckpointInput = {
|
|
100
|
+
built: string;
|
|
101
|
+
decided: string;
|
|
102
|
+
broken?: string;
|
|
103
|
+
next?: string;
|
|
104
|
+
host?: "claude-code" | "codex" | "other";
|
|
105
|
+
files?: string[];
|
|
106
|
+
open_questions?: string;
|
|
107
|
+
session_id?: string;
|
|
108
|
+
low_signal?: boolean;
|
|
109
|
+
};
|
|
110
|
+
export type CheckpointResult = {
|
|
111
|
+
id: string;
|
|
112
|
+
created_at: string;
|
|
113
|
+
};
|
|
114
|
+
export type TrustTier = "gold" | "silver" | "bronze";
|
|
115
|
+
export type SearchHit = {
|
|
116
|
+
id: string;
|
|
117
|
+
document_id: string;
|
|
118
|
+
room_id: string;
|
|
119
|
+
content: string;
|
|
120
|
+
similarity: number;
|
|
121
|
+
};
|
|
122
|
+
export type SearchDocumentSummary = {
|
|
123
|
+
id: string;
|
|
124
|
+
name: string;
|
|
125
|
+
slug: string | null;
|
|
126
|
+
trust_tier: TrustTier | string;
|
|
127
|
+
room_id: string;
|
|
128
|
+
section_name: string | null;
|
|
129
|
+
};
|
|
130
|
+
export type SearchResponse = {
|
|
131
|
+
hits: SearchHit[];
|
|
132
|
+
documents: SearchDocumentSummary[];
|
|
133
|
+
};
|
|
134
|
+
export type VaultDocument = {
|
|
135
|
+
id: string;
|
|
136
|
+
room_id: string;
|
|
137
|
+
name: string;
|
|
138
|
+
slug: string | null;
|
|
139
|
+
trust_tier: TrustTier | string;
|
|
140
|
+
summary: string | null;
|
|
141
|
+
markdown_content: string | null;
|
|
142
|
+
file_url: string | null;
|
|
143
|
+
section_id: string | null;
|
|
144
|
+
section_name: string | null;
|
|
145
|
+
};
|
|
146
|
+
export type MeResponse = {
|
|
147
|
+
ok: true;
|
|
148
|
+
token_owner: {
|
|
149
|
+
user_id: string;
|
|
150
|
+
email: string;
|
|
151
|
+
kind: "human" | "agent" | "connector";
|
|
152
|
+
};
|
|
153
|
+
vaults: Array<{
|
|
154
|
+
id: string;
|
|
155
|
+
slug: string;
|
|
156
|
+
name: string;
|
|
157
|
+
role: string;
|
|
158
|
+
}>;
|
|
159
|
+
};
|
|
160
|
+
export type SdkErrorBody = {
|
|
161
|
+
ok: false;
|
|
162
|
+
error: string;
|
|
163
|
+
message?: string;
|
|
164
|
+
details?: unknown;
|
|
165
|
+
allowed?: readonly string[];
|
|
166
|
+
};
|
|
167
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK shared types.
|
|
3
|
+
*
|
|
4
|
+
* `ALLOWED_EVENT_NAMES` is the CLOSED allowlist of events external callers
|
|
5
|
+
* are allowed to emit via `/api/sdk/v1/events/emit`. The server validates
|
|
6
|
+
* incoming events against this same list and per-event payload schema
|
|
7
|
+
* before forwarding to Inngest. Adding an event here without also adding
|
|
8
|
+
* a schema below + an Inngest function on the server side means the event
|
|
9
|
+
* lands in the queue with nobody listening — keep the three in lockstep.
|
|
10
|
+
*
|
|
11
|
+
* Why a closed list: Codex flagged an earlier draft as an "arbitrary
|
|
12
|
+
* event injection" vector. Anything that's not on this list is rejected
|
|
13
|
+
* with a 400, regardless of token scope.
|
|
14
|
+
*/
|
|
15
|
+
import { z } from "zod";
|
|
16
|
+
export const ALLOWED_EVENT_NAMES = [
|
|
17
|
+
"growth-agent/signal.detected",
|
|
18
|
+
"funding-agent/update.requested",
|
|
19
|
+
"vault/content.landed",
|
|
20
|
+
];
|
|
21
|
+
// Source of truth for the growth-agent signal payload shape.
|
|
22
|
+
const GrowthSignalPayloadSchema = z.object({
|
|
23
|
+
signal_id: z.string().min(1).max(100),
|
|
24
|
+
source: z.enum(["x-listener", "linkedin-listener", "hn-listener", "manual"]),
|
|
25
|
+
trust_tier: z.enum(["gold", "silver", "bronze"]),
|
|
26
|
+
dedupe_key: z.string().min(1).max(200),
|
|
27
|
+
payload: z.object({
|
|
28
|
+
text: z.string().max(5000),
|
|
29
|
+
blocks: z.array(z.unknown()).max(50).optional(),
|
|
30
|
+
url: z.string().url().optional(),
|
|
31
|
+
author: z.string().max(200).optional(),
|
|
32
|
+
}),
|
|
33
|
+
});
|
|
34
|
+
const FundingUpdateRequestedSchema = z.object({
|
|
35
|
+
vault_slug: z.string().min(1).max(120),
|
|
36
|
+
window: z.enum(["7d", "14d", "30d"]).default("7d"),
|
|
37
|
+
reason: z.string().max(500).optional(),
|
|
38
|
+
});
|
|
39
|
+
const VaultContentLandedSchema = z.object({
|
|
40
|
+
vault_slug: z.string().min(1).max(120),
|
|
41
|
+
document_id: z.string().min(1).max(120),
|
|
42
|
+
trust_tier: z.enum(["gold", "silver", "bronze"]),
|
|
43
|
+
source: z.string().max(200).optional(),
|
|
44
|
+
});
|
|
45
|
+
export const EVENT_PAYLOAD_SCHEMAS = {
|
|
46
|
+
"growth-agent/signal.detected": GrowthSignalPayloadSchema,
|
|
47
|
+
"funding-agent/update.requested": FundingUpdateRequestedSchema,
|
|
48
|
+
"vault/content.landed": VaultContentLandedSchema,
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/types/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,8BAA8B;IAC9B,gCAAgC;IAChC,sBAAsB;CACd,CAAC;AAIX,6DAA6D;AAC7D,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACrC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;IAC5E,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;QAC/C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;KACvC,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACtC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IAClD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACtC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACvC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,8BAA8B,EAAE,yBAAyB;IACzD,gCAAgC,EAAE,4BAA4B;IAC9D,sBAAsB,EAAE,wBAAwB;CACS,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { TransportFn } from "../transport.js";
|
|
2
|
+
import type { CheckpointInput, CheckpointResult } from "../types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Save a checkpoint to the vault.
|
|
5
|
+
*
|
|
6
|
+
* `actor_email` and `actor_kind` are intentionally not part of
|
|
7
|
+
* `CheckpointInput`. The server derives identity from the bearer token
|
|
8
|
+
* owner; supplying those fields in the request body is a no-op at best
|
|
9
|
+
* and rejected at worst.
|
|
10
|
+
*/
|
|
11
|
+
export declare function makeVaultCheckpoint(request: TransportFn, slug: string): (input: CheckpointInput) => Promise<CheckpointResult>;
|
|
12
|
+
//# sourceMappingURL=checkpoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint.d.ts","sourceRoot":"","sources":["../../../src/lib/vault/checkpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE3E;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,IACnC,OAAO,eAAe,KAAG,OAAO,CAAC,gBAAgB,CAAC,CAOpF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Save a checkpoint to the vault.
|
|
3
|
+
*
|
|
4
|
+
* `actor_email` and `actor_kind` are intentionally not part of
|
|
5
|
+
* `CheckpointInput`. The server derives identity from the bearer token
|
|
6
|
+
* owner; supplying those fields in the request body is a no-op at best
|
|
7
|
+
* and rejected at worst.
|
|
8
|
+
*/
|
|
9
|
+
export function makeVaultCheckpoint(request, slug) {
|
|
10
|
+
return async function checkpoint(input) {
|
|
11
|
+
return request({
|
|
12
|
+
method: "POST",
|
|
13
|
+
path: `/api/sdk/v1/vault/${encodeURIComponent(slug)}/checkpoint`,
|
|
14
|
+
body: input,
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=checkpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../../src/lib/vault/checkpoint.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAoB,EAAE,IAAY;IACpE,OAAO,KAAK,UAAU,UAAU,CAAC,KAAsB;QACrD,OAAO,OAAO,CAAmB;YAC/B,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,qBAAqB,kBAAkB,CAAC,IAAI,CAAC,aAAa;YAChE,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../src/lib/vault/read.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,IAC3B,YAAY,MAAM,KAAG,OAAO,CAAC,aAAa,CAAC,CAM/E"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function makeVaultRead(request, slug) {
|
|
2
|
+
return async function readDocument(nameOrSlug) {
|
|
3
|
+
return request({
|
|
4
|
+
method: "GET",
|
|
5
|
+
path: `/api/sdk/v1/vault/${encodeURIComponent(slug)}/documents/${encodeURIComponent(nameOrSlug)}`,
|
|
6
|
+
});
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/lib/vault/read.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,aAAa,CAAC,OAAoB,EAAE,IAAY;IAC9D,OAAO,KAAK,UAAU,YAAY,CAAC,UAAkB;QACnD,OAAO,OAAO,CAAgB;YAC5B,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,qBAAqB,kBAAkB,CAAC,IAAI,CAAC,cAAc,kBAAkB,CAAC,UAAU,CAAC,EAAE;SAClG,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|