sentinelayer-cli 0.4.5 → 0.8.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 (72) hide show
  1. package/README.md +16 -18
  2. package/package.json +7 -6
  3. package/src/agents/jules/config/definition.js +13 -62
  4. package/src/agents/jules/config/system-prompt.js +8 -1
  5. package/src/agents/jules/fix-cycle.js +12 -372
  6. package/src/agents/jules/loop.js +116 -26
  7. package/src/agents/jules/pulse.js +10 -327
  8. package/src/agents/jules/stream.js +13 -12
  9. package/src/agents/jules/swarm/orchestrator.js +3 -3
  10. package/src/agents/jules/swarm/sub-agent.js +6 -3
  11. package/src/agents/jules/tools/aidenid-email.js +189 -0
  12. package/src/agents/jules/tools/auth-audit.js +1187 -45
  13. package/src/agents/jules/tools/dispatch.js +25 -12
  14. package/src/agents/jules/tools/file-edit.js +2 -180
  15. package/src/agents/jules/tools/file-read.js +2 -100
  16. package/src/agents/jules/tools/glob.js +2 -168
  17. package/src/agents/jules/tools/grep.js +2 -228
  18. package/src/agents/jules/tools/path-guards.js +2 -161
  19. package/src/agents/jules/tools/runtime-audit.js +6 -2
  20. package/src/agents/jules/tools/shell.js +2 -383
  21. package/src/agents/persona-visuals.js +64 -0
  22. package/src/agents/shared-tools/dispatch-core.js +320 -0
  23. package/src/agents/shared-tools/file-edit.js +180 -0
  24. package/src/agents/shared-tools/file-read.js +100 -0
  25. package/src/agents/shared-tools/glob.js +168 -0
  26. package/src/agents/shared-tools/grep.js +228 -0
  27. package/src/agents/shared-tools/index.js +46 -0
  28. package/src/agents/shared-tools/path-guards.js +161 -0
  29. package/src/agents/shared-tools/shell.js +383 -0
  30. package/src/ai/aidenid.js +56 -7
  31. package/src/ai/client.js +45 -0
  32. package/src/ai/proxy.js +137 -0
  33. package/src/auth/gate.js +290 -16
  34. package/src/auth/http.js +450 -39
  35. package/src/auth/service.js +262 -47
  36. package/src/auth/session-store.js +475 -21
  37. package/src/cli.js +5 -0
  38. package/src/commands/audit.js +13 -8
  39. package/src/commands/auth.js +53 -9
  40. package/src/commands/omargate.js +10 -2
  41. package/src/commands/scan.js +10 -4
  42. package/src/commands/session.js +590 -0
  43. package/src/commands/spec.js +62 -0
  44. package/src/commands/watch.js +3 -2
  45. package/src/daemon/assignment-ledger.js +196 -0
  46. package/src/daemon/error-worker.js +599 -16
  47. package/src/daemon/fix-cycle.js +384 -0
  48. package/src/daemon/ingest-refresh.js +10 -9
  49. package/src/daemon/jira-lifecycle.js +135 -0
  50. package/src/daemon/pulse.js +327 -0
  51. package/src/daemon/scope-engine.js +1068 -0
  52. package/src/events/schema.js +190 -0
  53. package/src/interactive/index.js +18 -16
  54. package/src/legacy-cli.js +606 -37
  55. package/src/prompt/generator.js +19 -1
  56. package/src/review/ai-review.js +11 -1
  57. package/src/review/local-review.js +75 -19
  58. package/src/review/omargate-interactive.js +68 -0
  59. package/src/review/omargate-orchestrator.js +404 -0
  60. package/src/review/persona-prompts.js +296 -0
  61. package/src/review/scan-modes.js +48 -0
  62. package/src/scan/generator.js +1 -1
  63. package/src/session/agent-registry.js +352 -0
  64. package/src/session/daemon.js +801 -0
  65. package/src/session/paths.js +33 -0
  66. package/src/session/runtime-bridge.js +739 -0
  67. package/src/session/store.js +388 -0
  68. package/src/session/stream.js +325 -0
  69. package/src/spec/generator.js +100 -0
  70. package/src/telemetry/session-tracker.js +148 -32
  71. package/src/telemetry/sync.js +6 -2
  72. package/src/ui/command-hints.js +13 -0
