pi-harness-runtime 1.1.396 → 1.1.398

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 (236) hide show
  1. package/AGENTS.md +54 -7
  2. package/harness/notification-events.ts +6 -6
  3. package/index.ts +1 -1
  4. package/package.json +1 -1
  5. package/packages/a2a-adapter/package.json +1 -1
  6. package/packages/agent-policy/package.json +1 -1
  7. package/packages/architecture-generator/package.json +1 -1
  8. package/packages/auth/package.json +1 -1
  9. package/packages/autonomous-refactor/package.json +1 -1
  10. package/packages/autonomous-runtime/package.json +1 -1
  11. package/packages/cache-strategy/package.json +1 -1
  12. package/packages/capability-registry/package.json +1 -1
  13. package/packages/checkpoint/package.json +1 -1
  14. package/packages/cli-plugin-sdk/package.json +1 -1
  15. package/packages/clipboard/package.json +1 -1
  16. package/packages/clipboard-plugin/package.json +1 -1
  17. package/packages/code-generation/package.json +1 -1
  18. package/packages/code-review/package.json +1 -1
  19. package/packages/codex-adapter/package.json +1 -1
  20. package/packages/codex-watcher/package.json +1 -1
  21. package/packages/config-capture/package.json +1 -1
  22. package/packages/connection-runtime/package.json +1 -1
  23. package/packages/context-compiler/package.json +1 -1
  24. package/packages/context-discovery/package.json +1 -1
  25. package/packages/context-manager/package.json +1 -1
  26. package/packages/contracts/package.json +1 -1
  27. package/packages/cookie-sanitizer/package.json +1 -1
  28. package/packages/cost-optimizer/package.json +1 -1
  29. package/packages/dependency-analyzer/package.json +1 -1
  30. package/packages/django-plugin/package.json +1 -1
  31. package/packages/doc-generator/package.json +1 -1
  32. package/packages/durable-review/package.json +1 -1
  33. package/packages/e2e-tester/package.json +1 -1
  34. package/packages/evaluation-engine/package.json +1 -1
  35. package/packages/evaluation-runner/package.json +1 -1
  36. package/packages/event-bus/package.json +1 -1
  37. package/packages/event-sink/package.json +1 -1
  38. package/packages/event-store/package.json +1 -1
  39. package/packages/experience-replay/package.json +1 -1
  40. package/packages/feedback-collector/package.json +1 -1
  41. package/packages/file-copy-helper/package.json +1 -1
  42. package/packages/framework-detector/package.json +1 -1
  43. package/packages/framework-plugin-sdk/package.json +1 -1
  44. package/packages/frappe-plugin/package.json +1 -1
  45. package/packages/generic-web-plugin/package.json +1 -1
  46. package/packages/health-monitor/package.json +1 -1
  47. package/packages/intent-analyzer/package.json +1 -1
  48. package/packages/jev-judge/package.json +1 -1
  49. package/packages/knowledge-graph/package.json +1 -1
  50. package/packages/knowledge-retrieval/package.json +1 -1
  51. package/packages/laravel-plugin/package.json +1 -1
  52. package/packages/learning-engine/package.json +1 -1
  53. package/packages/logging/README.md +41 -6
  54. package/packages/logging/dist/classification.d.ts +65 -0
  55. package/packages/logging/dist/classification.d.ts.map +1 -0
  56. package/packages/logging/dist/classification.js +155 -0
  57. package/packages/logging/dist/classification.js.map +1 -0
  58. package/packages/logging/dist/config.d.ts +9 -0
  59. package/packages/logging/dist/config.d.ts.map +1 -1
  60. package/packages/logging/dist/config.js +40 -3
  61. package/packages/logging/dist/config.js.map +1 -1
  62. package/packages/logging/dist/index.d.ts +9 -1
  63. package/packages/logging/dist/index.d.ts.map +1 -1
  64. package/packages/logging/dist/index.js +10 -1
  65. package/packages/logging/dist/index.js.map +1 -1
  66. package/packages/logging/dist/ingest/schema.d.ts +60 -0
  67. package/packages/logging/dist/ingest/schema.d.ts.map +1 -0
  68. package/packages/logging/dist/ingest/schema.js +245 -0
  69. package/packages/logging/dist/ingest/schema.js.map +1 -0
  70. package/packages/logging/dist/installation.d.ts +32 -0
  71. package/packages/logging/dist/installation.d.ts.map +1 -0
  72. package/packages/logging/dist/installation.js +64 -0
  73. package/packages/logging/dist/installation.js.map +1 -0
  74. package/packages/logging/dist/sensitive-keys.d.ts +12 -0
  75. package/packages/logging/dist/sensitive-keys.d.ts.map +1 -0
  76. package/packages/logging/dist/sensitive-keys.js +39 -0
  77. package/packages/logging/dist/sensitive-keys.js.map +1 -0
  78. package/packages/logging/dist/server/credentials.d.ts +85 -0
  79. package/packages/logging/dist/server/credentials.d.ts.map +1 -0
  80. package/packages/logging/dist/server/credentials.js +147 -0
  81. package/packages/logging/dist/server/credentials.js.map +1 -0
  82. package/packages/logging/dist/server/http.d.ts +36 -0
  83. package/packages/logging/dist/server/http.d.ts.map +1 -0
  84. package/packages/logging/dist/server/http.js +139 -0
  85. package/packages/logging/dist/server/http.js.map +1 -0
  86. package/packages/logging/dist/server/index-store.d.ts +95 -0
  87. package/packages/logging/dist/server/index-store.d.ts.map +1 -0
  88. package/packages/logging/dist/server/index-store.js +190 -0
  89. package/packages/logging/dist/server/index-store.js.map +1 -0
  90. package/packages/logging/dist/server/index.d.ts +22 -0
  91. package/packages/logging/dist/server/index.d.ts.map +1 -0
  92. package/packages/logging/dist/server/index.js +15 -0
  93. package/packages/logging/dist/server/index.js.map +1 -0
  94. package/packages/logging/dist/server/keys.d.ts +22 -0
  95. package/packages/logging/dist/server/keys.d.ts.map +1 -0
  96. package/packages/logging/dist/server/keys.js +24 -0
  97. package/packages/logging/dist/server/keys.js.map +1 -0
  98. package/packages/logging/dist/server/outbox-worker.d.ts +55 -0
  99. package/packages/logging/dist/server/outbox-worker.d.ts.map +1 -0
  100. package/packages/logging/dist/server/outbox-worker.js +95 -0
  101. package/packages/logging/dist/server/outbox-worker.js.map +1 -0
  102. package/packages/logging/dist/server/outbox.d.ts +112 -0
  103. package/packages/logging/dist/server/outbox.d.ts.map +1 -0
  104. package/packages/logging/dist/server/outbox.js +247 -0
  105. package/packages/logging/dist/server/outbox.js.map +1 -0
  106. package/packages/logging/dist/server/service.d.ts +83 -0
  107. package/packages/logging/dist/server/service.d.ts.map +1 -0
  108. package/packages/logging/dist/server/service.js +144 -0
  109. package/packages/logging/dist/server/service.js.map +1 -0
  110. package/packages/logging/dist/shipper.d.ts +20 -4
  111. package/packages/logging/dist/shipper.d.ts.map +1 -1
  112. package/packages/logging/dist/shipper.js +31 -5
  113. package/packages/logging/dist/shipper.js.map +1 -1
  114. package/packages/logging/dist/singleton.d.ts.map +1 -1
  115. package/packages/logging/dist/singleton.js +3 -0
  116. package/packages/logging/dist/singleton.js.map +1 -1
  117. package/packages/logging/dist/types.d.ts +28 -1
  118. package/packages/logging/dist/types.d.ts.map +1 -1
  119. package/packages/logging/dist/types.js +8 -0
  120. package/packages/logging/dist/types.js.map +1 -1
  121. package/packages/logging/package.json +1 -1
  122. package/packages/logging/src/classification.ts +175 -0
  123. package/packages/logging/src/config.ts +60 -3
  124. package/packages/logging/src/index.ts +45 -1
  125. package/packages/logging/src/ingest/schema.ts +295 -0
  126. package/packages/logging/src/installation.ts +76 -0
  127. package/packages/logging/src/sensitive-keys.ts +40 -0
  128. package/packages/logging/src/server/credentials.ts +198 -0
  129. package/packages/logging/src/server/http.ts +170 -0
  130. package/packages/logging/src/server/index-store.ts +242 -0
  131. package/packages/logging/src/server/index.ts +56 -0
  132. package/packages/logging/src/server/keys.ts +32 -0
  133. package/packages/logging/src/server/outbox-worker.ts +124 -0
  134. package/packages/logging/src/server/outbox.ts +316 -0
  135. package/packages/logging/src/server/service.ts +196 -0
  136. package/packages/logging/src/shipper.ts +54 -8
  137. package/packages/logging/src/singleton.ts +3 -0
  138. package/packages/logging/src/types.ts +29 -1
  139. package/packages/logging/test/classification.test.ts +137 -0
  140. package/packages/logging/test/identity-transport.test.ts +197 -0
  141. package/packages/logging/test/ingest-schema.test.ts +184 -0
  142. package/packages/logging/test/integration.test.ts +9 -4
  143. package/packages/logging/test/log-http.test.ts +246 -0
  144. package/packages/logging/test/server.test.ts +444 -0
  145. package/packages/logging/test/shipper.test.ts +11 -11
  146. package/packages/logging/test/spool.test.ts +4 -1
  147. package/packages/mcp-adapter/package.json +1 -1
  148. package/packages/memory-engine/package.json +1 -1
  149. package/packages/milestone-manager/package.json +1 -1
  150. package/packages/model-registry/package.json +1 -1
  151. package/packages/nextjs-plugin/package.json +1 -1
  152. package/packages/notification/dist/adapters/detail-format.d.ts +34 -0
  153. package/packages/notification/dist/adapters/detail-format.d.ts.map +1 -0
  154. package/packages/notification/dist/adapters/detail-format.js +55 -0
  155. package/packages/notification/dist/adapters/detail-format.js.map +1 -0
  156. package/packages/notification/dist/adapters/email-adapter.d.ts.map +1 -1
  157. package/packages/notification/dist/adapters/email-adapter.js +3 -2
  158. package/packages/notification/dist/adapters/email-adapter.js.map +1 -1
  159. package/packages/notification/dist/adapters/line-adapter.d.ts.map +1 -1
  160. package/packages/notification/dist/adapters/line-adapter.js +3 -2
  161. package/packages/notification/dist/adapters/line-adapter.js.map +1 -1
  162. package/packages/notification/dist/adapters/ntfy-adapter.d.ts.map +1 -1
  163. package/packages/notification/dist/adapters/ntfy-adapter.js +3 -2
  164. package/packages/notification/dist/adapters/ntfy-adapter.js.map +1 -1
  165. package/packages/notification/dist/adapters/telegram-adapter.d.ts +14 -0
  166. package/packages/notification/dist/adapters/telegram-adapter.d.ts.map +1 -1
  167. package/packages/notification/dist/adapters/telegram-adapter.js +83 -67
  168. package/packages/notification/dist/adapters/telegram-adapter.js.map +1 -1
  169. package/packages/notification/dist/notification-center.d.ts.map +1 -1
  170. package/packages/notification/dist/notification-center.js +1 -0
  171. package/packages/notification/dist/notification-center.js.map +1 -1
  172. package/packages/notification/dist/types.d.ts +3 -0
  173. package/packages/notification/dist/types.d.ts.map +1 -1
  174. package/packages/notification/package.json +1 -1
  175. package/packages/notification/src/adapters/detail-format.ts +74 -0
  176. package/packages/notification/src/adapters/email-adapter.ts +3 -2
  177. package/packages/notification/src/adapters/line-adapter.ts +3 -2
  178. package/packages/notification/src/adapters/ntfy-adapter.ts +3 -2
  179. package/packages/notification/src/adapters/telegram-adapter.ts +92 -74
  180. package/packages/notification/src/notification-center.ts +1 -0
  181. package/packages/notification/src/types.ts +3 -0
  182. package/packages/notification/test/detail-format.test.ts +106 -0
  183. package/packages/observability/package.json +1 -1
  184. package/packages/okf-indexer/package.json +1 -1
  185. package/packages/paperclip-integration/package.json +1 -1
  186. package/packages/performance-optimizer/package.json +1 -1
  187. package/packages/permission-mode/package.json +1 -1
  188. package/packages/privilege-broker/package.json +1 -1
  189. package/packages/project-analyzer/package.json +1 -1
  190. package/packages/project-bootstrap/package.json +1 -1
  191. package/packages/projection-engine/package.json +1 -1
  192. package/packages/prompt-compiler/package.json +1 -1
  193. package/packages/prompt-versioning/package.json +1 -1
  194. package/packages/provider-adapter-sdk/package.json +1 -1
  195. package/packages/provider-router/package.json +1 -1
  196. package/packages/provider-selector/package.json +1 -1
  197. package/packages/providers/package.json +1 -1
  198. package/packages/qdrant-skills/package.json +1 -1
  199. package/packages/quota-manager/package.json +1 -1
  200. package/packages/rate-limiter/package.json +1 -1
  201. package/packages/react-vite-plugin/package.json +1 -1
  202. package/packages/relay/package.json +1 -1
  203. package/packages/release-manager/package.json +1 -1
  204. package/packages/requirement-compiler/package.json +1 -1
  205. package/packages/runtime/package.json +1 -1
  206. package/packages/scheduler/package.json +1 -1
  207. package/packages/scheduler-adapter/package.json +1 -1
  208. package/packages/session/package.json +1 -1
  209. package/packages/session-api/package.json +1 -1
  210. package/packages/session-export/package.json +1 -1
  211. package/packages/shared-context/package.json +1 -1
  212. package/packages/skill-mcp-client/package.json +1 -1
  213. package/packages/skill-registry/package.json +1 -1
  214. package/packages/skills/package.json +1 -1
  215. package/packages/sprint-planner/package.json +1 -1
  216. package/packages/subscription-engine/package.json +1 -1
  217. package/packages/task-compiler/package.json +1 -1
  218. package/packages/telegram/package.json +1 -1
  219. package/packages/tencentdb-memory/package.json +1 -1
  220. package/packages/tencentdb-sync/package.json +1 -1
  221. package/packages/test-data-generator/package.json +1 -1
  222. package/packages/test-generator/package.json +1 -1
  223. package/packages/todo-bd-sync/package.json +1 -1
  224. package/packages/token-estimation/package.json +1 -1
  225. package/packages/token-optimizer/package.json +1 -1
  226. package/packages/trajectory/package.json +1 -1
  227. package/packages/tui/package.json +1 -1
  228. package/packages/types/package.json +1 -1
  229. package/packages/voice-api/package.json +1 -1
  230. package/packages/webmcp-tester/package.json +1 -1
  231. package/packages/wiki/package.json +1 -1
  232. package/packages/workflow-events/package.json +1 -1
  233. package/packages/workspace-scanner/package.json +1 -1
  234. package/packages/worktree/package.json +1 -1
  235. package/packages/write-review/package.json +1 -1
  236. package/scripts/unified-webhook-server.ts +86 -81
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/server/credentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * HTTP surface of the log service.
3
+ *
4
+ * The handlers live here (not in the server script) so the whole request
5
+ * path - authentication, size limits, validation, durable acceptance - can
6
+ * be tested over a real socket.
7
+ *
8
+ * Routes:
9
+ * POST /api/logs accept a batch (202 after the durable write)
10
+ * POST /api/logs/query read-only, tenant scoped metadata query
11
+ * GET /api/logs/health queue depth, oldest pending age, failure count
12
+ */
13
+ import type { IncomingMessage, ServerResponse } from "node:http";
14
+ import type { LogIndexStore } from "./index-store.js";
15
+ import type { LogOutbox } from "./outbox.js";
16
+ import type { LogIngestService } from "./service.js";
17
+ export interface LogHttpOptions {
18
+ service: LogIngestService;
19
+ outbox: LogOutbox;
20
+ index: LogIndexStore;
21
+ /** Largest accepted ingest body. Default 2 MB. */
22
+ maxBodyBytes?: number;
23
+ /** Largest accepted query body. Default 64 KB. */
24
+ maxQueryBytes?: number;
25
+ /**
26
+ * Directory for a human readable copy of the accepted batches
27
+ * (`logs-<day>.ndjson`). Optional.
28
+ */
29
+ localCopyDir?: string;
30
+ }
31
+ export type LogHttpHandler = (req: IncomingMessage, res: ServerResponse) => Promise<void>;
32
+ /**
33
+ * Build the HTTP handler for the log routes.
34
+ */
35
+ export declare function createLogHttpHandler(options: LogHttpOptions): LogHttpHandler;
36
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,kBAAkB,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,aAAa,CAAC;IACrB,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAoC1F;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,cAAc,CA8F5E"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * HTTP surface of the log service.
3
+ *
4
+ * The handlers live here (not in the server script) so the whole request
5
+ * path - authentication, size limits, validation, durable acceptance - can
6
+ * be tested over a real socket.
7
+ *
8
+ * Routes:
9
+ * POST /api/logs accept a batch (202 after the durable write)
10
+ * POST /api/logs/query read-only, tenant scoped metadata query
11
+ * GET /api/logs/health queue depth, oldest pending age, failure count
12
+ */
13
+ import { appendFileSync, existsSync, mkdirSync } from "node:fs";
14
+ import { join } from "node:path";
15
+ import { readBearerToken } from "./credentials.js";
16
+ function sendJson(res, status, body) {
17
+ res.writeHead(status, { "Content-Type": "application/json" });
18
+ res.end(JSON.stringify(body));
19
+ }
20
+ async function readBody(req, maxBytes) {
21
+ const chunks = [];
22
+ let size = 0;
23
+ for await (const chunk of req) {
24
+ size += chunk.length;
25
+ if (size > maxBytes)
26
+ return null;
27
+ chunks.push(chunk);
28
+ }
29
+ return Buffer.concat(chunks);
30
+ }
31
+ /**
32
+ * Write a human readable copy of the accepted records next to the other
33
+ * server logs. Best effort: a failing copy never affects the request.
34
+ */
35
+ function writeLocalCopy(dir, payload) {
36
+ if (!dir)
37
+ return;
38
+ const records = payload.records;
39
+ if (!Array.isArray(records) || records.length === 0)
40
+ return;
41
+ try {
42
+ if (!existsSync(dir))
43
+ mkdirSync(dir, { recursive: true });
44
+ const day = new Date().toISOString().slice(0, 10);
45
+ const file = join(dir, `logs-${day}.ndjson`);
46
+ appendFileSync(file, `${records.map((record) => JSON.stringify(record)).join("\n")}\n`);
47
+ }
48
+ catch {
49
+ // The copy is a convenience, not a requirement.
50
+ }
51
+ }
52
+ /**
53
+ * Build the HTTP handler for the log routes.
54
+ */
55
+ export function createLogHttpHandler(options) {
56
+ const maxBodyBytes = options.maxBodyBytes ?? 2 * 1024 * 1024;
57
+ const maxQueryBytes = options.maxQueryBytes ?? 64 * 1024;
58
+ return async (req, res) => {
59
+ const url = new URL(req.url ?? "/", "http://localhost");
60
+ const token = readBearerToken(req.headers.authorization);
61
+ if (url.pathname === "/api/logs" && req.method === "POST") {
62
+ // Fail closed: without a credential the endpoint does not exist.
63
+ if (!options.service.configured) {
64
+ sendJson(res, 503, { error: "log ingest is not configured", code: "ingest_unconfigured" });
65
+ return;
66
+ }
67
+ if (!options.service.authenticate(token)) {
68
+ sendJson(res, 401, { error: "unauthorized", code: "unauthorized" });
69
+ return;
70
+ }
71
+ const raw = await readBody(req, maxBodyBytes);
72
+ if (!raw) {
73
+ sendJson(res, 413, { error: "payload too large", code: "payload_too_large" });
74
+ return;
75
+ }
76
+ let payload;
77
+ try {
78
+ payload = JSON.parse(raw.toString());
79
+ }
80
+ catch {
81
+ sendJson(res, 400, { error: "invalid json", code: "invalid_json" });
82
+ return;
83
+ }
84
+ const result = options.service.ingest(payload, token);
85
+ sendJson(res, result.status, result.body);
86
+ if (result.status === 202)
87
+ writeLocalCopy(options.localCopyDir, payload);
88
+ return;
89
+ }
90
+ if (url.pathname === "/api/logs/query" && req.method === "POST") {
91
+ if (!options.service.configured) {
92
+ sendJson(res, 503, { error: "log ingest is not configured", code: "ingest_unconfigured" });
93
+ return;
94
+ }
95
+ const raw = await readBody(req, maxQueryBytes);
96
+ if (!raw) {
97
+ sendJson(res, 413, { error: "payload too large", code: "payload_too_large" });
98
+ return;
99
+ }
100
+ let params = {};
101
+ if (raw.length > 0) {
102
+ try {
103
+ params = JSON.parse(raw.toString());
104
+ }
105
+ catch {
106
+ sendJson(res, 400, { error: "invalid json", code: "invalid_json" });
107
+ return;
108
+ }
109
+ }
110
+ const result = options.service.query({
111
+ installationId: params.installationId,
112
+ sessionId: params.sessionId,
113
+ since: params.since,
114
+ until: params.until,
115
+ levels: params.levels,
116
+ source: params.source,
117
+ event: params.event,
118
+ limit: params.limit,
119
+ cursor: params.cursor,
120
+ }, token);
121
+ sendJson(res, result.status, result.body);
122
+ return;
123
+ }
124
+ if (url.pathname === "/api/logs/health" && req.method === "GET") {
125
+ if (!options.service.configured) {
126
+ sendJson(res, 503, { configured: false });
127
+ return;
128
+ }
129
+ if (!options.service.authenticate(token)) {
130
+ sendJson(res, 401, { error: "unauthorized", code: "unauthorized" });
131
+ return;
132
+ }
133
+ sendJson(res, 200, { configured: true, outbox: options.outbox.stats() });
134
+ return;
135
+ }
136
+ sendJson(res, 404, { error: "not found" });
137
+ };
138
+ }
139
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Metadata index for the log query service.
3
+ *
4
+ * R2 is an archive, not a search API, so the server keeps a small metadata
5
+ * index next to it: tenant, machine, session, timestamp, severity,
6
+ * source/event, batch id and the object key of the archived batch.
7
+ *
8
+ * The index deliberately holds NO message text. Prompts, responses and
9
+ * command output never enter it, and an agent asking "which errors happened
10
+ * in this session" gets metadata, not content.
11
+ *
12
+ * Storage is one NDJSON file per tenant and day:
13
+ *
14
+ * <dir>/<tenant>/2026-10-24.ndjson
15
+ *
16
+ * The index is tenant scoped by construction: every query is filtered by the
17
+ * tenant of the authenticated caller, and the tenant of the request body is
18
+ * never used.
19
+ */
20
+ import type { LogLevel } from "../types.js";
21
+ import { type OutboxBatch } from "./outbox.js";
22
+ export interface LogIndexEntry {
23
+ tenantId: string;
24
+ installationId: string;
25
+ sessionId?: string;
26
+ ts: string;
27
+ level: LogLevel;
28
+ source: string;
29
+ event: string;
30
+ batchId: string;
31
+ /** Object key of the archived batch, when it was uploaded. */
32
+ r2Key?: string;
33
+ }
34
+ export interface LogQueryParams {
35
+ /** Tenant of the authenticated caller. Required. */
36
+ tenantId: string;
37
+ installationId?: string;
38
+ sessionId?: string;
39
+ /** ISO timestamp, inclusive lower bound. */
40
+ since?: string;
41
+ /** ISO timestamp, exclusive upper bound. */
42
+ until?: string;
43
+ levels?: LogLevel[];
44
+ source?: string;
45
+ event?: string;
46
+ /** Maximum number of entries. Default 100, hard maximum 500. */
47
+ limit?: number;
48
+ /** Opaque cursor of the previous page. */
49
+ cursor?: string;
50
+ }
51
+ export interface LogQueryResult {
52
+ entries: LogIndexEntry[];
53
+ /** Cursor of the next page, when there is one. */
54
+ nextCursor?: string;
55
+ hasMore: boolean;
56
+ /** Number of day files that were read. */
57
+ scannedFiles: number;
58
+ /** True when the scan hit its day budget. */
59
+ truncated: boolean;
60
+ }
61
+ export interface LogIndexStoreOptions {
62
+ dir: string;
63
+ /** Days a query may scan back. Default 7, hard maximum 31. */
64
+ maxScanDays?: number;
65
+ /** Entries per page by default. */
66
+ defaultLimit?: number;
67
+ /** Hard maximum of entries per page. */
68
+ maxLimit?: number;
69
+ }
70
+ export declare class LogIndexStore {
71
+ private readonly dir;
72
+ private readonly maxScanDays;
73
+ private readonly defaultLimit;
74
+ private readonly maxLimit;
75
+ constructor(options: LogIndexStoreOptions);
76
+ /**
77
+ * Index the metadata of a batch.
78
+ *
79
+ * Returns the number of entries that were written. The write is best
80
+ * effort: a failing index must not lose the batch itself.
81
+ */
82
+ append(batch: OutboxBatch, r2Key?: string): number;
83
+ /**
84
+ * Query the index for one tenant.
85
+ *
86
+ * The result is bounded by the page limit and by the day budget, and the
87
+ * caller is always a tenant: there is no way to query another tenant
88
+ * because the tenant comes from the parameter, which the server fills
89
+ * from the authenticated credential.
90
+ */
91
+ query(params: LogQueryParams): LogQueryResult;
92
+ private matches;
93
+ private dayRange;
94
+ }
95
+ //# sourceMappingURL=index-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-store.d.ts","sourceRoot":"","sources":["../../src/server/index-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,QAAQ,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC9B,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,SAAS,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAkBD,qBAAa,aAAa;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,YAAY,OAAO,EAAE,oBAAoB,EAKxC;IAED;;;;;OAKG;IACH,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CA6BjD;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAsD5C;IAED,OAAO,CAAC,OAAO;IAcf,OAAO,CAAC,QAAQ;CAoBhB"}
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Metadata index for the log query service.
3
+ *
4
+ * R2 is an archive, not a search API, so the server keeps a small metadata
5
+ * index next to it: tenant, machine, session, timestamp, severity,
6
+ * source/event, batch id and the object key of the archived batch.
7
+ *
8
+ * The index deliberately holds NO message text. Prompts, responses and
9
+ * command output never enter it, and an agent asking "which errors happened
10
+ * in this session" gets metadata, not content.
11
+ *
12
+ * Storage is one NDJSON file per tenant and day:
13
+ *
14
+ * <dir>/<tenant>/2026-10-24.ndjson
15
+ *
16
+ * The index is tenant scoped by construction: every query is filtered by the
17
+ * tenant of the authenticated caller, and the tenant of the request body is
18
+ * never used.
19
+ */
20
+ import { appendFileSync, existsSync, mkdirSync, readFileSync } from "node:fs";
21
+ import { join } from "node:path";
22
+ import { safeSegment } from "./outbox.js";
23
+ function toIsoDay(value) {
24
+ return value.toISOString().slice(0, 10);
25
+ }
26
+ function encodeCursor(value) {
27
+ return Buffer.from(value, "utf8").toString("base64url");
28
+ }
29
+ function decodeCursor(value) {
30
+ try {
31
+ return Buffer.from(value, "base64url").toString("utf8");
32
+ }
33
+ catch {
34
+ return undefined;
35
+ }
36
+ }
37
+ export class LogIndexStore {
38
+ dir;
39
+ maxScanDays;
40
+ defaultLimit;
41
+ maxLimit;
42
+ constructor(options) {
43
+ this.dir = options.dir;
44
+ this.maxScanDays = Math.min(options.maxScanDays ?? 7, 31);
45
+ this.defaultLimit = options.defaultLimit ?? 100;
46
+ this.maxLimit = options.maxLimit ?? 500;
47
+ }
48
+ /**
49
+ * Index the metadata of a batch.
50
+ *
51
+ * Returns the number of entries that were written. The write is best
52
+ * effort: a failing index must not lose the batch itself.
53
+ */
54
+ append(batch, r2Key) {
55
+ if (!Array.isArray(batch.records) || batch.records.length === 0)
56
+ return 0;
57
+ const lines = [];
58
+ for (const record of batch.records) {
59
+ const entry = {
60
+ tenantId: batch.tenantId,
61
+ installationId: batch.installationId,
62
+ ts: record.ts,
63
+ level: record.level,
64
+ source: record.source,
65
+ event: record.event,
66
+ batchId: batch.batchId,
67
+ };
68
+ if (batch.sessionId)
69
+ entry.sessionId = batch.sessionId;
70
+ else if (record.sessionId)
71
+ entry.sessionId = record.sessionId;
72
+ if (r2Key)
73
+ entry.r2Key = r2Key;
74
+ lines.push(JSON.stringify(entry));
75
+ }
76
+ try {
77
+ const day = toIsoDay(new Date(batch.sentAt));
78
+ const dir = join(this.dir, safeSegment(batch.tenantId));
79
+ mkdirSync(dir, { recursive: true });
80
+ appendFileSync(join(dir, `${day}.ndjson`), `${lines.join("\n")}\n`, { mode: 0o600 });
81
+ return lines.length;
82
+ }
83
+ catch {
84
+ return 0;
85
+ }
86
+ }
87
+ /**
88
+ * Query the index for one tenant.
89
+ *
90
+ * The result is bounded by the page limit and by the day budget, and the
91
+ * caller is always a tenant: there is no way to query another tenant
92
+ * because the tenant comes from the parameter, which the server fills
93
+ * from the authenticated credential.
94
+ */
95
+ query(params) {
96
+ const limit = Math.min(params.limit ?? this.defaultLimit, this.maxLimit);
97
+ const days = this.dayRange(params);
98
+ const dir = join(this.dir, safeSegment(params.tenantId));
99
+ const matches = [];
100
+ let scannedFiles = 0;
101
+ let truncated = days.truncated;
102
+ for (const day of days.days) {
103
+ const path = join(dir, `${day}.ndjson`);
104
+ if (!existsSync(path))
105
+ continue;
106
+ scannedFiles++;
107
+ let content;
108
+ try {
109
+ content = readFileSync(path, "utf8");
110
+ }
111
+ catch {
112
+ continue;
113
+ }
114
+ for (const line of content.split("\n")) {
115
+ if (!line.trim())
116
+ continue;
117
+ let entry;
118
+ try {
119
+ entry = JSON.parse(line);
120
+ }
121
+ catch {
122
+ continue;
123
+ }
124
+ if (!this.matches(entry, params))
125
+ continue;
126
+ matches.push(entry);
127
+ }
128
+ }
129
+ matches.sort((a, b) => (a.ts < b.ts ? -1 : a.ts > b.ts ? 1 : 0));
130
+ const cursor = params.cursor ? decodeCursor(params.cursor) : undefined;
131
+ let start = 0;
132
+ if (cursor) {
133
+ const index = matches.findIndex((entry) => `${entry.ts}|${entry.batchId}` === cursor);
134
+ start = index >= 0 ? index + 1 : 0;
135
+ }
136
+ const page = matches.slice(start, start + limit);
137
+ const hasMore = start + limit < matches.length;
138
+ const result = {
139
+ entries: page,
140
+ hasMore,
141
+ scannedFiles,
142
+ truncated,
143
+ };
144
+ if (hasMore && page.length > 0) {
145
+ const last = page[page.length - 1];
146
+ result.nextCursor = encodeCursor(`${last.ts}|${last.batchId}`);
147
+ }
148
+ return result;
149
+ }
150
+ matches(entry, params) {
151
+ if (entry.tenantId !== params.tenantId)
152
+ return false;
153
+ if (params.installationId && entry.installationId !== params.installationId)
154
+ return false;
155
+ if (params.sessionId && entry.sessionId !== params.sessionId)
156
+ return false;
157
+ if (params.levels && params.levels.length > 0 && !params.levels.includes(entry.level)) {
158
+ return false;
159
+ }
160
+ if (params.source && entry.source !== params.source)
161
+ return false;
162
+ if (params.event && entry.event !== params.event)
163
+ return false;
164
+ if (params.since && entry.ts < params.since)
165
+ return false;
166
+ if (params.until && entry.ts >= params.until)
167
+ return false;
168
+ return true;
169
+ }
170
+ dayRange(params) {
171
+ const now = new Date();
172
+ const until = params.until ? new Date(params.until) : now;
173
+ // The budget counts the scanned days, so the default window covers
174
+ // exactly `maxScanDays` days including the day of `until`.
175
+ const since = params.since
176
+ ? new Date(params.since)
177
+ : new Date(until.getTime() - (this.maxScanDays - 1) * 86_400_000);
178
+ const days = [];
179
+ const cursor = new Date(since);
180
+ let truncated = false;
181
+ while (cursor <= until && days.length < this.maxScanDays) {
182
+ days.push(toIsoDay(cursor));
183
+ cursor.setUTCDate(cursor.getUTCDate() + 1);
184
+ }
185
+ if (cursor <= until)
186
+ truncated = true;
187
+ return { days, truncated };
188
+ }
189
+ }
190
+ //# sourceMappingURL=index-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-store.js","sourceRoot":"","sources":["../../src/server/index-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Server side of the logging pipeline.
3
+ *
4
+ * The server is the only component that writes to the archive: clients ship
5
+ * batches to the ingest endpoint, the server derives the tenant from the
6
+ * credential, queues the batch durably and a worker uploads it.
7
+ */
8
+ export { DEFAULT_TENANT_ID, LOG_READ_SCOPE, LOG_WRITE_SCOPE, LogCredentialStore, hashToken, readBearerToken, } from "./credentials.js";
9
+ export type { AuthenticatedCredential, LogCredential, LogCredentialStoreOptions, } from "./credentials.js";
10
+ export { LogOutbox, outboxKey, safeSegment } from "./outbox.js";
11
+ export type { EnqueueResult, LogOutboxOptions, OutboxBatch, OutboxEntry, OutboxStats, } from "./outbox.js";
12
+ export { LogOutboxWorker } from "./outbox-worker.js";
13
+ export type { LogOutboxWorkerOptions, WorkerRunResult } from "./outbox-worker.js";
14
+ export { LogIndexStore } from "./index-store.js";
15
+ export type { LogIndexEntry, LogIndexStoreOptions, LogQueryParams, LogQueryResult, } from "./index-store.js";
16
+ export { serverObjectKey } from "./keys.js";
17
+ export type { ObjectKeyInput } from "./keys.js";
18
+ export { LogIngestService } from "./service.js";
19
+ export type { IngestFailure, IngestResult, IngestSuccess, LogIngestServiceOptions, QuerySuccess, } from "./service.js";
20
+ export { createLogHttpHandler } from "./http.js";
21
+ export type { LogHttpHandler, LogHttpOptions } from "./http.js";
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACN,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,SAAS,EACT,eAAe,GACf,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACX,uBAAuB,EACvB,aAAa,EACb,yBAAyB,GACzB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAChE,YAAY,EACX,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,WAAW,GACX,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAElF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EACX,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,cAAc,GACd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,YAAY,EACX,aAAa,EACb,YAAY,EACZ,aAAa,EACb,uBAAuB,EACvB,YAAY,GACZ,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Server side of the logging pipeline.
3
+ *
4
+ * The server is the only component that writes to the archive: clients ship
5
+ * batches to the ingest endpoint, the server derives the tenant from the
6
+ * credential, queues the batch durably and a worker uploads it.
7
+ */
8
+ export { DEFAULT_TENANT_ID, LOG_READ_SCOPE, LOG_WRITE_SCOPE, LogCredentialStore, hashToken, readBearerToken, } from "./credentials.js";
9
+ export { LogOutbox, outboxKey, safeSegment } from "./outbox.js";
10
+ export { LogOutboxWorker } from "./outbox-worker.js";
11
+ export { LogIndexStore } from "./index-store.js";
12
+ export { serverObjectKey } from "./keys.js";
13
+ export { LogIngestService } from "./service.js";
14
+ export { createLogHttpHandler } from "./http.js";
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACN,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,SAAS,EACT,eAAe,GACf,MAAM,kBAAkB,CAAC;AAO1B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAShE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQjD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAShD,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Deterministic object keys for the log archive.
3
+ *
4
+ * The server generates the keys - never the client - and they contain no
5
+ * user controlled path segment beyond an already sanitized tenant and batch
6
+ * id. The key is derived from the batch itself, so the same batch always
7
+ * lands under the same key and the metadata index can compute it without
8
+ * waiting for the upload.
9
+ */
10
+ export interface ObjectKeyInput {
11
+ tenantId: string;
12
+ batchId: string;
13
+ /** ISO timestamp used for the date partition. */
14
+ sentAt: string;
15
+ }
16
+ /**
17
+ * Build the archive key of a batch:
18
+ *
19
+ * logs/<tenant>/2026/10/24/09/<batchId>.ndjson
20
+ */
21
+ export declare function serverObjectKey(input: ObjectKeyInput): string;
22
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/server/keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAO7D"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Deterministic object keys for the log archive.
3
+ *
4
+ * The server generates the keys - never the client - and they contain no
5
+ * user controlled path segment beyond an already sanitized tenant and batch
6
+ * id. The key is derived from the batch itself, so the same batch always
7
+ * lands under the same key and the metadata index can compute it without
8
+ * waiting for the upload.
9
+ */
10
+ import { safeSegment } from "./outbox.js";
11
+ /**
12
+ * Build the archive key of a batch:
13
+ *
14
+ * logs/<tenant>/2026/10/24/09/<batchId>.ndjson
15
+ */
16
+ export function serverObjectKey(input) {
17
+ const date = new Date(input.sentAt);
18
+ const year = date.getUTCFullYear();
19
+ const month = String(date.getUTCMonth() + 1).padStart(2, "0");
20
+ const day = String(date.getUTCDate()).padStart(2, "0");
21
+ const hour = String(date.getUTCHours()).padStart(2, "0");
22
+ return `logs/${safeSegment(input.tenantId)}/${year}/${month}/${day}/${hour}/${safeSegment(input.batchId)}.ndjson`;
23
+ }
24
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/server/keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAS1C;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,KAAqB;IACpD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACzD,OAAO,QAAQ,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;AACnH,CAAC"}