@indigoai-us/hq-cloud 5.19.0 → 5.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +8 -4
- package/.github/workflows/publish.yml +9 -3
- package/dist/bin/sync-runner.d.ts +9 -0
- package/dist/bin/sync-runner.d.ts.map +1 -1
- package/dist/bin/sync-runner.js +58 -0
- package/dist/bin/sync-runner.js.map +1 -1
- package/dist/client-info.d.ts +44 -0
- package/dist/client-info.d.ts.map +1 -0
- package/dist/client-info.js +112 -0
- package/dist/client-info.js.map +1 -0
- package/dist/client-info.test.d.ts +11 -0
- package/dist/client-info.test.d.ts.map +1 -0
- package/dist/client-info.test.js +168 -0
- package/dist/client-info.test.js.map +1 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +10 -2
- package/dist/context.js.map +1 -1
- package/dist/entity-resolver.d.ts +48 -0
- package/dist/entity-resolver.d.ts.map +1 -0
- package/dist/entity-resolver.js +122 -0
- package/dist/entity-resolver.js.map +1 -0
- package/dist/entity-resolver.test.d.ts +10 -0
- package/dist/entity-resolver.test.d.ts.map +1 -0
- package/dist/entity-resolver.test.js +236 -0
- package/dist/entity-resolver.test.js.map +1 -0
- package/dist/index.d.ts +20 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -1
- package/dist/schemas/signal-types.d.ts +16 -0
- package/dist/schemas/signal-types.d.ts.map +1 -0
- package/dist/schemas/signal-types.js +30 -0
- package/dist/schemas/signal-types.js.map +1 -0
- package/dist/schemas/signal-types.test.d.ts +2 -0
- package/dist/schemas/signal-types.test.d.ts.map +1 -0
- package/dist/schemas/signal-types.test.js +65 -0
- package/dist/schemas/signal-types.test.js.map +1 -0
- package/dist/schemas/source-channels.d.ts +15 -0
- package/dist/schemas/source-channels.d.ts.map +1 -0
- package/dist/schemas/source-channels.js +28 -0
- package/dist/schemas/source-channels.js.map +1 -0
- package/dist/schemas/source-channels.test.d.ts +2 -0
- package/dist/schemas/source-channels.test.d.ts.map +1 -0
- package/dist/schemas/source-channels.test.js +65 -0
- package/dist/schemas/source-channels.test.js.map +1 -0
- package/dist/signals/get.d.ts +13 -0
- package/dist/signals/get.d.ts.map +1 -0
- package/dist/signals/get.js +74 -0
- package/dist/signals/get.js.map +1 -0
- package/dist/signals/get.test.d.ts +5 -0
- package/dist/signals/get.test.d.ts.map +1 -0
- package/dist/signals/get.test.js +170 -0
- package/dist/signals/get.test.js.map +1 -0
- package/dist/signals/internals.d.ts +16 -0
- package/dist/signals/internals.d.ts.map +1 -0
- package/dist/signals/internals.js +39 -0
- package/dist/signals/internals.js.map +1 -0
- package/dist/signals/list.d.ts +10 -0
- package/dist/signals/list.d.ts.map +1 -0
- package/dist/signals/list.js +76 -0
- package/dist/signals/list.js.map +1 -0
- package/dist/signals/list.test.d.ts +9 -0
- package/dist/signals/list.test.d.ts.map +1 -0
- package/dist/signals/list.test.js +227 -0
- package/dist/signals/list.test.js.map +1 -0
- package/dist/signals/parse.d.ts +8 -0
- package/dist/signals/parse.d.ts.map +1 -0
- package/dist/signals/parse.js +8 -0
- package/dist/signals/parse.js.map +1 -0
- package/dist/signals/types.d.ts +69 -0
- package/dist/signals/types.d.ts.map +1 -0
- package/dist/signals/types.js +10 -0
- package/dist/signals/types.js.map +1 -0
- package/dist/sources/get.d.ts +11 -0
- package/dist/sources/get.d.ts.map +1 -0
- package/dist/sources/get.js +67 -0
- package/dist/sources/get.js.map +1 -0
- package/dist/sources/get.test.d.ts +5 -0
- package/dist/sources/get.test.d.ts.map +1 -0
- package/dist/sources/get.test.js +132 -0
- package/dist/sources/get.test.js.map +1 -0
- package/dist/sources/internals.d.ts +16 -0
- package/dist/sources/internals.d.ts.map +1 -0
- package/dist/sources/internals.js +39 -0
- package/dist/sources/internals.js.map +1 -0
- package/dist/sources/list.d.ts +10 -0
- package/dist/sources/list.d.ts.map +1 -0
- package/dist/sources/list.js +76 -0
- package/dist/sources/list.js.map +1 -0
- package/dist/sources/list.test.d.ts +8 -0
- package/dist/sources/list.test.d.ts.map +1 -0
- package/dist/sources/list.test.js +198 -0
- package/dist/sources/list.test.js.map +1 -0
- package/dist/sources/parse.d.ts +18 -0
- package/dist/sources/parse.d.ts.map +1 -0
- package/dist/sources/parse.js +35 -0
- package/dist/sources/parse.js.map +1 -0
- package/dist/sources/types.d.ts +62 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/sources/types.js +8 -0
- package/dist/sources/types.js.map +1 -0
- package/dist/telemetry.d.ts +87 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +349 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/telemetry.test.d.ts +11 -0
- package/dist/telemetry.test.d.ts.map +1 -0
- package/dist/telemetry.test.js +309 -0
- package/dist/telemetry.test.js.map +1 -0
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/vault-client.d.ts +60 -0
- package/dist/vault-client.d.ts.map +1 -1
- package/dist/vault-client.js +41 -0
- package/dist/vault-client.js.map +1 -1
- package/package.json +5 -3
- package/src/bin/sync-runner.ts +73 -0
- package/src/client-info.test.ts +214 -0
- package/src/client-info.ts +121 -0
- package/src/context.ts +10 -2
- package/src/entity-resolver.test.ts +307 -0
- package/src/entity-resolver.ts +173 -0
- package/src/index.ts +91 -0
- package/src/schemas/signal-types.test.ts +82 -0
- package/src/schemas/signal-types.ts +38 -0
- package/src/schemas/source-channels.test.ts +82 -0
- package/src/schemas/source-channels.ts +36 -0
- package/src/signals/get.test.ts +204 -0
- package/src/signals/get.ts +79 -0
- package/src/signals/internals.ts +46 -0
- package/src/signals/list.test.ts +283 -0
- package/src/signals/list.ts +92 -0
- package/src/signals/parse.ts +8 -0
- package/src/signals/types.ts +74 -0
- package/src/sources/get.test.ts +166 -0
- package/src/sources/get.ts +75 -0
- package/src/sources/internals.ts +46 -0
- package/src/sources/list.test.ts +247 -0
- package/src/sources/list.ts +95 -0
- package/src/sources/parse.ts +43 -0
- package/src/sources/types.ts +67 -0
- package/src/telemetry.test.ts +394 -0
- package/src/telemetry.ts +436 -0
- package/src/types.ts +23 -0
- package/src/vault-client.ts +91 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-types.d.ts","sourceRoot":"","sources":["../../src/schemas/signal-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,YAAY,oFAOd,CAAC;AAEZ,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,SAAkB,IAAI,4BAA4B;gBAEtC,KAAK,EAAE,OAAO;CAK3B;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAI5E"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Signal type schema — single source of truth.
|
|
3
|
+
*
|
|
4
|
+
* Closed enum: the six canonical signal types.
|
|
5
|
+
* assertSignalType is the agent-mitigation lever — prevents LLMs
|
|
6
|
+
* from fabricating signal types.
|
|
7
|
+
*/
|
|
8
|
+
export const SIGNAL_TYPES = Object.freeze([
|
|
9
|
+
"action_item",
|
|
10
|
+
"commitment",
|
|
11
|
+
"decision",
|
|
12
|
+
"key_point",
|
|
13
|
+
"risk",
|
|
14
|
+
"summary",
|
|
15
|
+
]);
|
|
16
|
+
export class InvalidSignalTypeError extends Error {
|
|
17
|
+
name = "InvalidSignalTypeError";
|
|
18
|
+
constructor(value) {
|
|
19
|
+
super(`Invalid signal type: '${String(value)}'. Valid types: ${SIGNAL_TYPES.join(", ")}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function isSignalType(value) {
|
|
23
|
+
return typeof value === "string" && SIGNAL_TYPES.includes(value);
|
|
24
|
+
}
|
|
25
|
+
export function assertSignalType(value) {
|
|
26
|
+
if (!isSignalType(value)) {
|
|
27
|
+
throw new InvalidSignalTypeError(value);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=signal-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-types.js","sourceRoot":"","sources":["../../src/schemas/signal-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;IACxC,aAAa;IACb,YAAY;IACZ,UAAU;IACV,WAAW;IACX,MAAM;IACN,SAAS;CACD,CAAC,CAAC;AAIZ,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC7B,IAAI,GAAG,wBAAwB,CAAC;IAElD,YAAY,KAAc;QACxB,KAAK,CACH,yBAAyB,MAAM,CAAC,KAAK,CAAC,mBAAmB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACnF,CAAC;IACJ,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,YAAkC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-types.test.d.ts","sourceRoot":"","sources":["../../src/schemas/signal-types.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { SIGNAL_TYPES, isSignalType, assertSignalType, InvalidSignalTypeError, } from "./signal-types.js";
|
|
3
|
+
describe("SIGNAL_TYPES", () => {
|
|
4
|
+
it("contains the six canonical types", () => {
|
|
5
|
+
expect([...SIGNAL_TYPES]).toEqual([
|
|
6
|
+
"action_item",
|
|
7
|
+
"commitment",
|
|
8
|
+
"decision",
|
|
9
|
+
"key_point",
|
|
10
|
+
"risk",
|
|
11
|
+
"summary",
|
|
12
|
+
]);
|
|
13
|
+
});
|
|
14
|
+
it("is frozen (readonly at runtime)", () => {
|
|
15
|
+
expect(Object.isFrozen(SIGNAL_TYPES)).toBe(true);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
describe("isSignalType", () => {
|
|
19
|
+
it.each(SIGNAL_TYPES)("returns true for '%s'", (type) => {
|
|
20
|
+
expect(isSignalType(type)).toBe(true);
|
|
21
|
+
});
|
|
22
|
+
it("returns false for an invalid string", () => {
|
|
23
|
+
expect(isSignalType("ramble")).toBe(false);
|
|
24
|
+
});
|
|
25
|
+
it("returns false for non-string values", () => {
|
|
26
|
+
expect(isSignalType(42)).toBe(false);
|
|
27
|
+
expect(isSignalType(null)).toBe(false);
|
|
28
|
+
expect(isSignalType(undefined)).toBe(false);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
describe("assertSignalType", () => {
|
|
32
|
+
it.each(SIGNAL_TYPES)("does not throw for '%s'", (type) => {
|
|
33
|
+
expect(() => assertSignalType(type)).not.toThrow();
|
|
34
|
+
});
|
|
35
|
+
it("throws InvalidSignalTypeError for invalid value", () => {
|
|
36
|
+
expect(() => assertSignalType("ramble")).toThrow(InvalidSignalTypeError);
|
|
37
|
+
});
|
|
38
|
+
it("error message contains the offending value", () => {
|
|
39
|
+
expect(() => assertSignalType("ramble")).toThrow("'ramble'");
|
|
40
|
+
});
|
|
41
|
+
it("error message lists all valid types", () => {
|
|
42
|
+
try {
|
|
43
|
+
assertSignalType("ramble");
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
const msg = err.message;
|
|
47
|
+
for (const type of SIGNAL_TYPES) {
|
|
48
|
+
expect(msg).toContain(type);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
it("error message matches snapshot", () => {
|
|
53
|
+
expect(() => assertSignalType("ramble")).toThrowErrorMatchingInlineSnapshot(`[InvalidSignalTypeError: Invalid signal type: 'ramble'. Valid types: action_item, commitment, decision, key_point, risk, summary]`);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe("SignalType type", () => {
|
|
57
|
+
it("narrows correctly via type guard", () => {
|
|
58
|
+
const value = "action_item";
|
|
59
|
+
if (isSignalType(value)) {
|
|
60
|
+
const _type = value;
|
|
61
|
+
expect(_type).toBe("action_item");
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=signal-types.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-types.test.js","sourceRoot":"","sources":["../../src/schemas/signal-types.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAG3B,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;YAChC,aAAa;YACb,YAAY;YACZ,UAAU;YACV,WAAW;YACX,MAAM;YACN,SAAS;SACV,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,uBAAuB,EAAE,CAAC,IAAI,EAAE,EAAE;QACtD,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,yBAAyB,EAAE,CAAC,IAAI,EAAE,EAAE;QACxD,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,IAAI,CAAC;YACH,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAI,GAAa,CAAC,OAAO,CAAC;YACnC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;gBAChC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,kCAAkC,CACzE,mIAAmI,CACpI,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,KAAK,GAAY,aAAa,CAAC;QACrC,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,KAAK,GAAe,KAAK,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source channel schema — single source of truth.
|
|
3
|
+
*
|
|
4
|
+
* Closed enum: extension requires a code change (PR).
|
|
5
|
+
* Matches the sources-pipeline SourceChannel type.
|
|
6
|
+
*/
|
|
7
|
+
export declare const SOURCE_CHANNELS: readonly ["meeting", "email", "slack", "linear", "notion"];
|
|
8
|
+
export type SourceChannel = (typeof SOURCE_CHANNELS)[number];
|
|
9
|
+
export declare class InvalidSourceChannelError extends Error {
|
|
10
|
+
readonly name = "InvalidSourceChannelError";
|
|
11
|
+
constructor(value: unknown);
|
|
12
|
+
}
|
|
13
|
+
export declare function isSourceChannel(value: unknown): value is SourceChannel;
|
|
14
|
+
export declare function assertSourceChannel(value: unknown): asserts value is SourceChannel;
|
|
15
|
+
//# sourceMappingURL=source-channels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-channels.d.ts","sourceRoot":"","sources":["../../src/schemas/source-channels.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,eAAe,4DAMjB,CAAC;AAEZ,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,SAAkB,IAAI,+BAA+B;gBAEzC,KAAK,EAAE,OAAO;CAK3B;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAEtE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,aAAa,CAIlF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source channel schema — single source of truth.
|
|
3
|
+
*
|
|
4
|
+
* Closed enum: extension requires a code change (PR).
|
|
5
|
+
* Matches the sources-pipeline SourceChannel type.
|
|
6
|
+
*/
|
|
7
|
+
export const SOURCE_CHANNELS = Object.freeze([
|
|
8
|
+
"meeting",
|
|
9
|
+
"email",
|
|
10
|
+
"slack",
|
|
11
|
+
"linear",
|
|
12
|
+
"notion",
|
|
13
|
+
]);
|
|
14
|
+
export class InvalidSourceChannelError extends Error {
|
|
15
|
+
name = "InvalidSourceChannelError";
|
|
16
|
+
constructor(value) {
|
|
17
|
+
super(`Invalid source channel: '${String(value)}'. Valid channels: ${SOURCE_CHANNELS.join(", ")}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function isSourceChannel(value) {
|
|
21
|
+
return typeof value === "string" && SOURCE_CHANNELS.includes(value);
|
|
22
|
+
}
|
|
23
|
+
export function assertSourceChannel(value) {
|
|
24
|
+
if (!isSourceChannel(value)) {
|
|
25
|
+
throw new InvalidSourceChannelError(value);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=source-channels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-channels.js","sourceRoot":"","sources":["../../src/schemas/source-channels.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3C,SAAS;IACT,OAAO;IACP,OAAO;IACP,QAAQ;IACR,QAAQ;CACA,CAAC,CAAC;AAIZ,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAChC,IAAI,GAAG,2BAA2B,CAAC;IAErD,YAAY,KAAc;QACxB,KAAK,CACH,4BAA4B,MAAM,CAAC,KAAK,CAAC,sBAAsB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC5F,CAAC;IACJ,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,eAAqC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,yBAAyB,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-channels.test.d.ts","sourceRoot":"","sources":["../../src/schemas/source-channels.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { SOURCE_CHANNELS, isSourceChannel, assertSourceChannel, InvalidSourceChannelError, } from "./source-channels.js";
|
|
3
|
+
describe("SOURCE_CHANNELS", () => {
|
|
4
|
+
it("contains the five canonical channels", () => {
|
|
5
|
+
expect([...SOURCE_CHANNELS]).toEqual([
|
|
6
|
+
"meeting",
|
|
7
|
+
"email",
|
|
8
|
+
"slack",
|
|
9
|
+
"linear",
|
|
10
|
+
"notion",
|
|
11
|
+
]);
|
|
12
|
+
});
|
|
13
|
+
it("is frozen (readonly at runtime)", () => {
|
|
14
|
+
expect(Object.isFrozen(SOURCE_CHANNELS)).toBe(true);
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
describe("isSourceChannel", () => {
|
|
18
|
+
it.each(SOURCE_CHANNELS)("returns true for '%s'", (channel) => {
|
|
19
|
+
expect(isSourceChannel(channel)).toBe(true);
|
|
20
|
+
});
|
|
21
|
+
it("returns false for an invalid string", () => {
|
|
22
|
+
expect(isSourceChannel("pigeon")).toBe(false);
|
|
23
|
+
});
|
|
24
|
+
it("returns false for non-string values", () => {
|
|
25
|
+
expect(isSourceChannel(42)).toBe(false);
|
|
26
|
+
expect(isSourceChannel(null)).toBe(false);
|
|
27
|
+
expect(isSourceChannel(undefined)).toBe(false);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe("assertSourceChannel", () => {
|
|
31
|
+
it.each(SOURCE_CHANNELS)("does not throw for '%s'", (channel) => {
|
|
32
|
+
expect(() => assertSourceChannel(channel)).not.toThrow();
|
|
33
|
+
});
|
|
34
|
+
it("throws InvalidSourceChannelError for invalid value", () => {
|
|
35
|
+
expect(() => assertSourceChannel("pigeon")).toThrow(InvalidSourceChannelError);
|
|
36
|
+
});
|
|
37
|
+
it("error message contains the offending value", () => {
|
|
38
|
+
expect(() => assertSourceChannel("pigeon")).toThrow("'pigeon'");
|
|
39
|
+
});
|
|
40
|
+
it("error message lists all valid channels", () => {
|
|
41
|
+
try {
|
|
42
|
+
assertSourceChannel("pigeon");
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
const msg = err.message;
|
|
46
|
+
for (const channel of SOURCE_CHANNELS) {
|
|
47
|
+
expect(msg).toContain(channel);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
it("error message matches snapshot", () => {
|
|
52
|
+
expect(() => assertSourceChannel("pigeon")).toThrowErrorMatchingInlineSnapshot(`[InvalidSourceChannelError: Invalid source channel: 'pigeon'. Valid channels: meeting, email, slack, linear, notion]`);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe("SourceChannel type", () => {
|
|
56
|
+
it("narrows correctly via type guard", () => {
|
|
57
|
+
const value = "meeting";
|
|
58
|
+
if (isSourceChannel(value)) {
|
|
59
|
+
// TypeScript narrows to SourceChannel — compile-time check
|
|
60
|
+
const _channel = value;
|
|
61
|
+
expect(_channel).toBe("meeting");
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=source-channels.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-channels.test.js","sourceRoot":"","sources":["../../src/schemas/source-channels.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* getSignal — fetch a single signal document from an entity bucket and
|
|
3
|
+
* return parsed frontmatter + body, with `sourceRef`, `citations`, and
|
|
4
|
+
* `entityRefs` surfaced as typed fields.
|
|
5
|
+
*/
|
|
6
|
+
import type { GetSignalOptions, SignalDocument } from "./types.js";
|
|
7
|
+
export declare class SignalNotFoundError extends Error {
|
|
8
|
+
readonly key: string;
|
|
9
|
+
readonly name = "SignalNotFoundError";
|
|
10
|
+
constructor(key: string);
|
|
11
|
+
}
|
|
12
|
+
export declare function getSignal(opts: GetSignalOptions): Promise<SignalDocument>;
|
|
13
|
+
//# sourceMappingURL=get.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../src/signals/get.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEnE,qBAAa,mBAAoB,SAAQ,KAAK;aAEhB,GAAG,EAAE,MAAM;IADvC,SAAkB,IAAI,yBAAyB;gBACnB,GAAG,EAAE,MAAM;CAGxC;AAkBD,wBAAsB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CA2C/E"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* getSignal — fetch a single signal document from an entity bucket and
|
|
3
|
+
* return parsed frontmatter + body, with `sourceRef`, `citations`, and
|
|
4
|
+
* `entityRefs` surfaced as typed fields.
|
|
5
|
+
*/
|
|
6
|
+
import { GetObjectCommand } from "@aws-sdk/client-s3";
|
|
7
|
+
import { assertSignalType } from "../schemas/signal-types.js";
|
|
8
|
+
import { getS3Client, streamToString } from "./internals.js";
|
|
9
|
+
import { parseMarkdown } from "./parse.js";
|
|
10
|
+
export class SignalNotFoundError extends Error {
|
|
11
|
+
key;
|
|
12
|
+
name = "SignalNotFoundError";
|
|
13
|
+
constructor(key) {
|
|
14
|
+
super(`Signal not found: ${key}`);
|
|
15
|
+
this.key = key;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function isNoSuchKey(err) {
|
|
19
|
+
if (!err || typeof err !== "object")
|
|
20
|
+
return false;
|
|
21
|
+
const name = err.name;
|
|
22
|
+
// AWS SDK v3 throws either a `NoSuchKey` exception or a `NotFound` head error.
|
|
23
|
+
return name === "NoSuchKey" || name === "NoSuchKeyException";
|
|
24
|
+
}
|
|
25
|
+
function asStringArray(value) {
|
|
26
|
+
if (!Array.isArray(value))
|
|
27
|
+
return undefined;
|
|
28
|
+
const out = [];
|
|
29
|
+
for (const item of value) {
|
|
30
|
+
if (typeof item === "string")
|
|
31
|
+
out.push(item);
|
|
32
|
+
}
|
|
33
|
+
return out.length > 0 ? out : undefined;
|
|
34
|
+
}
|
|
35
|
+
export async function getSignal(opts) {
|
|
36
|
+
// Validate signalType BEFORE any S3 call (acceptance criterion + agent-mitigation).
|
|
37
|
+
assertSignalType(opts.signalType);
|
|
38
|
+
const client = getS3Client(opts.entity);
|
|
39
|
+
const key = `signals/${opts.signalType}/${opts.signalId}.md`;
|
|
40
|
+
let body;
|
|
41
|
+
try {
|
|
42
|
+
const response = await client.send(new GetObjectCommand({
|
|
43
|
+
Bucket: opts.entity.bucketName,
|
|
44
|
+
Key: key,
|
|
45
|
+
}));
|
|
46
|
+
body = await streamToString(response.Body);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
if (isNoSuchKey(err)) {
|
|
50
|
+
throw new SignalNotFoundError(key);
|
|
51
|
+
}
|
|
52
|
+
throw err;
|
|
53
|
+
}
|
|
54
|
+
const parsed = parseMarkdown(body);
|
|
55
|
+
const document = {
|
|
56
|
+
key,
|
|
57
|
+
frontmatter: parsed.frontmatter,
|
|
58
|
+
body: parsed.body,
|
|
59
|
+
};
|
|
60
|
+
if (parsed.frontmatter) {
|
|
61
|
+
const sourceRef = parsed.frontmatter.source_ref;
|
|
62
|
+
if (typeof sourceRef === "string") {
|
|
63
|
+
document.sourceRef = sourceRef;
|
|
64
|
+
}
|
|
65
|
+
const citations = asStringArray(parsed.frontmatter.citations);
|
|
66
|
+
if (citations)
|
|
67
|
+
document.citations = citations;
|
|
68
|
+
const entityRefs = asStringArray(parsed.frontmatter.entity_refs);
|
|
69
|
+
if (entityRefs)
|
|
70
|
+
document.entityRefs = entityRefs;
|
|
71
|
+
}
|
|
72
|
+
return document;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/signals/get.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.test.d.ts","sourceRoot":"","sources":["../../src/signals/get.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for signals/get.ts.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
5
|
+
import { GetObjectCommand } from "@aws-sdk/client-s3";
|
|
6
|
+
import { getSignal, SignalNotFoundError } from "./get.js";
|
|
7
|
+
import { _setSignalsS3Factory, _resetSignalsS3Factory, } from "./internals.js";
|
|
8
|
+
import { InvalidSignalTypeError } from "../schemas/signal-types.js";
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Fixtures
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
const ENTITY = {
|
|
13
|
+
uid: "cmp_test_001",
|
|
14
|
+
slug: "test",
|
|
15
|
+
bucketName: "hq-vault-test",
|
|
16
|
+
region: "us-east-1",
|
|
17
|
+
credentials: {
|
|
18
|
+
accessKeyId: "ASIATEST",
|
|
19
|
+
secretAccessKey: "secret",
|
|
20
|
+
sessionToken: "session",
|
|
21
|
+
},
|
|
22
|
+
expiresAt: new Date(Date.now() + 3600_000).toISOString(),
|
|
23
|
+
};
|
|
24
|
+
const ACTION_ITEM_MD = `---
|
|
25
|
+
signal_id: sig_action_001
|
|
26
|
+
signal_type: action_item
|
|
27
|
+
source_ref: abc-meeting-001
|
|
28
|
+
citations:
|
|
29
|
+
- "Stefan to review the sources pipeline implementation by end of week"
|
|
30
|
+
- "Corey to prepare roadmap slides"
|
|
31
|
+
entity_refs:
|
|
32
|
+
- stefan@indigoai.us
|
|
33
|
+
- corey@indigoai.us
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
Stefan will review the sources pipeline implementation.
|
|
37
|
+
|
|
38
|
+
Corey will prepare updated roadmap slides.
|
|
39
|
+
`;
|
|
40
|
+
function installStub(objects) {
|
|
41
|
+
async function send(command) {
|
|
42
|
+
if (command instanceof GetObjectCommand) {
|
|
43
|
+
const { Key } = command.input;
|
|
44
|
+
const content = objects[Key];
|
|
45
|
+
if (content === undefined) {
|
|
46
|
+
const err = new Error(`NoSuchKey: ${Key}`);
|
|
47
|
+
err.name = "NoSuchKey";
|
|
48
|
+
throw err;
|
|
49
|
+
}
|
|
50
|
+
async function* stream() {
|
|
51
|
+
yield Buffer.from(content, "utf-8");
|
|
52
|
+
}
|
|
53
|
+
return { Body: stream(), $metadata: {} };
|
|
54
|
+
}
|
|
55
|
+
throw new Error(`unhandled command`);
|
|
56
|
+
}
|
|
57
|
+
_setSignalsS3Factory(() => ({ send }));
|
|
58
|
+
}
|
|
59
|
+
beforeEach(() => _resetSignalsS3Factory());
|
|
60
|
+
afterEach(() => _resetSignalsS3Factory());
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// Tests
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
describe("getSignal", () => {
|
|
65
|
+
it("happy path: parses frontmatter, body, and surfaces typed cross-refs", async () => {
|
|
66
|
+
installStub({ "signals/action_item/foo.md": ACTION_ITEM_MD });
|
|
67
|
+
const doc = await getSignal({
|
|
68
|
+
entity: ENTITY,
|
|
69
|
+
signalType: "action_item",
|
|
70
|
+
signalId: "foo",
|
|
71
|
+
});
|
|
72
|
+
expect(doc.key).toBe("signals/action_item/foo.md");
|
|
73
|
+
expect(doc.frontmatter).toMatchObject({
|
|
74
|
+
signal_id: "sig_action_001",
|
|
75
|
+
signal_type: "action_item",
|
|
76
|
+
source_ref: "abc-meeting-001",
|
|
77
|
+
});
|
|
78
|
+
expect(doc.body).toContain("Stefan will review");
|
|
79
|
+
expect(doc.body).toContain("Corey will prepare");
|
|
80
|
+
// Typed cross-reference fields.
|
|
81
|
+
expect(doc.sourceRef).toBe("abc-meeting-001");
|
|
82
|
+
expect(doc.citations).toEqual([
|
|
83
|
+
"Stefan to review the sources pipeline implementation by end of week",
|
|
84
|
+
"Corey to prepare roadmap slides",
|
|
85
|
+
]);
|
|
86
|
+
expect(doc.entityRefs).toEqual([
|
|
87
|
+
"stefan@indigoai.us",
|
|
88
|
+
"corey@indigoai.us",
|
|
89
|
+
]);
|
|
90
|
+
});
|
|
91
|
+
it("throws SignalNotFoundError on NoSuchKey", async () => {
|
|
92
|
+
installStub({});
|
|
93
|
+
await expect(getSignal({ entity: ENTITY, signalType: "action_item", signalId: "missing" })).rejects.toBeInstanceOf(SignalNotFoundError);
|
|
94
|
+
await expect(getSignal({ entity: ENTITY, signalType: "action_item", signalId: "missing" })).rejects.toThrow(/signals\/action_item\/missing\.md/);
|
|
95
|
+
});
|
|
96
|
+
it("rejects an invalid signalType via assertSignalType BEFORE any S3 call", async () => {
|
|
97
|
+
let called = 0;
|
|
98
|
+
_setSignalsS3Factory(() => ({
|
|
99
|
+
send: async () => {
|
|
100
|
+
called++;
|
|
101
|
+
return {};
|
|
102
|
+
},
|
|
103
|
+
}));
|
|
104
|
+
await expect(getSignal({
|
|
105
|
+
entity: ENTITY,
|
|
106
|
+
// @ts-expect-error — invalid signal type intentional
|
|
107
|
+
signalType: "ramble",
|
|
108
|
+
signalId: "foo",
|
|
109
|
+
})).rejects.toBeInstanceOf(InvalidSignalTypeError);
|
|
110
|
+
expect(called).toBe(0);
|
|
111
|
+
});
|
|
112
|
+
it("returns frontmatter:null for malformed (no frontmatter block) documents", async () => {
|
|
113
|
+
installStub({ "signals/action_item/plain.md": "Just a body, no frontmatter." });
|
|
114
|
+
const doc = await getSignal({
|
|
115
|
+
entity: ENTITY,
|
|
116
|
+
signalType: "action_item",
|
|
117
|
+
signalId: "plain",
|
|
118
|
+
});
|
|
119
|
+
expect(doc.frontmatter).toBeNull();
|
|
120
|
+
expect(doc.body).toBe("Just a body, no frontmatter.");
|
|
121
|
+
expect(doc.sourceRef).toBeUndefined();
|
|
122
|
+
expect(doc.citations).toBeUndefined();
|
|
123
|
+
expect(doc.entityRefs).toBeUndefined();
|
|
124
|
+
});
|
|
125
|
+
it("omits cross-ref fields when frontmatter is present but lacks them", async () => {
|
|
126
|
+
const SPARSE = `---
|
|
127
|
+
signal_id: sig_summary_001
|
|
128
|
+
signal_type: summary
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
A summary with no source_ref, citations, or entity_refs.
|
|
132
|
+
`;
|
|
133
|
+
installStub({ "signals/summary/sparse.md": SPARSE });
|
|
134
|
+
const doc = await getSignal({
|
|
135
|
+
entity: ENTITY,
|
|
136
|
+
signalType: "summary",
|
|
137
|
+
signalId: "sparse",
|
|
138
|
+
});
|
|
139
|
+
expect(doc.frontmatter).toMatchObject({ signal_id: "sig_summary_001" });
|
|
140
|
+
expect(doc.sourceRef).toBeUndefined();
|
|
141
|
+
expect(doc.citations).toBeUndefined();
|
|
142
|
+
expect(doc.entityRefs).toBeUndefined();
|
|
143
|
+
expect(doc.body).toContain("A summary");
|
|
144
|
+
});
|
|
145
|
+
it("filters non-string entries out of citations + entity_refs", async () => {
|
|
146
|
+
const MIXED = `---
|
|
147
|
+
signal_id: sig_test
|
|
148
|
+
signal_type: action_item
|
|
149
|
+
citations:
|
|
150
|
+
- "string one"
|
|
151
|
+
- 42
|
|
152
|
+
- "string two"
|
|
153
|
+
entity_refs:
|
|
154
|
+
- true
|
|
155
|
+
- "kept@example.com"
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
Body.
|
|
159
|
+
`;
|
|
160
|
+
installStub({ "signals/action_item/mixed.md": MIXED });
|
|
161
|
+
const doc = await getSignal({
|
|
162
|
+
entity: ENTITY,
|
|
163
|
+
signalType: "action_item",
|
|
164
|
+
signalId: "mixed",
|
|
165
|
+
});
|
|
166
|
+
expect(doc.citations).toEqual(["string one", "string two"]);
|
|
167
|
+
expect(doc.entityRefs).toEqual(["kept@example.com"]);
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
//# sourceMappingURL=get.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.test.js","sourceRoot":"","sources":["../../src/signals/get.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal helpers shared between signals/list.ts and signals/get.ts.
|
|
3
|
+
*
|
|
4
|
+
* Independent S3 client factory hook (separate from sources/internals.ts)
|
|
5
|
+
* so signals tests can swap their stub without disturbing sources tests.
|
|
6
|
+
* Production code never calls the setter.
|
|
7
|
+
*/
|
|
8
|
+
import { S3Client } from "@aws-sdk/client-s3";
|
|
9
|
+
import type { EntityContext } from "../types.js";
|
|
10
|
+
export declare function getS3Client(ctx: EntityContext): S3Client;
|
|
11
|
+
/** Test hook: replace the S3 client factory. */
|
|
12
|
+
export declare function _setSignalsS3Factory(f: (ctx: EntityContext) => S3Client): void;
|
|
13
|
+
/** Test hook: restore the default S3 client factory. */
|
|
14
|
+
export declare function _resetSignalsS3Factory(): void;
|
|
15
|
+
export declare function streamToString(body: unknown): Promise<string>;
|
|
16
|
+
//# sourceMappingURL=internals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internals.d.ts","sourceRoot":"","sources":["../../src/signals/internals.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAejD,wBAAgB,WAAW,CAAC,GAAG,EAAE,aAAa,GAAG,QAAQ,CAExD;AAED,gDAAgD;AAChD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,QAAQ,GAAG,IAAI,CAE9E;AAED,wDAAwD;AACxD,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAOnE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal helpers shared between signals/list.ts and signals/get.ts.
|
|
3
|
+
*
|
|
4
|
+
* Independent S3 client factory hook (separate from sources/internals.ts)
|
|
5
|
+
* so signals tests can swap their stub without disturbing sources tests.
|
|
6
|
+
* Production code never calls the setter.
|
|
7
|
+
*/
|
|
8
|
+
import { S3Client } from "@aws-sdk/client-s3";
|
|
9
|
+
function defaultFactory(ctx) {
|
|
10
|
+
return new S3Client({
|
|
11
|
+
region: ctx.region,
|
|
12
|
+
credentials: {
|
|
13
|
+
accessKeyId: ctx.credentials.accessKeyId,
|
|
14
|
+
secretAccessKey: ctx.credentials.secretAccessKey,
|
|
15
|
+
sessionToken: ctx.credentials.sessionToken,
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
let factory = defaultFactory;
|
|
20
|
+
export function getS3Client(ctx) {
|
|
21
|
+
return factory(ctx);
|
|
22
|
+
}
|
|
23
|
+
/** Test hook: replace the S3 client factory. */
|
|
24
|
+
export function _setSignalsS3Factory(f) {
|
|
25
|
+
factory = f;
|
|
26
|
+
}
|
|
27
|
+
/** Test hook: restore the default S3 client factory. */
|
|
28
|
+
export function _resetSignalsS3Factory() {
|
|
29
|
+
factory = defaultFactory;
|
|
30
|
+
}
|
|
31
|
+
export async function streamToString(body) {
|
|
32
|
+
const stream = body;
|
|
33
|
+
const chunks = [];
|
|
34
|
+
for await (const chunk of stream) {
|
|
35
|
+
chunks.push(Buffer.from(chunk));
|
|
36
|
+
}
|
|
37
|
+
return Buffer.concat(chunks).toString("utf-8");
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=internals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internals.js","sourceRoot":"","sources":["../../src/signals/internals.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,SAAS,cAAc,CAAC,GAAkB;IACxC,OAAO,IAAI,QAAQ,CAAC;QAClB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,WAAW,EAAE;YACX,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,WAAW;YACxC,eAAe,EAAE,GAAG,CAAC,WAAW,CAAC,eAAe;YAChD,YAAY,EAAE,GAAG,CAAC,WAAW,CAAC,YAAY;SAC3C;KACF,CAAC,CAAC;AACL,CAAC;AAED,IAAI,OAAO,GAAqC,cAAc,CAAC;AAE/D,MAAM,UAAU,WAAW,CAAC,GAAkB;IAC5C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;AACtB,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,oBAAoB,CAAC,CAAmC;IACtE,OAAO,GAAG,CAAC,CAAC;AACd,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,sBAAsB;IACpC,OAAO,GAAG,cAAc,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAa;IAChD,MAAM,MAAM,GAAG,IAAiC,CAAC;IACjD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* listSignals — page through `signals/{signalType}/` keys in an entity bucket
|
|
3
|
+
* and return typed summaries.
|
|
4
|
+
*
|
|
5
|
+
* `sourceRef` is surfaced on each summary when the caller passes
|
|
6
|
+
* `includeFrontmatter: true` (otherwise the field is undefined).
|
|
7
|
+
*/
|
|
8
|
+
import type { ListSignalsOptions, ListSignalsResult } from "./types.js";
|
|
9
|
+
export declare function listSignals(opts: ListSignalsOptions): Promise<ListSignalsResult>;
|
|
10
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/signals/list.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EAElB,MAAM,YAAY,CAAC;AAapB,wBAAsB,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2DtF"}
|