@@ -0,0 +1,189 @@
1
+ /**
2
+ * AIdenID email tool for agent testing.
3
+ *
4
+ * Allows agents to provision ephemeral email addresses, read inbox,
5
+ * and extract OTPs for E2E testing of authentication flows.
6
+ */
7
+
8
+ import {
9
+ provisionEmailIdentity,
10
+ getLatestIdentityExtraction,
11
+ resolveAidenIdCredentials,
12
+ normalizeAidenIdApiUrl,
13
+ } from "../../../ai/aidenid.js";
14
+ import { readStoredSession } from "../../../auth/session-store.js";
15
+ import { fetchAidenIdCredentials } from "../../../auth/service.js";
16
+
17
+ /**
18
+ * AIdenID email tool definition for agent dispatch.
19
+ */
20
+ export const AIDENID_EMAIL_TOOL = {
21
+ name: "AidenIdEmail",
22
+ description:
23
+ "Provision ephemeral test email addresses via AIdenID for E2E testing. " +
24
+ "Operations: provision (create email), wait_for_otp (poll for OTP extraction), status (check identity).",
25
+ parameters: {
26
+ type: "object",
27
+ properties: {
28
+ operation: {
29
+ type: "string",
30
+ enum: ["provision", "wait_for_otp", "status"],
31
+ description: "Operation to perform",
32
+ },
33
+ identity_id: {
34
+ type: "string",
35
+ description: "Identity ID (required for wait_for_otp and status)",
36
+ },
37
+ tags: {
38
+ type: "string",
39
+ description: "Comma-separated tags for provisioning (e.g., 'e2e,security-test')",
40
+ },
41
+ timeout_seconds: {
42
+ type: "number",
43
+ description: "Timeout for wait_for_otp in seconds (default: 30)",
44
+ },
45
+ },
46
+ required: ["operation"],
47
+ },
48
+ };
49
+
50
+ /**
51
+ * Execute AIdenID email tool operation.
52
+ *
53
+ * @param {object} input - Tool input from agent
54
+ * @param {object} [ctx] - Tool context
55
+ * @returns {Promise<object>} Tool result
56
+ */
57
+ export async function executeAidenIdEmailTool(input, ctx = {}) {
58
+ const operation = String(input.operation || "").trim();
59
+
60
+ let session = null;
61
+ try {
62
+ session = await readStoredSession();
63
+ } catch {
64
+ // no session
65
+ }
66
+
67
+ const makeFetcher = () => {
68
+ if (!session || !session.token) return null;
69
+ return () => fetchAidenIdCredentials({ apiUrl: session.apiUrl, token: session.token });
70
+ };
71
+
72
+ const credentials = await resolveAidenIdCredentials({
73
+ env: process.env,
74
+ requireAll: true,
75
+ session,
76
+ fetchCredentials: makeFetcher(),
77
+ });
78
+
79
+ const apiUrl = normalizeAidenIdApiUrl(process.env.AIDENID_API_URL || "https://api.aidenid.com");
80
+
81
+ switch (operation) {
82
+ case "provision": {
83
+ const tags = String(input.tags || "e2e").split(",").map((t) => t.trim()).filter(Boolean);
84
+ const result = await provisionEmailIdentity({
85
+ apiUrl,
86
+ apiKey: credentials.apiKey,
87
+ orgId: credentials.orgId,
88
+ projectId: credentials.projectId,
89
+ idempotencyKey: `agent-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
90
+ payload: {
91
+ tags,
92
+ ttlHours: 24,
93
+ receiveMode: "EDGE_ACCEPT",
94
+ allowWebhooks: true,
95
+ extractionTypes: ["otp", "link"],
96
+ },
97
+ });
98
+
99
+ return {
100
+ success: true,
101
+ operation: "provision",
102
+ identityId: result.response?.id || null,
103
+ email: result.response?.emailAddress || null,
104
+ status: result.response?.status || null,
105
+ expiresAt: result.response?.expiresAt || null,
106
+ };
107
+ }
108
+
109
+ case "wait_for_otp": {
110
+ const identityId = String(input.identity_id || "").trim();
111
+ if (!identityId) {
112
+ return { success: false, error: "identity_id is required for wait_for_otp" };
113
+ }
114
+
115
+ const timeoutSeconds = Number(input.timeout_seconds) || 30;
116
+ const intervalMs = 2000;
117
+ const maxAttempts = Math.ceil((timeoutSeconds * 1000) / intervalMs);
118
+
119
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
120
+ const extraction = await getLatestIdentityExtraction({
121
+ apiUrl,
122
+ apiKey: credentials.apiKey,
123
+ orgId: credentials.orgId,
124
+ projectId: credentials.projectId,
125
+ identityId,
126
+ });
127
+
128
+ const otp = extraction?.response?.otp;
129
+ const confidence = extraction?.response?.confidence || 0;
130
+
131
+ if (otp && confidence >= 0.7) {
132
+ return {
133
+ success: true,
134
+ operation: "wait_for_otp",
135
+ identityId,
136
+ otp,
137
+ confidence,
138
+ source: extraction.response?.source || "unknown",
139
+ attempts: attempt + 1,
140
+ };
141
+ }
142
+
143
+ if (attempt < maxAttempts - 1) {
144
+ await new Promise((r) => setTimeout(r, intervalMs));
145
+ }
146
+ }
147
+
148
+ return {
149
+ success: false,
150
+ operation: "wait_for_otp",
151
+ identityId,
152
+ error: `OTP not received within ${timeoutSeconds}s`,
153
+ attempts: maxAttempts,
154
+ };
155
+ }
156
+
157
+ case "status": {
158
+ const identityId = String(input.identity_id || "").trim();
159
+ if (!identityId) {
160
+ return { success: false, error: "identity_id is required for status" };
161
+ }
162
+
163
+ // Status check via extraction endpoint (lightweight)
164
+ try {
165
+ const extraction = await getLatestIdentityExtraction({
166
+ apiUrl,
167
+ apiKey: credentials.apiKey,
168
+ orgId: credentials.orgId,
169
+ projectId: credentials.projectId,
170
+ identityId,
171
+ });
172
+
173
+ return {
174
+ success: true,
175
+ operation: "status",
176
+ identityId,
177
+ hasExtraction: Boolean(extraction?.response),
178
+ otp: extraction?.response?.otp || null,
179
+ confidence: extraction?.response?.confidence || 0,
180
+ };
181
+ } catch (err) {
182
+ return { success: false, operation: "status", identityId, error: err.message };
183
+ }
184
+ }
185
+
186
+ default:
187
+ return { success: false, error: `Unknown operation: ${operation}. Use: provision, wait_for_otp, status` };
188
+ }
189
+ }