@indigoai-us/hq-cloud 5.19.1 → 5.21.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.
Files changed (128) hide show
  1. package/.github/workflows/ci.yml +8 -4
  2. package/.github/workflows/publish.yml +9 -3
  3. package/dist/bin/sync-runner.d.ts +9 -0
  4. package/dist/bin/sync-runner.d.ts.map +1 -1
  5. package/dist/bin/sync-runner.js +58 -0
  6. package/dist/bin/sync-runner.js.map +1 -1
  7. package/dist/entity-resolver.d.ts +53 -0
  8. package/dist/entity-resolver.d.ts.map +1 -0
  9. package/dist/entity-resolver.js +127 -0
  10. package/dist/entity-resolver.js.map +1 -0
  11. package/dist/entity-resolver.test.d.ts +10 -0
  12. package/dist/entity-resolver.test.d.ts.map +1 -0
  13. package/dist/entity-resolver.test.js +244 -0
  14. package/dist/entity-resolver.test.js.map +1 -0
  15. package/dist/index.d.ts +17 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +21 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/schemas/signal-types.d.ts +16 -0
  20. package/dist/schemas/signal-types.d.ts.map +1 -0
  21. package/dist/schemas/signal-types.js +30 -0
  22. package/dist/schemas/signal-types.js.map +1 -0
  23. package/dist/schemas/signal-types.test.d.ts +2 -0
  24. package/dist/schemas/signal-types.test.d.ts.map +1 -0
  25. package/dist/schemas/signal-types.test.js +65 -0
  26. package/dist/schemas/signal-types.test.js.map +1 -0
  27. package/dist/schemas/source-channels.d.ts +15 -0
  28. package/dist/schemas/source-channels.d.ts.map +1 -0
  29. package/dist/schemas/source-channels.js +28 -0
  30. package/dist/schemas/source-channels.js.map +1 -0
  31. package/dist/schemas/source-channels.test.d.ts +2 -0
  32. package/dist/schemas/source-channels.test.d.ts.map +1 -0
  33. package/dist/schemas/source-channels.test.js +65 -0
  34. package/dist/schemas/source-channels.test.js.map +1 -0
  35. package/dist/signals/get.d.ts +13 -0
  36. package/dist/signals/get.d.ts.map +1 -0
  37. package/dist/signals/get.js +74 -0
  38. package/dist/signals/get.js.map +1 -0
  39. package/dist/signals/get.test.d.ts +5 -0
  40. package/dist/signals/get.test.d.ts.map +1 -0
  41. package/dist/signals/get.test.js +170 -0
  42. package/dist/signals/get.test.js.map +1 -0
  43. package/dist/signals/internals.d.ts +16 -0
  44. package/dist/signals/internals.d.ts.map +1 -0
  45. package/dist/signals/internals.js +39 -0
  46. package/dist/signals/internals.js.map +1 -0
  47. package/dist/signals/list.d.ts +10 -0
  48. package/dist/signals/list.d.ts.map +1 -0
  49. package/dist/signals/list.js +76 -0
  50. package/dist/signals/list.js.map +1 -0
  51. package/dist/signals/list.test.d.ts +9 -0
  52. package/dist/signals/list.test.d.ts.map +1 -0
  53. package/dist/signals/list.test.js +227 -0
  54. package/dist/signals/list.test.js.map +1 -0
  55. package/dist/signals/parse.d.ts +8 -0
  56. package/dist/signals/parse.d.ts.map +1 -0
  57. package/dist/signals/parse.js +8 -0
  58. package/dist/signals/parse.js.map +1 -0
  59. package/dist/signals/types.d.ts +69 -0
  60. package/dist/signals/types.d.ts.map +1 -0
  61. package/dist/signals/types.js +10 -0
  62. package/dist/signals/types.js.map +1 -0
  63. package/dist/sources/get.d.ts +11 -0
  64. package/dist/sources/get.d.ts.map +1 -0
  65. package/dist/sources/get.js +67 -0
  66. package/dist/sources/get.js.map +1 -0
  67. package/dist/sources/get.test.d.ts +5 -0
  68. package/dist/sources/get.test.d.ts.map +1 -0
  69. package/dist/sources/get.test.js +132 -0
  70. package/dist/sources/get.test.js.map +1 -0
  71. package/dist/sources/internals.d.ts +16 -0
  72. package/dist/sources/internals.d.ts.map +1 -0
  73. package/dist/sources/internals.js +39 -0
  74. package/dist/sources/internals.js.map +1 -0
  75. package/dist/sources/list.d.ts +10 -0
  76. package/dist/sources/list.d.ts.map +1 -0
  77. package/dist/sources/list.js +76 -0
  78. package/dist/sources/list.js.map +1 -0
  79. package/dist/sources/list.test.d.ts +8 -0
  80. package/dist/sources/list.test.d.ts.map +1 -0
  81. package/dist/sources/list.test.js +198 -0
  82. package/dist/sources/list.test.js.map +1 -0
  83. package/dist/sources/parse.d.ts +18 -0
  84. package/dist/sources/parse.d.ts.map +1 -0
  85. package/dist/sources/parse.js +35 -0
  86. package/dist/sources/parse.js.map +1 -0
  87. package/dist/sources/types.d.ts +62 -0
  88. package/dist/sources/types.d.ts.map +1 -0
  89. package/dist/sources/types.js +8 -0
  90. package/dist/sources/types.js.map +1 -0
  91. package/dist/telemetry.d.ts +87 -0
  92. package/dist/telemetry.d.ts.map +1 -0
  93. package/dist/telemetry.js +349 -0
  94. package/dist/telemetry.js.map +1 -0
  95. package/dist/telemetry.test.d.ts +11 -0
  96. package/dist/telemetry.test.d.ts.map +1 -0
  97. package/dist/telemetry.test.js +309 -0
  98. package/dist/telemetry.test.js.map +1 -0
  99. package/dist/vault-client.d.ts +43 -0
  100. package/dist/vault-client.d.ts.map +1 -1
  101. package/dist/vault-client.js +28 -0
  102. package/dist/vault-client.js.map +1 -1
  103. package/package.json +5 -3
  104. package/src/bin/sync-runner.ts +73 -0
  105. package/src/entity-resolver.test.ts +315 -0
  106. package/src/entity-resolver.ts +180 -0
  107. package/src/index.ts +76 -0
  108. package/src/schemas/signal-types.test.ts +82 -0
  109. package/src/schemas/signal-types.ts +38 -0
  110. package/src/schemas/source-channels.test.ts +82 -0
  111. package/src/schemas/source-channels.ts +36 -0
  112. package/src/signals/get.test.ts +204 -0
  113. package/src/signals/get.ts +79 -0
  114. package/src/signals/internals.ts +46 -0
  115. package/src/signals/list.test.ts +283 -0
  116. package/src/signals/list.ts +92 -0
  117. package/src/signals/parse.ts +8 -0
  118. package/src/signals/types.ts +74 -0
  119. package/src/sources/get.test.ts +166 -0
  120. package/src/sources/get.ts +75 -0
  121. package/src/sources/internals.ts +46 -0
  122. package/src/sources/list.test.ts +247 -0
  123. package/src/sources/list.ts +95 -0
  124. package/src/sources/parse.ts +43 -0
  125. package/src/sources/types.ts +67 -0
  126. package/src/telemetry.test.ts +394 -0
  127. package/src/telemetry.ts +436 -0
  128. package/src/vault-client.ts +60 -0
