@lobu/core 6.1.0 → 7.0.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 (87) hide show
  1. package/dist/__tests__/agent-policy-harden.test.d.ts +11 -0
  2. package/dist/__tests__/agent-policy-harden.test.d.ts.map +1 -0
  3. package/dist/__tests__/agent-policy-harden.test.js +216 -0
  4. package/dist/__tests__/agent-policy-harden.test.js.map +1 -0
  5. package/dist/__tests__/agent-store.test.d.ts +8 -0
  6. package/dist/__tests__/agent-store.test.d.ts.map +1 -0
  7. package/dist/__tests__/agent-store.test.js +38 -0
  8. package/dist/__tests__/agent-store.test.js.map +1 -0
  9. package/dist/__tests__/command-registry.test.d.ts +8 -0
  10. package/dist/__tests__/command-registry.test.d.ts.map +1 -0
  11. package/dist/__tests__/command-registry.test.js +188 -0
  12. package/dist/__tests__/command-registry.test.js.map +1 -0
  13. package/dist/__tests__/encryption-key-validation.test.d.ts +2 -0
  14. package/dist/__tests__/encryption-key-validation.test.d.ts.map +1 -0
  15. package/dist/__tests__/encryption-key-validation.test.js +53 -0
  16. package/dist/__tests__/encryption-key-validation.test.js.map +1 -0
  17. package/dist/__tests__/encryption.test.js +2 -0
  18. package/dist/__tests__/encryption.test.js.map +1 -1
  19. package/dist/__tests__/errors.test.js +0 -36
  20. package/dist/__tests__/errors.test.js.map +1 -1
  21. package/dist/__tests__/guardrails-harden.test.d.ts +16 -0
  22. package/dist/__tests__/guardrails-harden.test.d.ts.map +1 -0
  23. package/dist/__tests__/guardrails-harden.test.js +328 -0
  24. package/dist/__tests__/guardrails-harden.test.js.map +1 -0
  25. package/dist/__tests__/instruction-provider.test.d.ts +8 -0
  26. package/dist/__tests__/instruction-provider.test.d.ts.map +1 -0
  27. package/dist/__tests__/instruction-provider.test.js +129 -0
  28. package/dist/__tests__/instruction-provider.test.js.map +1 -0
  29. package/dist/__tests__/lobu-toml-schema-harden.test.d.ts +10 -0
  30. package/dist/__tests__/lobu-toml-schema-harden.test.d.ts.map +1 -0
  31. package/dist/__tests__/lobu-toml-schema-harden.test.js +722 -0
  32. package/dist/__tests__/lobu-toml-schema-harden.test.js.map +1 -0
  33. package/dist/__tests__/lobu-toml-schema.test.js +40 -5
  34. package/dist/__tests__/lobu-toml-schema.test.js.map +1 -1
  35. package/dist/__tests__/network-domains.test.d.ts +9 -0
  36. package/dist/__tests__/network-domains.test.d.ts.map +1 -0
  37. package/dist/__tests__/network-domains.test.js +97 -0
  38. package/dist/__tests__/network-domains.test.js.map +1 -0
  39. package/dist/__tests__/sanitize.test.js +11 -0
  40. package/dist/__tests__/sanitize.test.js.map +1 -1
  41. package/dist/__tests__/utils-env.test.d.ts +8 -0
  42. package/dist/__tests__/utils-env.test.d.ts.map +1 -0
  43. package/dist/__tests__/utils-env.test.js +125 -0
  44. package/dist/__tests__/utils-env.test.js.map +1 -0
  45. package/dist/__tests__/utils-json.test.d.ts +8 -0
  46. package/dist/__tests__/utils-json.test.d.ts.map +1 -0
  47. package/dist/__tests__/utils-json.test.js +114 -0
  48. package/dist/__tests__/utils-json.test.js.map +1 -0
  49. package/dist/__tests__/utils-urls.test.d.ts +7 -0
  50. package/dist/__tests__/utils-urls.test.d.ts.map +1 -0
  51. package/dist/__tests__/utils-urls.test.js +37 -0
  52. package/dist/__tests__/utils-urls.test.js.map +1 -0
  53. package/dist/__tests__/worker-auth.test.js +8 -0
  54. package/dist/__tests__/worker-auth.test.js.map +1 -1
  55. package/dist/command-registry.d.ts +4 -0
  56. package/dist/command-registry.d.ts.map +1 -1
  57. package/dist/command-registry.js.map +1 -1
  58. package/dist/errors.d.ts +0 -19
  59. package/dist/errors.d.ts.map +1 -1
  60. package/dist/errors.js +1 -38
  61. package/dist/errors.js.map +1 -1
  62. package/dist/lobu-toml-schema.d.ts +23 -8
  63. package/dist/lobu-toml-schema.d.ts.map +1 -1
  64. package/dist/lobu-toml-schema.js +31 -5
  65. package/dist/lobu-toml-schema.js.map +1 -1
  66. package/dist/logger.js +4 -4
  67. package/dist/logger.js.map +1 -1
  68. package/dist/utils/encryption.d.ts +2 -0
  69. package/dist/utils/encryption.d.ts.map +1 -1
  70. package/dist/utils/encryption.js +29 -11
  71. package/dist/utils/encryption.js.map +1 -1
  72. package/dist/utils/json.d.ts +0 -5
  73. package/dist/utils/json.d.ts.map +1 -1
  74. package/dist/utils/json.js +0 -16
  75. package/dist/utils/json.js.map +1 -1
  76. package/dist/utils/retry.d.ts.map +1 -1
  77. package/dist/utils/retry.js +29 -5
  78. package/dist/utils/retry.js.map +1 -1
  79. package/dist/utils/sanitize.d.ts +0 -24
  80. package/dist/utils/sanitize.d.ts.map +1 -1
  81. package/dist/utils/sanitize.js +40 -29
  82. package/dist/utils/sanitize.js.map +1 -1
  83. package/dist/worker/auth.d.ts +1 -0
  84. package/dist/worker/auth.d.ts.map +1 -1
  85. package/dist/worker/auth.js +12 -1
  86. package/dist/worker/auth.js.map +1 -1
  87. package/package.json +1 -1
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Hardened tests for agent-policy.ts.
3
+ *
4
+ * The existing agent-policy.test.ts covers file delivery detection.
5
+ * This file covers: renderBaselineAgentPolicy, renderAlwaysOnToolPolicyRules,
6
+ * getCustomToolDescription for unknown tools, detectToolIntentRules edge cases
7
+ * (empty prompt, whitespace-only, alwaysInclude exclusion, ordering, multiple
8
+ * rule matches), and buildUnconfiguredAgentNotice.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=agent-policy-harden.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-policy-harden.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/agent-policy-harden.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ /**
3
+ * Hardened tests for agent-policy.ts.
4
+ *
5
+ * The existing agent-policy.test.ts covers file delivery detection.
6
+ * This file covers: renderBaselineAgentPolicy, renderAlwaysOnToolPolicyRules,
7
+ * getCustomToolDescription for unknown tools, detectToolIntentRules edge cases
8
+ * (empty prompt, whitespace-only, alwaysInclude exclusion, ordering, multiple
9
+ * rule matches), and buildUnconfiguredAgentNotice.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const bun_test_1 = require("bun:test");
13
+ const agent_policy_1 = require("../agent-policy");
14
+ // ── renderBaselineAgentPolicy ─────────────────────────────────────────────────
15
+ (0, bun_test_1.describe)("renderBaselineAgentPolicy", () => {
16
+ (0, bun_test_1.test)("returns a non-empty string", () => {
17
+ const output = (0, agent_policy_1.renderBaselineAgentPolicy)();
18
+ (0, bun_test_1.expect)(typeof output).toBe("string");
19
+ (0, bun_test_1.expect)(output.length).toBeGreaterThan(0);
20
+ });
21
+ (0, bun_test_1.test)("contains the Baseline Policy heading", () => {
22
+ (0, bun_test_1.expect)((0, agent_policy_1.renderBaselineAgentPolicy)()).toContain("## Baseline Policy");
23
+ });
24
+ (0, bun_test_1.test)("forbids fabricating tool outputs", () => {
25
+ (0, bun_test_1.expect)((0, agent_policy_1.renderBaselineAgentPolicy)()).toMatch(/fabricat/i);
26
+ });
27
+ (0, bun_test_1.test)("is deterministic across calls", () => {
28
+ (0, bun_test_1.expect)((0, agent_policy_1.renderBaselineAgentPolicy)()).toBe((0, agent_policy_1.renderBaselineAgentPolicy)());
29
+ });
30
+ });
31
+ // ── renderAlwaysOnToolPolicyRules ─────────────────────────────────────────────
32
+ (0, bun_test_1.describe)("renderAlwaysOnToolPolicyRules", () => {
33
+ (0, bun_test_1.test)("returns a non-empty string because there are alwaysInclude rules", () => {
34
+ const alwaysOnCount = agent_policy_1.TOOL_INTENT_RULES.filter((r) => r.alwaysInclude).length;
35
+ // Confirm the assumption: there are always-on rules
36
+ (0, bun_test_1.expect)(alwaysOnCount).toBeGreaterThan(0);
37
+ const output = (0, agent_policy_1.renderAlwaysOnToolPolicyRules)();
38
+ (0, bun_test_1.expect)(output.length).toBeGreaterThan(0);
39
+ });
40
+ (0, bun_test_1.test)("includes the Built-In Tool Policies heading", () => {
41
+ (0, bun_test_1.expect)((0, agent_policy_1.renderAlwaysOnToolPolicyRules)()).toContain("## Built-In Tool Policies");
42
+ });
43
+ (0, bun_test_1.test)("includes AskUserQuestion rule (always-on)", () => {
44
+ (0, bun_test_1.expect)((0, agent_policy_1.renderAlwaysOnToolPolicyRules)()).toContain("AskUserQuestion");
45
+ });
46
+ (0, bun_test_1.test)("includes UploadUserFile rule (always-on)", () => {
47
+ (0, bun_test_1.expect)((0, agent_policy_1.renderAlwaysOnToolPolicyRules)()).toContain("UploadUserFile");
48
+ });
49
+ (0, bun_test_1.test)("does NOT include image-generation rule (not alwaysInclude)", () => {
50
+ // image-generation has no alwaysInclude flag
51
+ const output = (0, agent_policy_1.renderAlwaysOnToolPolicyRules)();
52
+ (0, bun_test_1.expect)(output).not.toContain("Image Generation");
53
+ });
54
+ (0, bun_test_1.test)("is deterministic across calls", () => {
55
+ (0, bun_test_1.expect)((0, agent_policy_1.renderAlwaysOnToolPolicyRules)()).toBe((0, agent_policy_1.renderAlwaysOnToolPolicyRules)());
56
+ });
57
+ });
58
+ // ── getCustomToolDescription ──────────────────────────────────────────────────
59
+ (0, bun_test_1.describe)("getCustomToolDescription", () => {
60
+ (0, bun_test_1.test)("returns the registered description for UploadUserFile", () => {
61
+ const desc = (0, agent_policy_1.getCustomToolDescription)("UploadUserFile");
62
+ (0, bun_test_1.expect)(desc.length).toBeGreaterThan(0);
63
+ (0, bun_test_1.expect)(desc).not.toBe("UploadUserFile");
64
+ });
65
+ (0, bun_test_1.test)("returns the registered description for GenerateImage", () => {
66
+ const desc = (0, agent_policy_1.getCustomToolDescription)("GenerateImage");
67
+ (0, bun_test_1.expect)(desc.length).toBeGreaterThan(0);
68
+ (0, bun_test_1.expect)(desc).not.toBe("GenerateImage");
69
+ });
70
+ (0, bun_test_1.test)("returns the registered description for GenerateAudio", () => {
71
+ const desc = (0, agent_policy_1.getCustomToolDescription)("GenerateAudio");
72
+ (0, bun_test_1.expect)(desc).toContain("audio");
73
+ });
74
+ (0, bun_test_1.test)("returns the registered description for GetChannelHistory", () => {
75
+ const desc = (0, agent_policy_1.getCustomToolDescription)("GetChannelHistory");
76
+ (0, bun_test_1.expect)(desc.length).toBeGreaterThan(0);
77
+ });
78
+ (0, bun_test_1.test)("returns the registered description for AskUserQuestion", () => {
79
+ const desc = (0, agent_policy_1.getCustomToolDescription)("AskUserQuestion");
80
+ (0, bun_test_1.expect)(desc.length).toBeGreaterThan(0);
81
+ });
82
+ (0, bun_test_1.test)("falls back to the tool name for unknown tools", () => {
83
+ (0, bun_test_1.expect)((0, agent_policy_1.getCustomToolDescription)("UnknownTool")).toBe("UnknownTool");
84
+ });
85
+ (0, bun_test_1.test)("falls back to tool name for empty string", () => {
86
+ (0, bun_test_1.expect)((0, agent_policy_1.getCustomToolDescription)("")).toBe("");
87
+ });
88
+ });
89
+ // ── detectToolIntentRules ─────────────────────────────────────────────────────
90
+ (0, bun_test_1.describe)("detectToolIntentRules", () => {
91
+ (0, bun_test_1.test)("returns empty array for empty prompt", () => {
92
+ (0, bun_test_1.expect)((0, agent_policy_1.detectToolIntentRules)("")).toEqual([]);
93
+ });
94
+ (0, bun_test_1.test)("returns empty array for whitespace-only prompt", () => {
95
+ (0, bun_test_1.expect)((0, agent_policy_1.detectToolIntentRules)(" \t\n ")).toEqual([]);
96
+ });
97
+ (0, bun_test_1.test)("returns empty array for a generic unrelated prompt", () => {
98
+ const rules = (0, agent_policy_1.detectToolIntentRules)("What is 2 + 2?");
99
+ (0, bun_test_1.expect)(rules).toEqual([]);
100
+ });
101
+ (0, bun_test_1.test)("does NOT return alwaysInclude rules (they go via renderAlwaysOnToolPolicyRules)", () => {
102
+ // A prompt that definitely matches patterns should not include alwaysInclude rules
103
+ const rules = (0, agent_policy_1.detectToolIntentRules)("send me the file as an attachment please");
104
+ for (const rule of rules) {
105
+ (0, bun_test_1.expect)(rule.alwaysInclude).not.toBe(true);
106
+ }
107
+ });
108
+ (0, bun_test_1.test)("detects image generation request", () => {
109
+ const rules = (0, agent_policy_1.detectToolIntentRules)("generate an image of a sunset");
110
+ const ids = rules.map((r) => r.id);
111
+ (0, bun_test_1.expect)(ids).toContain("image-generation");
112
+ });
113
+ (0, bun_test_1.test)("detects download file request", () => {
114
+ const rules = (0, agent_policy_1.detectToolIntentRules)("save this as a PDF file and give it to me");
115
+ const ids = rules.map((r) => r.id);
116
+ (0, bun_test_1.expect)(ids).toContain("file-delivery");
117
+ });
118
+ (0, bun_test_1.test)("returns rules sorted by ascending priority", () => {
119
+ // Trigger both file-delivery (priority 30) and image-generation (priority 70)
120
+ const rules = (0, agent_policy_1.detectToolIntentRules)("generate an image and export it as a file for download");
121
+ const priorities = rules.map((r) => r.priority);
122
+ // Should be in ascending order
123
+ for (let i = 1; i < priorities.length; i++) {
124
+ (0, bun_test_1.expect)(priorities[i]).toBeGreaterThanOrEqual(priorities[i - 1]);
125
+ }
126
+ });
127
+ (0, bun_test_1.test)("file delivery pattern: noun-verb order", () => {
128
+ const rules = (0, agent_policy_1.detectToolIntentRules)("the CSV file, please share it with me");
129
+ const ids = rules.map((r) => r.id);
130
+ (0, bun_test_1.expect)(ids).toContain("file-delivery");
131
+ });
132
+ (0, bun_test_1.test)("image generation pattern: verb-noun order", () => {
133
+ const rules = (0, agent_policy_1.detectToolIntentRules)("design a logo for my company");
134
+ const ids = rules.map((r) => r.id);
135
+ (0, bun_test_1.expect)(ids).toContain("image-generation");
136
+ });
137
+ (0, bun_test_1.test)("does not include conversation-history rule from detectToolIntentRules (alwaysInclude=true)", () => {
138
+ const rules = (0, agent_policy_1.detectToolIntentRules)("what did we talk about earlier?");
139
+ for (const rule of rules) {
140
+ (0, bun_test_1.expect)(rule.id).not.toBe("conversation-history");
141
+ }
142
+ });
143
+ });
144
+ // ── renderDetectedToolIntentRules ─────────────────────────────────────────────
145
+ (0, bun_test_1.describe)("renderDetectedToolIntentRules", () => {
146
+ (0, bun_test_1.test)("returns empty string for unrelated prompt", () => {
147
+ (0, bun_test_1.expect)((0, agent_policy_1.renderDetectedToolIntentRules)("hello there")).toBe("");
148
+ });
149
+ (0, bun_test_1.test)("returns empty string for empty prompt", () => {
150
+ (0, bun_test_1.expect)((0, agent_policy_1.renderDetectedToolIntentRules)("")).toBe("");
151
+ });
152
+ (0, bun_test_1.test)("includes Priority Tool Guidance heading when rules detected", () => {
153
+ const out = (0, agent_policy_1.renderDetectedToolIntentRules)("generate an image of a mountain");
154
+ (0, bun_test_1.expect)(out).toContain("## Priority Tool Guidance For This Request");
155
+ });
156
+ (0, bun_test_1.test)("includes tool name in output", () => {
157
+ const out = (0, agent_policy_1.renderDetectedToolIntentRules)("generate an image of a mountain");
158
+ (0, bun_test_1.expect)(out).toContain("GenerateImage");
159
+ });
160
+ (0, bun_test_1.test)("is deterministic for same input", () => {
161
+ const prompt = "send me the report as a PDF";
162
+ (0, bun_test_1.expect)((0, agent_policy_1.renderDetectedToolIntentRules)(prompt)).toBe((0, agent_policy_1.renderDetectedToolIntentRules)(prompt));
163
+ });
164
+ });
165
+ // ── buildUnconfiguredAgentNotice ──────────────────────────────────────────────
166
+ (0, bun_test_1.describe)("buildUnconfiguredAgentNotice", () => {
167
+ (0, bun_test_1.test)("includes the Agent Configuration Notice heading", () => {
168
+ (0, bun_test_1.expect)((0, agent_policy_1.buildUnconfiguredAgentNotice)()).toContain("## Agent Configuration Notice");
169
+ });
170
+ (0, bun_test_1.test)("without settingsUrl: no link is included", () => {
171
+ const out = (0, agent_policy_1.buildUnconfiguredAgentNotice)();
172
+ (0, bun_test_1.expect)(out).not.toContain("[Open Agent Settings]");
173
+ });
174
+ (0, bun_test_1.test)("with settingsUrl: includes a markdown link", () => {
175
+ const out = (0, agent_policy_1.buildUnconfiguredAgentNotice)("https://app.lobu.ai/agents/triage/settings");
176
+ (0, bun_test_1.expect)(out).toContain("[Open Agent Settings](https://app.lobu.ai/agents/triage/settings)");
177
+ });
178
+ (0, bun_test_1.test)("instructs to behave as helpful assistant when unconfigured", () => {
179
+ (0, bun_test_1.expect)((0, agent_policy_1.buildUnconfiguredAgentNotice)()).toMatch(/helpful.*assistant/i);
180
+ });
181
+ (0, bun_test_1.test)("is deterministic", () => {
182
+ const url = "https://example.com";
183
+ (0, bun_test_1.expect)((0, agent_policy_1.buildUnconfiguredAgentNotice)(url)).toBe((0, agent_policy_1.buildUnconfiguredAgentNotice)(url));
184
+ });
185
+ });
186
+ // ── TOOL_INTENT_RULES structural invariants ───────────────────────────────────
187
+ (0, bun_test_1.describe)("TOOL_INTENT_RULES structural invariants", () => {
188
+ (0, bun_test_1.test)("every rule has a unique id", () => {
189
+ const ids = agent_policy_1.TOOL_INTENT_RULES.map((r) => r.id);
190
+ const unique = new Set(ids);
191
+ (0, bun_test_1.expect)(unique.size).toBe(ids.length);
192
+ });
193
+ (0, bun_test_1.test)("every rule has a non-empty title", () => {
194
+ for (const rule of agent_policy_1.TOOL_INTENT_RULES) {
195
+ (0, bun_test_1.expect)(rule.title.length).toBeGreaterThan(0);
196
+ }
197
+ });
198
+ (0, bun_test_1.test)("every rule has at least one tool", () => {
199
+ for (const rule of agent_policy_1.TOOL_INTENT_RULES) {
200
+ (0, bun_test_1.expect)(rule.tools.length).toBeGreaterThan(0);
201
+ }
202
+ });
203
+ (0, bun_test_1.test)("every rule has a positive numeric priority", () => {
204
+ for (const rule of agent_policy_1.TOOL_INTENT_RULES) {
205
+ (0, bun_test_1.expect)(rule.priority).toBeGreaterThan(0);
206
+ }
207
+ });
208
+ (0, bun_test_1.test)("non-alwaysInclude rules have at least one pattern", () => {
209
+ for (const rule of agent_policy_1.TOOL_INTENT_RULES) {
210
+ if (!rule.alwaysInclude) {
211
+ (0, bun_test_1.expect)(rule.patterns.length).toBeGreaterThan(0);
212
+ }
213
+ }
214
+ });
215
+ });
216
+ //# sourceMappingURL=agent-policy-harden.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-policy-harden.test.js","sourceRoot":"","sources":["../../src/__tests__/agent-policy-harden.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tests for agent-store.ts utility functions and type contracts.
3
+ *
4
+ * Only inferGrantKind is a runtime function here. The rest of the module
5
+ * is interface/type definitions. Tests focus on inferGrantKind's semantics.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=agent-store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-store.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/agent-store.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for agent-store.ts utility functions and type contracts.
4
+ *
5
+ * Only inferGrantKind is a runtime function here. The rest of the module
6
+ * is interface/type definitions. Tests focus on inferGrantKind's semantics.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const bun_test_1 = require("bun:test");
10
+ const agent_store_1 = require("../agent-store");
11
+ (0, bun_test_1.describe)("inferGrantKind", () => {
12
+ (0, bun_test_1.test)("patterns starting with / are mcp_tool grants", () => {
13
+ (0, bun_test_1.expect)((0, agent_store_1.inferGrantKind)("/mcp/gmail/tools/send_email")).toBe("mcp_tool");
14
+ });
15
+ (0, bun_test_1.test)("wildcard mcp tool pattern is mcp_tool", () => {
16
+ (0, bun_test_1.expect)((0, agent_store_1.inferGrantKind)("/mcp/linear/tools/*")).toBe("mcp_tool");
17
+ });
18
+ (0, bun_test_1.test)("bare hostname is a domain grant", () => {
19
+ (0, bun_test_1.expect)((0, agent_store_1.inferGrantKind)("api.github.com")).toBe("domain");
20
+ });
21
+ (0, bun_test_1.test)("wildcard domain (canonical form) is a domain grant", () => {
22
+ (0, bun_test_1.expect)((0, agent_store_1.inferGrantKind)(".example.com")).toBe("domain");
23
+ });
24
+ (0, bun_test_1.test)("wildcard domain (*.prefix) is a domain grant", () => {
25
+ (0, bun_test_1.expect)((0, agent_store_1.inferGrantKind)("*.example.com")).toBe("domain");
26
+ });
27
+ (0, bun_test_1.test)("empty string is a domain grant (doesn't start with /)", () => {
28
+ (0, bun_test_1.expect)((0, agent_store_1.inferGrantKind)("")).toBe("domain");
29
+ });
30
+ (0, bun_test_1.test)("star wildcard is a domain grant", () => {
31
+ (0, bun_test_1.expect)((0, agent_store_1.inferGrantKind)("*")).toBe("domain");
32
+ });
33
+ (0, bun_test_1.test)("URL with https:// is a domain grant", () => {
34
+ // URLs don't start with /
35
+ (0, bun_test_1.expect)((0, agent_store_1.inferGrantKind)("https://example.com")).toBe("domain");
36
+ });
37
+ });
38
+ //# sourceMappingURL=agent-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-store.test.js","sourceRoot":"","sources":["../../src/__tests__/agent-store.test.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAEH,uCAAkD;AAClD,gDAAgD;AAEhD,IAAA,mBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAA,eAAI,EAAC,8CAA8C,EAAE,GAAG,EAAE;QACxD,IAAA,iBAAM,EAAC,IAAA,4BAAc,EAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,IAAA,eAAI,EAAC,uCAAuC,EAAE,GAAG,EAAE;QACjD,IAAA,iBAAM,EAAC,IAAA,4BAAc,EAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,IAAA,eAAI,EAAC,iCAAiC,EAAE,GAAG,EAAE;QAC3C,IAAA,iBAAM,EAAC,IAAA,4BAAc,EAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAA,eAAI,EAAC,oDAAoD,EAAE,GAAG,EAAE;QAC9D,IAAA,iBAAM,EAAC,IAAA,4BAAc,EAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,IAAA,eAAI,EAAC,8CAA8C,EAAE,GAAG,EAAE;QACxD,IAAA,iBAAM,EAAC,IAAA,4BAAc,EAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAA,eAAI,EAAC,uDAAuD,EAAE,GAAG,EAAE;QACjE,IAAA,iBAAM,EAAC,IAAA,4BAAc,EAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,IAAA,eAAI,EAAC,iCAAiC,EAAE,GAAG,EAAE;QAC3C,IAAA,iBAAM,EAAC,IAAA,4BAAc,EAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAA,eAAI,EAAC,qCAAqC,EAAE,GAAG,EAAE;QAC/C,0BAA0B;QAC1B,IAAA,iBAAM,EAAC,IAAA,4BAAc,EAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tests for command-registry.ts.
3
+ *
4
+ * No prior tests existed for CommandRegistry. This file covers:
5
+ * register, get, getAll, tryHandle (success, not-found, handler-throws).
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=command-registry.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-registry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/command-registry.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for command-registry.ts.
4
+ *
5
+ * No prior tests existed for CommandRegistry. This file covers:
6
+ * register, get, getAll, tryHandle (success, not-found, handler-throws).
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const bun_test_1 = require("bun:test");
10
+ const command_registry_1 = require("../command-registry");
11
+ // ── Minimal context factory ───────────────────────────────────────────────────
12
+ function makeCtx(overrides) {
13
+ return {
14
+ userId: "user-1",
15
+ channelId: "C1",
16
+ args: "",
17
+ platform: "slack",
18
+ reply: (0, bun_test_1.mock)(async () => {
19
+ /* no-op test stub */
20
+ }),
21
+ ...overrides,
22
+ };
23
+ }
24
+ // ── register / get / getAll ──────────────────────────────────────────────────
25
+ (0, bun_test_1.describe)("CommandRegistry.register / get / getAll", () => {
26
+ (0, bun_test_1.test)("registered command is retrievable by name", () => {
27
+ const registry = new command_registry_1.CommandRegistry();
28
+ const cmd = {
29
+ name: "help",
30
+ description: "Show help",
31
+ handler: async () => {
32
+ /* no-op test stub */
33
+ },
34
+ };
35
+ registry.register(cmd);
36
+ (0, bun_test_1.expect)(registry.get("help")).toBe(cmd);
37
+ });
38
+ (0, bun_test_1.test)("get returns undefined for unknown command", () => {
39
+ const registry = new command_registry_1.CommandRegistry();
40
+ (0, bun_test_1.expect)(registry.get("unknown")).toBeUndefined();
41
+ });
42
+ (0, bun_test_1.test)("getAll returns all registered commands", () => {
43
+ const registry = new command_registry_1.CommandRegistry();
44
+ const a = {
45
+ name: "a",
46
+ description: "A",
47
+ handler: async () => {
48
+ /* no-op test stub */
49
+ },
50
+ };
51
+ const b = {
52
+ name: "b",
53
+ description: "B",
54
+ handler: async () => {
55
+ /* no-op test stub */
56
+ },
57
+ };
58
+ registry.register(a);
59
+ registry.register(b);
60
+ const all = registry.getAll();
61
+ (0, bun_test_1.expect)(all).toHaveLength(2);
62
+ (0, bun_test_1.expect)(all.map((c) => c.name).sort()).toEqual(["a", "b"]);
63
+ });
64
+ (0, bun_test_1.test)("getAll returns empty array when no commands registered", () => {
65
+ const registry = new command_registry_1.CommandRegistry();
66
+ (0, bun_test_1.expect)(registry.getAll()).toEqual([]);
67
+ });
68
+ (0, bun_test_1.test)("re-registering same name overwrites the previous command", () => {
69
+ const registry = new command_registry_1.CommandRegistry();
70
+ const first = {
71
+ name: "ping",
72
+ description: "v1",
73
+ handler: async () => {
74
+ /* no-op test stub */
75
+ },
76
+ };
77
+ const second = {
78
+ name: "ping",
79
+ description: "v2",
80
+ handler: async () => {
81
+ /* no-op test stub */
82
+ },
83
+ };
84
+ registry.register(first);
85
+ registry.register(second);
86
+ (0, bun_test_1.expect)(registry.get("ping")?.description).toBe("v2");
87
+ (0, bun_test_1.expect)(registry.getAll()).toHaveLength(1);
88
+ });
89
+ });
90
+ // ── tryHandle ────────────────────────────────────────────────────────────────
91
+ (0, bun_test_1.describe)("CommandRegistry.tryHandle", () => {
92
+ (0, bun_test_1.test)("returns false for unregistered command", async () => {
93
+ const registry = new command_registry_1.CommandRegistry();
94
+ const ctx = makeCtx();
95
+ const handled = await registry.tryHandle("nonexistent", ctx);
96
+ (0, bun_test_1.expect)(handled).toBe(false);
97
+ });
98
+ (0, bun_test_1.test)("returns true and calls handler for registered command", async () => {
99
+ const registry = new command_registry_1.CommandRegistry();
100
+ const handlerFn = (0, bun_test_1.mock)(async () => {
101
+ /* no-op test stub */
102
+ });
103
+ registry.register({
104
+ name: "ping",
105
+ description: "Ping",
106
+ handler: handlerFn,
107
+ });
108
+ const ctx = makeCtx({ args: "hello" });
109
+ const handled = await registry.tryHandle("ping", ctx);
110
+ (0, bun_test_1.expect)(handled).toBe(true);
111
+ (0, bun_test_1.expect)(handlerFn).toHaveBeenCalledTimes(1);
112
+ (0, bun_test_1.expect)(handlerFn).toHaveBeenCalledWith(ctx);
113
+ });
114
+ (0, bun_test_1.test)("handler receives the correct context", async () => {
115
+ const registry = new command_registry_1.CommandRegistry();
116
+ let receivedCtx = null;
117
+ registry.register({
118
+ name: "inspect",
119
+ description: "Inspect context",
120
+ handler: async (ctx) => {
121
+ receivedCtx = ctx;
122
+ },
123
+ });
124
+ const ctx = makeCtx({ userId: "u-42", channelId: "C99", args: "foo bar" });
125
+ await registry.tryHandle("inspect", ctx);
126
+ // Cast — TS narrows receivedCtx to `null` because the assignment happens
127
+ // inside an async callback the inference engine can't follow.
128
+ const got = receivedCtx;
129
+ (0, bun_test_1.expect)(got?.userId).toBe("u-42");
130
+ (0, bun_test_1.expect)(got?.channelId).toBe("C99");
131
+ (0, bun_test_1.expect)(got?.args).toBe("foo bar");
132
+ });
133
+ (0, bun_test_1.test)("handler error: still returns true and sends error reply", async () => {
134
+ const registry = new command_registry_1.CommandRegistry();
135
+ registry.register({
136
+ name: "boom",
137
+ description: "Throws",
138
+ handler: async () => {
139
+ throw new Error("handler exploded");
140
+ },
141
+ });
142
+ const replyFn = (0, bun_test_1.mock)(async () => {
143
+ /* no-op test stub */
144
+ });
145
+ const ctx = makeCtx({ reply: replyFn });
146
+ const handled = await registry.tryHandle("boom", ctx);
147
+ (0, bun_test_1.expect)(handled).toBe(true);
148
+ // reply should have been called once with an error message
149
+ (0, bun_test_1.expect)(replyFn).toHaveBeenCalledTimes(1);
150
+ const [replyArg] = replyFn.mock.calls[0];
151
+ (0, bun_test_1.expect)(typeof replyArg).toBe("string");
152
+ (0, bun_test_1.expect)(replyArg.toLowerCase()).toMatch(/wrong|error|try again/i);
153
+ });
154
+ (0, bun_test_1.test)("reply is NOT called when handler succeeds", async () => {
155
+ const registry = new command_registry_1.CommandRegistry();
156
+ const replyFn = (0, bun_test_1.mock)(async () => {
157
+ /* no-op test stub */
158
+ });
159
+ registry.register({
160
+ name: "ok",
161
+ description: "OK",
162
+ handler: async (ctx) => {
163
+ // handler calls reply itself, not the registry
164
+ await ctx.reply("custom response");
165
+ },
166
+ });
167
+ const ctx = makeCtx({ reply: replyFn });
168
+ await registry.tryHandle("ok", ctx);
169
+ // reply called exactly once — from the handler's explicit call, not the error path
170
+ (0, bun_test_1.expect)(replyFn).toHaveBeenCalledTimes(1);
171
+ (0, bun_test_1.expect)(replyFn.mock.calls[0][0]).toBe("custom response");
172
+ });
173
+ (0, bun_test_1.test)("independent registries do not share commands", async () => {
174
+ const r1 = new command_registry_1.CommandRegistry();
175
+ const r2 = new command_registry_1.CommandRegistry();
176
+ r1.register({
177
+ name: "shared",
178
+ description: "In r1",
179
+ handler: async () => {
180
+ /* no-op test stub */
181
+ },
182
+ });
183
+ (0, bun_test_1.expect)(r1.get("shared")).toBeDefined();
184
+ (0, bun_test_1.expect)(r2.get("shared")).toBeUndefined();
185
+ (0, bun_test_1.expect)(await r2.tryHandle("shared", makeCtx())).toBe(false);
186
+ });
187
+ });
188
+ //# sourceMappingURL=command-registry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-registry.test.js","sourceRoot":"","sources":["../../src/__tests__/command-registry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=encryption-key-validation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryption-key-validation.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/encryption-key-validation.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const bun_test_1 = require("bun:test");
4
+ const encryption_1 = require("../utils/encryption");
5
+ // Regression coverage for ENCRYPTION_KEY parsing: `Buffer.from(x, "base64")`
6
+ // silently drops invalid characters, so a typo'd key could yield a short or
7
+ // garbled key. Parsing must round-trip and length-check before trusting it.
8
+ (0, bun_test_1.describe)("ENCRYPTION_KEY validation", () => {
9
+ let originalKey;
10
+ (0, bun_test_1.beforeEach)(() => {
11
+ originalKey = process.env.ENCRYPTION_KEY;
12
+ });
13
+ (0, bun_test_1.afterEach)(() => {
14
+ if (originalKey !== undefined) {
15
+ process.env.ENCRYPTION_KEY = originalKey;
16
+ }
17
+ else {
18
+ delete process.env.ENCRYPTION_KEY;
19
+ }
20
+ });
21
+ (0, bun_test_1.test)("non-base64, non-hex junk key throws", () => {
22
+ process.env.ENCRYPTION_KEY = "this is not a valid key!! @#$%";
23
+ (0, bun_test_1.expect)(() => (0, encryption_1.encrypt)("x")).toThrow("ENCRYPTION_KEY");
24
+ });
25
+ (0, bun_test_1.test)("base64 string decoding to fewer than 32 bytes throws", () => {
26
+ // 16 bytes → 24-char canonical base64; passes the regex but is too short.
27
+ process.env.ENCRYPTION_KEY = Buffer.alloc(16, 9).toString("base64");
28
+ (0, bun_test_1.expect)(() => (0, encryption_1.encrypt)("x")).toThrow("ENCRYPTION_KEY");
29
+ });
30
+ (0, bun_test_1.test)("non-canonical base64 (chars that get silently dropped) throws", () => {
31
+ // Contains chars outside [A-Za-z0-9+/]; old code would drop them.
32
+ process.env.ENCRYPTION_KEY = `${Buffer.alloc(32, 1).toString("base64")}!!`;
33
+ (0, bun_test_1.expect)(() => (0, encryption_1.encrypt)("x")).toThrow("ENCRYPTION_KEY");
34
+ });
35
+ (0, bun_test_1.test)("valid 32-byte base64 key round-trips encrypt/decrypt", () => {
36
+ process.env.ENCRYPTION_KEY = Buffer.alloc(32, 42).toString("base64");
37
+ const enc = (0, encryption_1.encrypt)("base64 secret");
38
+ (0, bun_test_1.expect)((0, encryption_1.decrypt)(enc)).toBe("base64 secret");
39
+ });
40
+ (0, bun_test_1.test)("valid 64-char hex key round-trips encrypt/decrypt", () => {
41
+ process.env.ENCRYPTION_KEY =
42
+ "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef";
43
+ const enc = (0, encryption_1.encrypt)("hex secret");
44
+ (0, bun_test_1.expect)((0, encryption_1.decrypt)(enc)).toBe("hex secret");
45
+ });
46
+ (0, bun_test_1.test)("uppercase 64-char hex key round-trips encrypt/decrypt", () => {
47
+ process.env.ENCRYPTION_KEY =
48
+ "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF";
49
+ const enc = (0, encryption_1.encrypt)("hex upper secret");
50
+ (0, bun_test_1.expect)((0, encryption_1.decrypt)(enc)).toBe("hex upper secret");
51
+ });
52
+ });
53
+ //# sourceMappingURL=encryption-key-validation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryption-key-validation.test.js","sourceRoot":"","sources":["../../src/__tests__/encryption-key-validation.test.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ const encryption_1 = require("../utils/encryption");
9
9
  // 32-byte hex key
10
10
  process.env.ENCRYPTION_KEY =
11
11
  "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef";
12
+ (0, encryption_1.__resetEncryptionKeyCacheForTests)();
12
13
  });
13
14
  (0, bun_test_1.afterEach)(() => {
14
15
  if (originalKey !== undefined) {
@@ -17,6 +18,7 @@ const encryption_1 = require("../utils/encryption");
17
18
  else {
18
19
  delete process.env.ENCRYPTION_KEY;
19
20
  }
21
+ (0, encryption_1.__resetEncryptionKeyCacheForTests)();
20
22
  });
21
23
  (0, bun_test_1.test)("encrypt/decrypt round-trip preserves plaintext", () => {
22
24
  const plaintext = "hello world";
@@ -1 +1 @@
1
- {"version":3,"file":"encryption.test.js","sourceRoot":"","sources":["../../src/__tests__/encryption.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"encryption.test.js","sourceRoot":"","sources":["../../src/__tests__/encryption.test.ts"],"names":[],"mappings":"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"}