@@ -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,5 @@
1
+ /**
2
+ * Unit tests for signals/get.ts.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=get.test.d.ts.map
@@ -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":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAiB,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E,MAAM,MAAM,GAAkB;IAC5B,GAAG,EAAE,cAAc;IACnB,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,eAAe;IAC3B,MAAM,EAAE,WAAW;IACnB,WAAW,EAAE;QACX,WAAW,EAAE,UAAU;QACvB,eAAe,EAAE,QAAQ;QACzB,YAAY,EAAE,SAAS;KACxB;IACD,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE;CACzD,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;CAetB,CAAC;AAEF,SAAS,WAAW,CAAC,OAA+B;IAClD,KAAK,UAAU,IAAI,CAAC,OAAgB;QAClC,IAAI,OAAO,YAAY,gBAAgB,EAAE,CAAC;YACxC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,KAAwB,CAAC;YACjD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;gBAC1C,GAAgC,CAAC,IAAI,GAAG,WAAW,CAAC;gBACrD,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,KAAK,SAAS,CAAC,CAAC,MAAM;gBACpB,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACtC,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QAC3C,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IACD,oBAAoB,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAA0B,CAAA,CAAC,CAAC;AAChE,CAAC;AAED,UAAU,CAAC,GAAG,EAAE,CAAC,sBAAsB,EAAE,CAAC,CAAC;AAC3C,SAAS,CAAC,GAAG,EAAE,CAAC,sBAAsB,EAAE,CAAC,CAAC;AAE1C,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,WAAW,CAAC,EAAE,4BAA4B,EAAE,cAAc,EAAE,CAAC,CAAC;QAE9D,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC;YAC1B,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,aAAa;YACzB,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;QAEH,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACnD,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,aAAa,CAAC;YACpC,SAAS,EAAE,gBAAgB;YAC3B,WAAW,EAAE,aAAa;YAC1B,UAAU,EAAE,iBAAiB;SAC9B,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAEjD,gCAAgC;QAChC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;YAC5B,qEAAqE;YACrE,iCAAiC;SAClC,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC;YAC7B,oBAAoB;YACpB,mBAAmB;SACpB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,WAAW,CAAC,EAAE,CAAC,CAAC;QAEhB,MAAM,MAAM,CACV,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAC9E,CAAC,OAAO,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;QAE9C,MAAM,MAAM,CACV,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAC9E,CAAC,OAAO,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,oBAAoB,CAAC,GAAG,EAAE,CAAC,CAAC;YAC1B,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,MAAM,EAAE,CAAC;gBACT,OAAO,EAAE,CAAC;YACZ,CAAC;SACsB,CAAA,CAAC,CAAC;QAE3B,MAAM,MAAM,CACV,SAAS,CAAC;YACR,MAAM,EAAE,MAAM;YACd,qDAAqD;YACrD,UAAU,EAAE,QAAQ;YACpB,QAAQ,EAAE,KAAK;SAChB,CAAC,CACH,CAAC,OAAO,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACvF,WAAW,CAAC,EAAE,8BAA8B,EAAE,8BAA8B,EAAE,CAAC,CAAC;QAEhF,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC;YAC1B,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,aAAa;YACzB,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QAEH,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,aAAa,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,MAAM,GAAG;;;;;;CAMlB,CAAC;QACE,WAAW,CAAC,EAAE,2BAA2B,EAAE,MAAM,EAAE,CAAC,CAAC;QAErD,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC;YAC1B,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QAEH,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACxE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,aAAa,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,KAAK,GAAG;;;;;;;;;;;;;CAajB,CAAC;QACE,WAAW,CAAC,EAAE,8BAA8B,EAAE,KAAK,EAAE,CAAC,CAAC;QAEvD,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC;YAC1B,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,aAAa;YACzB,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QAEH,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;QAC5D,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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"}
@@ -0,0 +1,76 @@
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 { GetObjectCommand, ListObjectsV2Command, } from "@aws-sdk/client-s3";
9
+ import { assertSignalType } from "../schemas/signal-types.js";
10
+ import { getS3Client, streamToString } from "./internals.js";
11
+ import { parseFrontmatter } from "./parse.js";
12
+ /**
13
+ * Strip the `signals/{signalType}/` prefix and `.md` suffix from a key.
14
+ * Returns `null` if the key shape isn't recognised.
15
+ */
16
+ function deriveSignalId(key, prefix) {
17
+ if (!key.startsWith(prefix))
18
+ return null;
19
+ const tail = key.slice(prefix.length);
20
+ if (!tail.endsWith(".md"))
21
+ return null;
22
+ return tail.slice(0, -".md".length);
23
+ }
24
+ export async function listSignals(opts) {
25
+ // Validate signalType BEFORE any S3 call (acceptance criterion + agent-mitigation).
26
+ assertSignalType(opts.signalType);
27
+ const client = getS3Client(opts.entity);
28
+ const prefix = `signals/${opts.signalType}/`;
29
+ const response = await client.send(new ListObjectsV2Command({
30
+ Bucket: opts.entity.bucketName,
31
+ Prefix: prefix,
32
+ MaxKeys: opts.limit,
33
+ ContinuationToken: opts.continuationToken,
34
+ }));
35
+ const entries = [];
36
+ for (const obj of response.Contents ?? []) {
37
+ if (!obj.Key)
38
+ continue;
39
+ const signalId = deriveSignalId(obj.Key, prefix);
40
+ if (!signalId)
41
+ continue;
42
+ const summary = {
43
+ signalId,
44
+ signalType: opts.signalType,
45
+ key: obj.Key,
46
+ lastModified: obj.LastModified ?? new Date(0),
47
+ size: obj.Size ?? 0,
48
+ };
49
+ if (opts.includeFrontmatter) {
50
+ try {
51
+ const get = await client.send(new GetObjectCommand({
52
+ Bucket: opts.entity.bucketName,
53
+ Key: obj.Key,
54
+ }));
55
+ const text = await streamToString(get.Body);
56
+ const fm = parseFrontmatter(text);
57
+ if (fm) {
58
+ summary.frontmatter = fm;
59
+ const sourceRef = fm.source_ref;
60
+ if (typeof sourceRef === "string") {
61
+ summary.sourceRef = sourceRef;
62
+ }
63
+ }
64
+ }
65
+ catch {
66
+ // Frontmatter fetch is best-effort; leave undefined on failure.
67
+ }
68
+ }
69
+ entries.push(summary);
70
+ }
71
+ return {
72
+ entries,
73
+ nextToken: response.IsTruncated ? response.NextContinuationToken : undefined,
74
+ };
75
+ }
76
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/signals/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Unit tests for signals/list.ts.
3
+ *
4
+ * Uses an in-memory S3Client stub installed via the internal
5
+ * `_setSignalsS3Factory` hook so we don't have to stand up vi.mock for
6
+ * @aws-sdk/client-s3.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=list.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.test.d.ts","sourceRoot":"","sources":["../../src/signals/list.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}