pi-harness-runtime 1.1.395 → 1.1.397

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 (210) hide show
  1. package/AGENTS.md +64 -8
  2. package/package.json +1 -1
  3. package/packages/a2a-adapter/package.json +1 -1
  4. package/packages/agent-policy/package.json +1 -1
  5. package/packages/architecture-generator/package.json +1 -1
  6. package/packages/auth/package.json +1 -1
  7. package/packages/autonomous-refactor/package.json +1 -1
  8. package/packages/autonomous-runtime/package.json +1 -1
  9. package/packages/cache-strategy/package.json +1 -1
  10. package/packages/capability-registry/package.json +1 -1
  11. package/packages/checkpoint/package.json +1 -1
  12. package/packages/cli-plugin-sdk/package.json +1 -1
  13. package/packages/clipboard/package.json +1 -1
  14. package/packages/clipboard-plugin/package.json +1 -1
  15. package/packages/code-generation/package.json +1 -1
  16. package/packages/code-review/package.json +1 -1
  17. package/packages/codex-adapter/package.json +1 -1
  18. package/packages/codex-watcher/package.json +1 -1
  19. package/packages/config-capture/package.json +1 -1
  20. package/packages/connection-runtime/package.json +1 -1
  21. package/packages/context-compiler/package.json +1 -1
  22. package/packages/context-discovery/package.json +1 -1
  23. package/packages/context-manager/package.json +1 -1
  24. package/packages/contracts/dist/workspace-env-format.d.ts +24 -0
  25. package/packages/contracts/dist/workspace-env-format.js +41 -1
  26. package/packages/contracts/dist/workspace-env.js +7 -4
  27. package/packages/contracts/package.json +1 -1
  28. package/packages/contracts/src/workspace-env-format.ts +38 -1
  29. package/packages/contracts/src/workspace-env.ts +8 -3
  30. package/packages/contracts/test/workspace-env.test.ts +48 -0
  31. package/packages/cookie-sanitizer/package.json +1 -1
  32. package/packages/cost-optimizer/package.json +1 -1
  33. package/packages/dependency-analyzer/package.json +1 -1
  34. package/packages/django-plugin/package.json +1 -1
  35. package/packages/doc-generator/package.json +1 -1
  36. package/packages/durable-review/package.json +1 -1
  37. package/packages/e2e-tester/package.json +1 -1
  38. package/packages/evaluation-engine/package.json +1 -1
  39. package/packages/evaluation-runner/package.json +1 -1
  40. package/packages/event-bus/package.json +1 -1
  41. package/packages/event-sink/package.json +1 -1
  42. package/packages/event-store/package.json +1 -1
  43. package/packages/experience-replay/package.json +1 -1
  44. package/packages/feedback-collector/package.json +1 -1
  45. package/packages/file-copy-helper/package.json +1 -1
  46. package/packages/framework-detector/package.json +1 -1
  47. package/packages/framework-plugin-sdk/package.json +1 -1
  48. package/packages/frappe-plugin/package.json +1 -1
  49. package/packages/generic-web-plugin/package.json +1 -1
  50. package/packages/health-monitor/package.json +1 -1
  51. package/packages/intent-analyzer/package.json +1 -1
  52. package/packages/jev-judge/package.json +1 -1
  53. package/packages/knowledge-graph/package.json +1 -1
  54. package/packages/knowledge-retrieval/package.json +1 -1
  55. package/packages/laravel-plugin/package.json +1 -1
  56. package/packages/learning-engine/package.json +1 -1
  57. package/packages/logging/README.md +41 -6
  58. package/packages/logging/dist/classification.d.ts +65 -0
  59. package/packages/logging/dist/classification.d.ts.map +1 -0
  60. package/packages/logging/dist/classification.js +155 -0
  61. package/packages/logging/dist/classification.js.map +1 -0
  62. package/packages/logging/dist/config.d.ts +9 -0
  63. package/packages/logging/dist/config.d.ts.map +1 -1
  64. package/packages/logging/dist/config.js +40 -3
  65. package/packages/logging/dist/config.js.map +1 -1
  66. package/packages/logging/dist/index.d.ts +9 -1
  67. package/packages/logging/dist/index.d.ts.map +1 -1
  68. package/packages/logging/dist/index.js +10 -1
  69. package/packages/logging/dist/index.js.map +1 -1
  70. package/packages/logging/dist/ingest/schema.d.ts +60 -0
  71. package/packages/logging/dist/ingest/schema.d.ts.map +1 -0
  72. package/packages/logging/dist/ingest/schema.js +245 -0
  73. package/packages/logging/dist/ingest/schema.js.map +1 -0
  74. package/packages/logging/dist/installation.d.ts +32 -0
  75. package/packages/logging/dist/installation.d.ts.map +1 -0
  76. package/packages/logging/dist/installation.js +64 -0
  77. package/packages/logging/dist/installation.js.map +1 -0
  78. package/packages/logging/dist/sensitive-keys.d.ts +12 -0
  79. package/packages/logging/dist/sensitive-keys.d.ts.map +1 -0
  80. package/packages/logging/dist/sensitive-keys.js +39 -0
  81. package/packages/logging/dist/sensitive-keys.js.map +1 -0
  82. package/packages/logging/dist/server/credentials.d.ts +85 -0
  83. package/packages/logging/dist/server/credentials.d.ts.map +1 -0
  84. package/packages/logging/dist/server/credentials.js +147 -0
  85. package/packages/logging/dist/server/credentials.js.map +1 -0
  86. package/packages/logging/dist/server/http.d.ts +36 -0
  87. package/packages/logging/dist/server/http.d.ts.map +1 -0
  88. package/packages/logging/dist/server/http.js +139 -0
  89. package/packages/logging/dist/server/http.js.map +1 -0
  90. package/packages/logging/dist/server/index-store.d.ts +95 -0
  91. package/packages/logging/dist/server/index-store.d.ts.map +1 -0
  92. package/packages/logging/dist/server/index-store.js +190 -0
  93. package/packages/logging/dist/server/index-store.js.map +1 -0
  94. package/packages/logging/dist/server/index.d.ts +22 -0
  95. package/packages/logging/dist/server/index.d.ts.map +1 -0
  96. package/packages/logging/dist/server/index.js +15 -0
  97. package/packages/logging/dist/server/index.js.map +1 -0
  98. package/packages/logging/dist/server/keys.d.ts +22 -0
  99. package/packages/logging/dist/server/keys.d.ts.map +1 -0
  100. package/packages/logging/dist/server/keys.js +24 -0
  101. package/packages/logging/dist/server/keys.js.map +1 -0
  102. package/packages/logging/dist/server/outbox-worker.d.ts +55 -0
  103. package/packages/logging/dist/server/outbox-worker.d.ts.map +1 -0
  104. package/packages/logging/dist/server/outbox-worker.js +95 -0
  105. package/packages/logging/dist/server/outbox-worker.js.map +1 -0
  106. package/packages/logging/dist/server/outbox.d.ts +112 -0
  107. package/packages/logging/dist/server/outbox.d.ts.map +1 -0
  108. package/packages/logging/dist/server/outbox.js +247 -0
  109. package/packages/logging/dist/server/outbox.js.map +1 -0
  110. package/packages/logging/dist/server/service.d.ts +83 -0
  111. package/packages/logging/dist/server/service.d.ts.map +1 -0
  112. package/packages/logging/dist/server/service.js +144 -0
  113. package/packages/logging/dist/server/service.js.map +1 -0
  114. package/packages/logging/dist/shipper.d.ts +20 -4
  115. package/packages/logging/dist/shipper.d.ts.map +1 -1
  116. package/packages/logging/dist/shipper.js +31 -5
  117. package/packages/logging/dist/shipper.js.map +1 -1
  118. package/packages/logging/dist/singleton.d.ts.map +1 -1
  119. package/packages/logging/dist/singleton.js +3 -0
  120. package/packages/logging/dist/singleton.js.map +1 -1
  121. package/packages/logging/dist/types.d.ts +28 -1
  122. package/packages/logging/dist/types.d.ts.map +1 -1
  123. package/packages/logging/dist/types.js +8 -0
  124. package/packages/logging/dist/types.js.map +1 -1
  125. package/packages/logging/package.json +1 -1
  126. package/packages/logging/src/classification.ts +175 -0
  127. package/packages/logging/src/config.ts +60 -3
  128. package/packages/logging/src/index.ts +45 -1
  129. package/packages/logging/src/ingest/schema.ts +295 -0
  130. package/packages/logging/src/installation.ts +76 -0
  131. package/packages/logging/src/sensitive-keys.ts +40 -0
  132. package/packages/logging/src/server/credentials.ts +198 -0
  133. package/packages/logging/src/server/http.ts +170 -0
  134. package/packages/logging/src/server/index-store.ts +242 -0
  135. package/packages/logging/src/server/index.ts +56 -0
  136. package/packages/logging/src/server/keys.ts +32 -0
  137. package/packages/logging/src/server/outbox-worker.ts +124 -0
  138. package/packages/logging/src/server/outbox.ts +316 -0
  139. package/packages/logging/src/server/service.ts +196 -0
  140. package/packages/logging/src/shipper.ts +54 -8
  141. package/packages/logging/src/singleton.ts +3 -0
  142. package/packages/logging/src/types.ts +29 -1
  143. package/packages/logging/test/classification.test.ts +137 -0
  144. package/packages/logging/test/identity-transport.test.ts +197 -0
  145. package/packages/logging/test/ingest-schema.test.ts +184 -0
  146. package/packages/logging/test/integration.test.ts +9 -4
  147. package/packages/logging/test/log-http.test.ts +246 -0
  148. package/packages/logging/test/server.test.ts +444 -0
  149. package/packages/logging/test/shipper.test.ts +11 -11
  150. package/packages/logging/test/spool.test.ts +4 -1
  151. package/packages/mcp-adapter/package.json +1 -1
  152. package/packages/memory-engine/package.json +1 -1
  153. package/packages/milestone-manager/package.json +1 -1
  154. package/packages/model-registry/package.json +1 -1
  155. package/packages/nextjs-plugin/package.json +1 -1
  156. package/packages/notification/package.json +1 -1
  157. package/packages/observability/package.json +1 -1
  158. package/packages/okf-indexer/package.json +1 -1
  159. package/packages/paperclip-integration/package.json +1 -1
  160. package/packages/performance-optimizer/package.json +1 -1
  161. package/packages/permission-mode/package.json +1 -1
  162. package/packages/privilege-broker/package.json +1 -1
  163. package/packages/project-analyzer/package.json +1 -1
  164. package/packages/project-bootstrap/package.json +1 -1
  165. package/packages/projection-engine/package.json +1 -1
  166. package/packages/prompt-compiler/package.json +1 -1
  167. package/packages/prompt-versioning/package.json +1 -1
  168. package/packages/provider-adapter-sdk/package.json +1 -1
  169. package/packages/provider-router/package.json +1 -1
  170. package/packages/provider-selector/package.json +1 -1
  171. package/packages/providers/package.json +1 -1
  172. package/packages/qdrant-skills/package.json +1 -1
  173. package/packages/quota-manager/package.json +1 -1
  174. package/packages/rate-limiter/package.json +1 -1
  175. package/packages/react-vite-plugin/package.json +1 -1
  176. package/packages/relay/package.json +1 -1
  177. package/packages/release-manager/package.json +1 -1
  178. package/packages/requirement-compiler/package.json +1 -1
  179. package/packages/runtime/package.json +1 -1
  180. package/packages/scheduler/package.json +1 -1
  181. package/packages/scheduler-adapter/package.json +1 -1
  182. package/packages/session/package.json +1 -1
  183. package/packages/session-api/package.json +1 -1
  184. package/packages/session-export/package.json +1 -1
  185. package/packages/shared-context/package.json +1 -1
  186. package/packages/skill-mcp-client/package.json +1 -1
  187. package/packages/skill-registry/package.json +1 -1
  188. package/packages/skills/package.json +1 -1
  189. package/packages/sprint-planner/package.json +1 -1
  190. package/packages/subscription-engine/package.json +1 -1
  191. package/packages/task-compiler/package.json +1 -1
  192. package/packages/telegram/package.json +1 -1
  193. package/packages/tencentdb-memory/package.json +1 -1
  194. package/packages/tencentdb-sync/package.json +1 -1
  195. package/packages/test-data-generator/package.json +1 -1
  196. package/packages/test-generator/package.json +1 -1
  197. package/packages/todo-bd-sync/package.json +1 -1
  198. package/packages/token-estimation/package.json +1 -1
  199. package/packages/token-optimizer/package.json +1 -1
  200. package/packages/trajectory/package.json +1 -1
  201. package/packages/tui/package.json +1 -1
  202. package/packages/types/package.json +1 -1
  203. package/packages/voice-api/package.json +1 -1
  204. package/packages/webmcp-tester/package.json +1 -1
  205. package/packages/wiki/package.json +1 -1
  206. package/packages/workflow-events/package.json +1 -1
  207. package/packages/workspace-scanner/package.json +1 -1
  208. package/packages/worktree/package.json +1 -1
  209. package/packages/write-review/package.json +1 -1
  210. package/scripts/unified-webhook-server.ts +86 -81
@@ -12,6 +12,8 @@ import { homedir } from "node:os";
12
12
  import { join } from "node:path";
13
13
  import { createR2Transport } from "./transports/r2.js";
14
14
  import { createWebhookTransport } from "./transports/webhook.js";
15
+ import { resolveInstallationId } from "./installation.js";
16
+ import { DEFAULT_CLASSIFICATION_POLICY, } from "./classification.js";
15
17
  function readKeyFile(keysDir, name) {
16
18
  const file = join(keysDir, name);
17
19
  if (!existsSync(file))
@@ -32,6 +34,19 @@ export function defaultKeysDir() {
32
34
  export function defaultSpoolDir() {
33
35
  return join(homedir(), ".pi-harness-runtime", "logs", "spool");
34
36
  }
37
+ /**
38
+ * Build the classification policy.
39
+ *
40
+ * `PI_LOG_DIAGNOSTIC=1` is the explicit, user controlled diagnostic mode: it
41
+ * lets messages travel that the default policy keeps local. It never widens
42
+ * the event allowlist - only the message rule.
43
+ */
44
+ function classificationFor(env) {
45
+ const diagnostic = env.PI_LOG_DIAGNOSTIC === "1" || env.PI_LOG_DIAGNOSTIC === "true";
46
+ if (!diagnostic)
47
+ return DEFAULT_CLASSIFICATION_POLICY;
48
+ return { ...DEFAULT_CLASSIFICATION_POLICY, allowRawMessages: true };
49
+ }
35
50
  /**
36
51
  * Build the log sink configuration from the environment and the key files.
37
52
  */
@@ -40,14 +55,17 @@ export function resolveLogSinkConfig(options = {}) {
40
55
  const keysDir = options.keysDir ?? defaultKeysDir();
41
56
  const mode = (env.PI_LOG_SINK ?? "auto");
42
57
  const notes = [];
58
+ const installationId = options.installationId ?? env.PI_LOG_INSTALLATION_ID ?? resolveInstallationId();
43
59
  if (mode === "off") {
44
60
  return {
45
61
  enabled: false,
46
62
  app: env.PI_LOG_APP ?? "pi-harness",
63
+ installationId,
47
64
  transports: [],
48
65
  sampling: {},
49
66
  buffer: {},
50
67
  flushIntervalMs: 0,
68
+ classification: classificationFor(env),
51
69
  notes: ["logging disabled by PI_LOG_SINK=off"],
52
70
  };
53
71
  }
@@ -60,7 +78,19 @@ export function resolveLogSinkConfig(options = {}) {
60
78
  readKeyFile(keysDir, "r2-endpoint.txt") ??
61
79
  (accountId ? `https://${accountId}.r2.cloudflarestorage.com` : undefined);
62
80
  const r2Ready = Boolean(bucket && accessKeyId && secretAccessKey && endpoint);
63
- const wantR2 = mode === "r2" || mode === "r2+webhook" || (mode === "auto" && r2Ready);
81
+ const webhookUrl = env.PI_LOG_WEBHOOK_URL;
82
+ /*
83
+ * Transport selection.
84
+ *
85
+ * The transports form a FALLBACK chain, not a broadcast: the first
86
+ * transport that accepts the batch wins and the later ones are not
87
+ * called. `auto` therefore prefers the webhook ingress when one is
88
+ * configured: the server is the single writer to R2, so client machines
89
+ * never need R2 credentials at all.
90
+ */
91
+ const wantR2 = mode === "r2" ||
92
+ mode === "r2+webhook" ||
93
+ (mode === "auto" && r2Ready && !webhookUrl);
64
94
  if (wantR2) {
65
95
  if (r2Ready) {
66
96
  transports.push(createR2Transport({
@@ -76,7 +106,6 @@ export function resolveLogSinkConfig(options = {}) {
76
106
  notes.push("r2 requested but credentials are incomplete - transport skipped");
77
107
  }
78
108
  }
79
- const webhookUrl = env.PI_LOG_WEBHOOK_URL;
80
109
  const wantWebhook = mode === "webhook" || mode === "r2+webhook" || (mode === "auto" && Boolean(webhookUrl));
81
110
  if (wantWebhook) {
82
111
  if (webhookUrl) {
@@ -85,6 +114,9 @@ export function resolveLogSinkConfig(options = {}) {
85
114
  token: env.PI_LOG_WEBHOOK_TOKEN,
86
115
  }));
87
116
  notes.push(`webhook enabled (${webhookUrl})`);
117
+ if (mode === "auto") {
118
+ notes.push("webhook is the client ingress point - the server writes to R2 (direct r2 transport skipped)");
119
+ }
88
120
  }
89
121
  else {
90
122
  notes.push("webhook requested but PI_LOG_WEBHOOK_URL is not set - transport skipped");
@@ -93,9 +125,10 @@ export function resolveLogSinkConfig(options = {}) {
93
125
  if (transports.length === 0) {
94
126
  notes.push("no transport configured - logs stay local");
95
127
  }
96
- return {
128
+ const config = {
97
129
  enabled: true,
98
130
  app: env.PI_LOG_APP ?? "pi-harness",
131
+ installationId,
99
132
  transports,
100
133
  spoolDir: env.PI_LOG_SPOOL_DIR ?? defaultSpoolDir(),
101
134
  sampling: {
@@ -108,7 +141,11 @@ export function resolveLogSinkConfig(options = {}) {
108
141
  maxBatchSize: readNumber(env, "PI_LOG_BATCH_SIZE", 100),
109
142
  },
110
143
  flushIntervalMs: readNumber(env, "PI_LOG_FLUSH_INTERVAL_MS", 15_000),
144
+ classification: classificationFor(env),
111
145
  notes,
112
146
  };
147
+ if (env.PI_LOG_APP_VERSION)
148
+ config.appVersion = env.PI_LOG_APP_VERSION;
149
+ return config;
113
150
  }
114
151
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AA6BjE,SAAS,WAAW,CAAC,OAAe,EAAE,IAAY;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7C,CAAC;AAED,SAAS,UAAU,CAClB,GAAuC,EACvC,GAAW,EACX,QAAgB;IAEhB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,IAAI,CAAC,GAAG;QAAE,OAAO,QAAQ,CAAC;IAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,cAAc;IAC7B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,eAAe;IAC9B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAO,GAAyB,EAAE;IACtE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,cAAc,EAAE,CAAC;IACpD,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,MAAM,CAAgB,CAAC;IACxD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACpB,OAAO;YACN,OAAO,EAAE,KAAK;YACd,GAAG,EAAE,GAAG,CAAC,UAAU,IAAI,YAAY;YACnC,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,EAAE;YACV,eAAe,EAAE,CAAC;YAClB,KAAK,EAAE,CAAC,qCAAqC,CAAC;SAC9C,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAmB,EAAE,CAAC;IAEtC,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,IAAI,WAAW,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IAClF,MAAM,WAAW,GAChB,GAAG,CAAC,uBAAuB,IAAI,WAAW,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;IAC7E,MAAM,eAAe,GACpB,GAAG,CAAC,2BAA2B,IAAI,WAAW,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC;IACrF,MAAM,SAAS,GAAG,GAAG,CAAC,oBAAoB,IAAI,WAAW,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IACxF,MAAM,QAAQ,GACb,GAAG,CAAC,kBAAkB;QACtB,WAAW,CAAC,OAAO,EAAE,iBAAiB,CAAC;QACvC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,SAAS,2BAA2B,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAE3E,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,WAAW,IAAI,eAAe,IAAI,QAAQ,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,YAAY,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC;IAEtF,IAAI,MAAM,EAAE,CAAC;QACZ,IAAI,OAAO,EAAE,CAAC;YACb,UAAU,CAAC,IAAI,CACd,iBAAiB,CAAC;gBACjB,MAAM,EAAE,MAAgB;gBACxB,QAAQ,EAAE,QAAkB;gBAC5B,WAAW,EAAE,WAAqB;gBAClC,eAAe,EAAE,eAAyB;gBAC1C,MAAM,EAAE,GAAG,CAAC,gBAAgB,IAAI,cAAc;aAC9C,CAAC,CACF,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,sBAAsB,MAAM,GAAG,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;QAC/E,CAAC;IACF,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,kBAAkB,CAAC;IAC1C,MAAM,WAAW,GAChB,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,YAAY,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAEzF,IAAI,WAAW,EAAE,CAAC;QACjB,IAAI,UAAU,EAAE,CAAC;YAChB,UAAU,CAAC,IAAI,CACd,sBAAsB,CAAC;gBACtB,GAAG,EAAE,UAAU;gBACf,KAAK,EAAE,GAAG,CAAC,oBAAoB;aAC/B,CAAC,CACF,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,oBAAoB,UAAU,GAAG,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;QACvF,CAAC;IACF,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IACzD,CAAC;IAED,OAAO;QACN,OAAO,EAAE,IAAI;QACb,GAAG,EAAE,GAAG,CAAC,UAAU,IAAI,YAAY;QACnC,UAAU;QACV,QAAQ,EAAE,GAAG,CAAC,gBAAgB,IAAI,eAAe,EAAE;QACnD,QAAQ,EAAE;YACT,QAAQ,EAAG,GAAG,CAAC,YAA2C,IAAI,MAAM;YACpE,UAAU,EAAE,UAAU,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,CAAC;YACtD,kBAAkB,EAAE,UAAU,CAAC,GAAG,EAAE,mBAAmB,EAAE,EAAE,CAAC;SAC5D;QACD,MAAM,EAAE;YACP,OAAO,EAAE,UAAU,CAAC,GAAG,EAAE,oBAAoB,EAAE,IAAI,CAAC;YACpD,YAAY,EAAE,UAAU,CAAC,GAAG,EAAE,mBAAmB,EAAE,GAAG,CAAC;SACvD;QACD,eAAe,EAAE,UAAU,CAAC,GAAG,EAAE,0BAA0B,EAAE,MAAM,CAAC;QACpE,KAAK;KACL,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EACN,6BAA6B,GAE7B,MAAM,qBAAqB,CAAC;AAqC7B,SAAS,WAAW,CAAC,OAAe,EAAE,IAAY;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7C,CAAC;AAED,SAAS,UAAU,CAClB,GAAuC,EACvC,GAAW,EACX,QAAgB;IAEhB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,IAAI,CAAC,GAAG;QAAE,OAAO,QAAQ,CAAC;IAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,cAAc;IAC7B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,eAAe;IAC9B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;GAMG;AACH,SAAS,iBAAiB,CACzB,GAAuC;IAEvC,MAAM,UAAU,GAAG,GAAG,CAAC,iBAAiB,KAAK,GAAG,IAAI,GAAG,CAAC,iBAAiB,KAAK,MAAM,CAAC;IACrF,IAAI,CAAC,UAAU;QAAE,OAAO,6BAA6B,CAAC;IACtD,OAAO,EAAE,GAAG,6BAA6B,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;AACrE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAO,GAAyB,EAAE;IACtE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,cAAc,EAAE,CAAC;IACpD,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,MAAM,CAAgB,CAAC;IACxD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,cAAc,GACnB,OAAO,CAAC,cAAc,IAAI,GAAG,CAAC,sBAAsB,IAAI,qBAAqB,EAAE,CAAC;IAEjF,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACpB,OAAO;YACN,OAAO,EAAE,KAAK;YACd,GAAG,EAAE,GAAG,CAAC,UAAU,IAAI,YAAY;YACnC,cAAc;YACd,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,EAAE;YACV,eAAe,EAAE,CAAC;YAClB,cAAc,EAAE,iBAAiB,CAAC,GAAG,CAAC;YACtC,KAAK,EAAE,CAAC,qCAAqC,CAAC;SAC9C,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAmB,EAAE,CAAC;IAEtC,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,IAAI,WAAW,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IAClF,MAAM,WAAW,GAChB,GAAG,CAAC,uBAAuB,IAAI,WAAW,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;IAC7E,MAAM,eAAe,GACpB,GAAG,CAAC,2BAA2B,IAAI,WAAW,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC;IACrF,MAAM,SAAS,GAAG,GAAG,CAAC,oBAAoB,IAAI,WAAW,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IACxF,MAAM,QAAQ,GACb,GAAG,CAAC,kBAAkB;QACtB,WAAW,CAAC,OAAO,EAAE,iBAAiB,CAAC;QACvC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,SAAS,2BAA2B,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAE3E,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,WAAW,IAAI,eAAe,IAAI,QAAQ,CAAC,CAAC;IAC9E,MAAM,UAAU,GAAG,GAAG,CAAC,kBAAkB,CAAC;IAE1C;;;;;;;;OAQG;IACH,MAAM,MAAM,GACX,IAAI,KAAK,IAAI;QACb,IAAI,KAAK,YAAY;QACrB,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC;IAE7C,IAAI,MAAM,EAAE,CAAC;QACZ,IAAI,OAAO,EAAE,CAAC;YACb,UAAU,CAAC,IAAI,CACd,iBAAiB,CAAC;gBACjB,MAAM,EAAE,MAAgB;gBACxB,QAAQ,EAAE,QAAkB;gBAC5B,WAAW,EAAE,WAAqB;gBAClC,eAAe,EAAE,eAAyB;gBAC1C,MAAM,EAAE,GAAG,CAAC,gBAAgB,IAAI,cAAc;aAC9C,CAAC,CACF,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,sBAAsB,MAAM,GAAG,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;QAC/E,CAAC;IACF,CAAC;IAED,MAAM,WAAW,GAChB,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,YAAY,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAEzF,IAAI,WAAW,EAAE,CAAC;QACjB,IAAI,UAAU,EAAE,CAAC;YAChB,UAAU,CAAC,IAAI,CACd,sBAAsB,CAAC;gBACtB,GAAG,EAAE,UAAU;gBACf,KAAK,EAAE,GAAG,CAAC,oBAAoB;aAC/B,CAAC,CACF,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,oBAAoB,UAAU,GAAG,CAAC,CAAC;YAC9C,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CACT,6FAA6F,CAC7F,CAAC;YACH,CAAC;QACF,CAAC;aAAM,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;QACvF,CAAC;IACF,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,MAAM,GAAkB;QAC7B,OAAO,EAAE,IAAI;QACb,GAAG,EAAE,GAAG,CAAC,UAAU,IAAI,YAAY;QACnC,cAAc;QACd,UAAU;QACV,QAAQ,EAAE,GAAG,CAAC,gBAAgB,IAAI,eAAe,EAAE;QACnD,QAAQ,EAAE;YACT,QAAQ,EAAG,GAAG,CAAC,YAA2C,IAAI,MAAM;YACpE,UAAU,EAAE,UAAU,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,CAAC;YACtD,kBAAkB,EAAE,UAAU,CAAC,GAAG,EAAE,mBAAmB,EAAE,EAAE,CAAC;SAC5D;QACD,MAAM,EAAE;YACP,OAAO,EAAE,UAAU,CAAC,GAAG,EAAE,oBAAoB,EAAE,IAAI,CAAC;YACpD,YAAY,EAAE,UAAU,CAAC,GAAG,EAAE,mBAAmB,EAAE,GAAG,CAAC;SACvD;QACD,eAAe,EAAE,UAAU,CAAC,GAAG,EAAE,0BAA0B,EAAE,MAAM,CAAC;QACpE,cAAc,EAAE,iBAAiB,CAAC,GAAG,CAAC;QACtC,KAAK;KACL,CAAC;IAEF,IAAI,GAAG,CAAC,kBAAkB;QAAE,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC,kBAAkB,CAAC;IAEvE,OAAO,MAAM,CAAC;AACf,CAAC"}
@@ -9,7 +9,7 @@
9
9
  * webhook server provides the live path, and the local spool is the
10
10
  * fallback that keeps data when both are unavailable.
11
11
  */
12
- export { LOG_LEVEL_SEVERITY } from "./types.js";
12
+ export { LOG_LEVEL_SEVERITY, LOG_SCHEMA_VERSION } from "./types.js";
13
13
  export type { FlushStats, LogBatch, LogErrorInfo, LogInput, LogLevel, LogRecord, LogTransport, } from "./types.js";
14
14
  export { isSecretKey, isSensitiveValueKey, redactFields, redactText, redactValue, splitKeyTokens, } from "./redact.js";
15
15
  export type { JsonValue, RedactionOptions } from "./redact.js";
@@ -27,6 +27,14 @@ export { LogShipper } from "./shipper.js";
27
27
  export type { LogShipperOptions } from "./shipper.js";
28
28
  export { centralDebug, centralError, centralInfo, centralLog, centralWarn, getCentralLogConfig, getCentralShipper, initCentralLogging, shutdownCentralLogging, } from "./singleton.js";
29
29
  export type { InitCentralLoggingOptions } from "./singleton.js";
30
+ export { INSTALLATION_ID_FILE, defaultInstallationIdPath, isValidInstallationId, resolveInstallationId, } from "./installation.js";
31
+ export type { ResolveInstallationIdOptions } from "./installation.js";
32
+ export { DEFAULT_CLASSIFICATION_POLICY, DEFAULT_LOCAL_EVENTS, DEFAULT_REMOTE_EVENTS, classifyRecord, filterRemoteRecords, isSanitizedMessage, prepareRemoteRecord, } from "./classification.js";
33
+ export type { ClassificationPolicy } from "./classification.js";
34
+ export { LOCAL_ONLY_FIELD_KEYS, isLocalOnlyFieldKey } from "./sensitive-keys.js";
35
+ export { DEFAULT_BATCH_LIMITS, LOG_LEVELS, sanitizeRecord, validateBatch, } from "./ingest/schema.js";
36
+ export type { BatchValidationError, BatchValidationLimits, BatchValidationResult, SanitizeRecordResult, } from "./ingest/schema.js";
37
+ export * from "./server/index.js";
30
38
  export { defaultKeysDir, defaultSpoolDir, resolveLogSinkConfig, } from "./config.js";
31
39
  export type { LogSinkConfig, LogSinkMode, ResolveConfigOptions } from "./config.js";
32
40
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EACX,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,YAAY,GACZ,MAAM,YAAY,CAAC;AAIpB,OAAO,EACN,WAAW,EACX,mBAAmB,EACnB,YAAY,EACZ,UAAU,EACV,WAAW,EACX,cAAc,GACd,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAI/D,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACnE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAInD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAIlD,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAIvE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAItD,OAAO,EACN,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACtB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAIhE,OAAO,EACN,cAAc,EACd,eAAe,EACf,oBAAoB,GACpB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACpE,YAAY,EACX,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,YAAY,GACZ,MAAM,YAAY,CAAC;AAIpB,OAAO,EACN,WAAW,EACX,mBAAmB,EACnB,YAAY,EACZ,UAAU,EACV,WAAW,EACX,cAAc,GACd,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAI/D,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACnE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAInD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAIlD,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAIvE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAItD,OAAO,EACN,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACtB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAIhE,OAAO,EACN,oBAAoB,EACpB,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAItE,OAAO,EACN,6BAA6B,EAC7B,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAIjF,OAAO,EACN,oBAAoB,EACpB,UAAU,EACV,cAAc,EACd,aAAa,GACb,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACX,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,GACpB,MAAM,oBAAoB,CAAC;AAI5B,cAAc,mBAAmB,CAAC;AAIlC,OAAO,EACN,cAAc,EACd,eAAe,EACf,oBAAoB,GACpB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
@@ -10,7 +10,7 @@
10
10
  * fallback that keeps data when both are unavailable.
11
11
  */
12
12
  // --- Types -----------------------------------------------------------------
13
- export { LOG_LEVEL_SEVERITY } from "./types.js";
13
+ export { LOG_LEVEL_SEVERITY, LOG_SCHEMA_VERSION } from "./types.js";
14
14
  // --- Redaction -------------------------------------------------------------
15
15
  export { isSecretKey, isSensitiveValueKey, redactFields, redactText, redactValue, splitKeyTokens, } from "./redact.js";
16
16
  // --- Sampling --------------------------------------------------------------
@@ -26,6 +26,15 @@ export { createWebhookTransport } from "./transports/webhook.js";
26
26
  export { LogShipper } from "./shipper.js";
27
27
  // --- Process wide singleton -------------------------------------------------
28
28
  export { centralDebug, centralError, centralInfo, centralLog, centralWarn, getCentralLogConfig, getCentralShipper, initCentralLogging, shutdownCentralLogging, } from "./singleton.js";
29
+ // --- Installation identity --------------------------------------------------
30
+ export { INSTALLATION_ID_FILE, defaultInstallationIdPath, isValidInstallationId, resolveInstallationId, } from "./installation.js";
31
+ // --- Classification (what may leave the machine) ----------------------------
32
+ export { DEFAULT_CLASSIFICATION_POLICY, DEFAULT_LOCAL_EVENTS, DEFAULT_REMOTE_EVENTS, classifyRecord, filterRemoteRecords, isSanitizedMessage, prepareRemoteRecord, } from "./classification.js";
33
+ export { LOCAL_ONLY_FIELD_KEYS, isLocalOnlyFieldKey } from "./sensitive-keys.js";
34
+ // --- Ingest contract (shared by client and server) -------------------------
35
+ export { DEFAULT_BATCH_LIMITS, LOG_LEVELS, sanitizeRecord, validateBatch, } from "./ingest/schema.js";
36
+ // --- Server side ------------------------------------------------------------
37
+ export * from "./server/index.js";
29
38
  // --- Configuration ---------------------------------------------------------
30
39
  export { defaultKeysDir, defaultSpoolDir, resolveLogSinkConfig, } from "./config.js";
31
40
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,8EAA8E;AAE9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAWhD,8EAA8E;AAE9E,OAAO,EACN,WAAW,EACX,mBAAmB,EACnB,YAAY,EACZ,UAAU,EACV,WAAW,EACX,cAAc,GACd,MAAM,aAAa,CAAC;AAGrB,8EAA8E;AAE9E,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAGnE,8EAA8E;AAE9E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,8EAA8E;AAE9E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,8EAA8E;AAE9E,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAGjE,8EAA8E;AAE9E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,+EAA+E;AAE/E,OAAO,EACN,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACtB,MAAM,gBAAgB,CAAC;AAGxB,8EAA8E;AAE9E,OAAO,EACN,cAAc,EACd,eAAe,EACf,oBAAoB,GACpB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,8EAA8E;AAE9E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAWpE,8EAA8E;AAE9E,OAAO,EACN,WAAW,EACX,mBAAmB,EACnB,YAAY,EACZ,UAAU,EACV,WAAW,EACX,cAAc,GACd,MAAM,aAAa,CAAC;AAGrB,8EAA8E;AAE9E,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAGnE,8EAA8E;AAE9E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,8EAA8E;AAE9E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,8EAA8E;AAE9E,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAGjE,8EAA8E;AAE9E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,+EAA+E;AAE/E,OAAO,EACN,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACtB,MAAM,gBAAgB,CAAC;AAGxB,+EAA+E;AAE/E,OAAO,EACN,oBAAoB,EACpB,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,GACrB,MAAM,mBAAmB,CAAC;AAG3B,+EAA+E;AAE/E,OAAO,EACN,6BAA6B,EAC7B,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,GACnB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEjF,8EAA8E;AAE9E,OAAO,EACN,oBAAoB,EACpB,UAAU,EACV,cAAc,EACd,aAAa,GACb,MAAM,oBAAoB,CAAC;AAQ5B,+EAA+E;AAE/E,cAAc,mBAAmB,CAAC;AAElC,8EAA8E;AAE9E,OAAO,EACN,cAAc,EACd,eAAe,EACf,oBAAoB,GACpB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Ingest contract: strict validation and allowlisted redaction.
3
+ *
4
+ * The client and the server share this module, so both sides agree on what a
5
+ * batch is. The server never trusts the body:
6
+ *
7
+ * - the tenant comes from the authenticated credential, never from the JSON,
8
+ * - the batch is validated against a strict, versioned schema,
9
+ * - the records are rebuilt from an allowlist, so an unknown property can
10
+ * never smuggle data into the archive,
11
+ * - every string is redacted again on the server (defence in depth).
12
+ */
13
+ import { type LogBatch, type LogLevel, type LogRecord } from "../types.js";
14
+ export declare const LOG_LEVELS: readonly LogLevel[];
15
+ export interface BatchValidationLimits {
16
+ /** Maximum number of records in one batch. */
17
+ maxRecords: number;
18
+ /** Maximum length of a single string value. */
19
+ maxStringLength: number;
20
+ /** Maximum number of structured fields per record. */
21
+ maxFieldKeys: number;
22
+ }
23
+ export declare const DEFAULT_BATCH_LIMITS: BatchValidationLimits;
24
+ export interface BatchValidationError {
25
+ code: string;
26
+ message: string;
27
+ }
28
+ export type BatchValidationResult = {
29
+ ok: true;
30
+ batch: LogBatch;
31
+ warnings: string[];
32
+ } | {
33
+ ok: false;
34
+ error: BatchValidationError;
35
+ };
36
+ /**
37
+ * Validate an inbound batch.
38
+ *
39
+ * Unknown properties are NOT an error here - the sanitizer drops them. Only a
40
+ * structurally broken batch is rejected.
41
+ */
42
+ export declare function validateBatch(input: unknown, options?: {
43
+ limits?: Partial<BatchValidationLimits>;
44
+ }): BatchValidationResult;
45
+ export type SanitizeRecordResult = {
46
+ ok: true;
47
+ record: LogRecord;
48
+ } | {
49
+ ok: false;
50
+ error: BatchValidationError;
51
+ };
52
+ /**
53
+ * Rebuild one record from the allowlist and redact every string.
54
+ *
55
+ * Unknown properties are dropped, `error.name`, `error.message` and
56
+ * `error.stack` are redacted, and structured fields lose the keys that can
57
+ * carry private content.
58
+ */
59
+ export declare function sanitizeRecord(input: unknown, limits?: Partial<BatchValidationLimits>): SanitizeRecordResult;
60
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/ingest/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAsB,KAAK,QAAQ,EAAqB,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAElH,eAAO,MAAM,UAAU,EAAE,SAAS,QAAQ,EAAuC,CAAC;AAElF,MAAM,WAAW,qBAAqB;IACrC,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,eAAe,EAAE,MAAM,CAAC;IACxB,sDAAsD;IACtD,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,oBAAoB,EAAE,qBAIlC,CAAC;AAEF,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,qBAAqB,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GACjD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAA;CAAE,CAAC;AAc9C;;;;;GAKG;AACH,wBAAgB,aAAa,CAC5B,KAAK,EAAE,OAAO,EACd,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAA;CAAO,GACvD,qBAAqB,CAmHvB;AA6BD,MAAM,MAAM,oBAAoB,GAC7B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GAC/B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAA;CAAE,CAAC;AAE9C;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC7B,KAAK,EAAE,OAAO,EACd,MAAM,GAAE,OAAO,CAAC,qBAAqB,CAAM,GACzC,oBAAoB,CAwEtB"}
@@ -0,0 +1,245 @@
1
+ /**
2
+ * Ingest contract: strict validation and allowlisted redaction.
3
+ *
4
+ * The client and the server share this module, so both sides agree on what a
5
+ * batch is. The server never trusts the body:
6
+ *
7
+ * - the tenant comes from the authenticated credential, never from the JSON,
8
+ * - the batch is validated against a strict, versioned schema,
9
+ * - the records are rebuilt from an allowlist, so an unknown property can
10
+ * never smuggle data into the archive,
11
+ * - every string is redacted again on the server (defence in depth).
12
+ */
13
+ import { redactText, redactValue } from "../redact.js";
14
+ import { isLocalOnlyFieldKey } from "../sensitive-keys.js";
15
+ import { LOG_SCHEMA_VERSION } from "../types.js";
16
+ export const LOG_LEVELS = ["debug", "info", "warn", "error"];
17
+ export const DEFAULT_BATCH_LIMITS = {
18
+ maxRecords: 1000,
19
+ maxStringLength: 8192,
20
+ maxFieldKeys: 64,
21
+ };
22
+ function isPlainObject(value) {
23
+ return typeof value === "object" && value !== null && !Array.isArray(value);
24
+ }
25
+ function isIsoTimestamp(value) {
26
+ return Number.isFinite(Date.parse(value));
27
+ }
28
+ /** Batch ids are opaque but must stay safe to use in an object key. */
29
+ const BATCH_ID_PATTERN = /^[A-Za-z0-9._:-]{1,128}$/;
30
+ const INSTALLATION_ID_PATTERN = /^[A-Za-z0-9._:-]{8,64}$/;
31
+ /**
32
+ * Validate an inbound batch.
33
+ *
34
+ * Unknown properties are NOT an error here - the sanitizer drops them. Only a
35
+ * structurally broken batch is rejected.
36
+ */
37
+ export function validateBatch(input, options = {}) {
38
+ const limits = { ...DEFAULT_BATCH_LIMITS, ...options.limits };
39
+ const warnings = [];
40
+ if (!isPlainObject(input)) {
41
+ return { ok: false, error: { code: "invalid_batch", message: "batch must be an object" } };
42
+ }
43
+ let schemaVersion = input.schemaVersion;
44
+ if (schemaVersion === undefined) {
45
+ // A client that predates the version marker sends v1.
46
+ schemaVersion = 1;
47
+ warnings.push("batch without a schema version, treated as legacy v1");
48
+ }
49
+ if (typeof schemaVersion !== "number" || !Number.isFinite(schemaVersion)) {
50
+ return {
51
+ ok: false,
52
+ error: { code: "invalid_schema_version", message: "schemaVersion must be a number" },
53
+ };
54
+ }
55
+ if (schemaVersion < 1) {
56
+ return {
57
+ ok: false,
58
+ error: { code: "invalid_schema_version", message: "schemaVersion must be >= 1" },
59
+ };
60
+ }
61
+ if (schemaVersion > LOG_SCHEMA_VERSION) {
62
+ return {
63
+ ok: false,
64
+ error: {
65
+ code: "unsupported_schema_version",
66
+ message: `schemaVersion ${schemaVersion} is newer than the supported version ${LOG_SCHEMA_VERSION}`,
67
+ },
68
+ };
69
+ }
70
+ if (schemaVersion < LOG_SCHEMA_VERSION) {
71
+ warnings.push(`legacy schemaVersion ${schemaVersion}`);
72
+ }
73
+ const batchId = input.batchId;
74
+ if (typeof batchId !== "string" || !BATCH_ID_PATTERN.test(batchId)) {
75
+ return {
76
+ ok: false,
77
+ error: { code: "invalid_batch_id", message: "batchId is missing or malformed" },
78
+ };
79
+ }
80
+ const app = input.app;
81
+ if (typeof app !== "string" || app.length === 0 || app.length > 64) {
82
+ return { ok: false, error: { code: "invalid_app", message: "app is missing or malformed" } };
83
+ }
84
+ const installationId = input.installationId;
85
+ if (installationId !== undefined && typeof installationId !== "string") {
86
+ return {
87
+ ok: false,
88
+ error: { code: "invalid_installation_id", message: "installationId must be a string" },
89
+ };
90
+ }
91
+ if (schemaVersion >= 2) {
92
+ if (typeof installationId !== "string" || !INSTALLATION_ID_PATTERN.test(installationId)) {
93
+ return {
94
+ ok: false,
95
+ error: { code: "invalid_installation_id", message: "installationId is missing or malformed" },
96
+ };
97
+ }
98
+ }
99
+ else if (!installationId) {
100
+ warnings.push("batch without an installation id");
101
+ }
102
+ const sentAt = input.sentAt;
103
+ if (typeof sentAt !== "string" || !isIsoTimestamp(sentAt)) {
104
+ return { ok: false, error: { code: "invalid_sent_at", message: "sentAt is not a timestamp" } };
105
+ }
106
+ const records = input.records;
107
+ if (!Array.isArray(records)) {
108
+ return { ok: false, error: { code: "invalid_records", message: "records must be an array" } };
109
+ }
110
+ if (records.length === 0) {
111
+ return { ok: false, error: { code: "empty_batch", message: "records must not be empty" } };
112
+ }
113
+ if (records.length > limits.maxRecords) {
114
+ return {
115
+ ok: false,
116
+ error: {
117
+ code: "too_many_records",
118
+ message: `records exceed the limit of ${limits.maxRecords}`,
119
+ },
120
+ };
121
+ }
122
+ const sanitized = [];
123
+ for (const record of records) {
124
+ const result = sanitizeRecord(record, limits);
125
+ if (!result.ok) {
126
+ return { ok: false, error: result.error };
127
+ }
128
+ sanitized.push(result.record);
129
+ }
130
+ const batch = {
131
+ schemaVersion,
132
+ batchId,
133
+ app,
134
+ installationId: typeof installationId === "string" ? installationId : "legacy",
135
+ sentAt,
136
+ records: sanitized,
137
+ };
138
+ if (typeof input.appVersion === "string")
139
+ batch.appVersion = input.appVersion.slice(0, 32);
140
+ if (typeof input.hostLabel === "string")
141
+ batch.hostLabel = input.hostLabel.slice(0, 128);
142
+ if (typeof input.sessionId === "string")
143
+ batch.sessionId = input.sessionId.slice(0, 128);
144
+ return { ok: true, batch, warnings };
145
+ }
146
+ /** Record keys that are accepted. Everything else is dropped. */
147
+ const ALLOWED_RECORD_KEYS = new Set([
148
+ "ts",
149
+ "level",
150
+ "source",
151
+ "event",
152
+ "message",
153
+ "sessionId",
154
+ "durationMs",
155
+ "fields",
156
+ "error",
157
+ ]);
158
+ /**
159
+ * Copy only the allowed properties of a record.
160
+ *
161
+ * This is the allowlist in action: a property the contract does not know is
162
+ * dropped before anything else happens to the record.
163
+ */
164
+ function pickAllowedProperties(input) {
165
+ const picked = {};
166
+ for (const key of ALLOWED_RECORD_KEYS) {
167
+ if (key in input)
168
+ picked[key] = input[key];
169
+ }
170
+ return picked;
171
+ }
172
+ /**
173
+ * Rebuild one record from the allowlist and redact every string.
174
+ *
175
+ * Unknown properties are dropped, `error.name`, `error.message` and
176
+ * `error.stack` are redacted, and structured fields lose the keys that can
177
+ * carry private content.
178
+ */
179
+ export function sanitizeRecord(input, limits = {}) {
180
+ const merged = { ...DEFAULT_BATCH_LIMITS, ...limits };
181
+ if (!isPlainObject(input)) {
182
+ return { ok: false, error: { code: "invalid_record", message: "record must be an object" } };
183
+ }
184
+ const allowed = pickAllowedProperties(input);
185
+ const ts = allowed.ts;
186
+ if (typeof ts !== "string" || !isIsoTimestamp(ts)) {
187
+ return { ok: false, error: { code: "invalid_ts", message: "ts is not a timestamp" } };
188
+ }
189
+ const level = allowed.level;
190
+ if (typeof level !== "string" || !LOG_LEVELS.includes(level)) {
191
+ return { ok: false, error: { code: "invalid_level", message: "level is not known" } };
192
+ }
193
+ const source = allowed.source;
194
+ if (typeof source !== "string" || source.length === 0 || source.length > 128) {
195
+ return { ok: false, error: { code: "invalid_source", message: "source is missing or malformed" } };
196
+ }
197
+ const event = allowed.event;
198
+ if (typeof event !== "string" || event.length === 0 || event.length > 128) {
199
+ return { ok: false, error: { code: "invalid_event", message: "event is missing or malformed" } };
200
+ }
201
+ const record = {
202
+ ts,
203
+ level: level,
204
+ source,
205
+ event,
206
+ };
207
+ if (typeof allowed.message === "string") {
208
+ record.message = redactText(allowed.message).slice(0, merged.maxStringLength);
209
+ }
210
+ if (typeof allowed.sessionId === "string") {
211
+ record.sessionId = allowed.sessionId.slice(0, 128);
212
+ }
213
+ if (typeof allowed.durationMs === "number" && Number.isFinite(allowed.durationMs)) {
214
+ record.durationMs = allowed.durationMs;
215
+ }
216
+ if (isPlainObject(allowed.fields)) {
217
+ const fields = {};
218
+ let kept = 0;
219
+ for (const [key, value] of Object.entries(allowed.fields)) {
220
+ if (kept >= merged.maxFieldKeys)
221
+ break;
222
+ if (isLocalOnlyFieldKey(key))
223
+ continue;
224
+ fields[key] = redactValue(value);
225
+ kept++;
226
+ }
227
+ if (Object.keys(fields).length > 0)
228
+ record.fields = fields;
229
+ }
230
+ if (isPlainObject(allowed.error)) {
231
+ const error = { name: "Error", message: "" };
232
+ if (typeof allowed.error.name === "string") {
233
+ error.name = redactText(allowed.error.name).slice(0, 256);
234
+ }
235
+ if (typeof allowed.error.message === "string") {
236
+ error.message = redactText(allowed.error.message).slice(0, merged.maxStringLength);
237
+ }
238
+ if (typeof allowed.error.stack === "string") {
239
+ error.stack = redactText(allowed.error.stack).slice(0, merged.maxStringLength);
240
+ }
241
+ record.error = error;
242
+ }
243
+ return { ok: true, record };
244
+ }
245
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/ingest/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Stable installation identity.
3
+ *
4
+ * One random id per local install. It is created on first use, persisted
5
+ * under `~/.pi-harness-runtime/installation-id.txt` and sent with every
6
+ * batch so the server can tell two machines of the same user apart.
7
+ *
8
+ * The id is deliberately opaque:
9
+ * - it never contains the hostname, the user name or a workspace path,
10
+ * - it is not derived from anything that could identify a person,
11
+ * - it is never used as an identity on the server (the tenant comes from
12
+ * the authenticated credential).
13
+ */
14
+ export declare const INSTALLATION_ID_FILE = "installation-id.txt";
15
+ /** Default location of the installation id file. */
16
+ export declare function defaultInstallationIdPath(): string;
17
+ /** True when the value looks like a uuid (the only shape we write). */
18
+ export declare function isValidInstallationId(value: string): boolean;
19
+ export interface ResolveInstallationIdOptions {
20
+ /** File the id is read from and written to. */
21
+ path?: string;
22
+ /** Id factory (tests). */
23
+ generate?: () => string;
24
+ }
25
+ /**
26
+ * Resolve the installation id: read it when it exists, create it otherwise.
27
+ *
28
+ * A failed read or write never throws - the id is best effort metadata and
29
+ * must not break logging.
30
+ */
31
+ export declare function resolveInstallationId(options?: ResolveInstallationIdOptions): string;
32
+ //# sourceMappingURL=installation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installation.d.ts","sourceRoot":"","sources":["../src/installation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,eAAO,MAAM,oBAAoB,wBAAwB,CAAC;AAE1D,oDAAoD;AACpD,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAID,uEAAuE;AACvE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,MAAM,WAAW,4BAA4B;IAC5C,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,4BAAiC,GAAG,MAAM,CA6BxF"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Stable installation identity.
3
+ *
4
+ * One random id per local install. It is created on first use, persisted
5
+ * under `~/.pi-harness-runtime/installation-id.txt` and sent with every
6
+ * batch so the server can tell two machines of the same user apart.
7
+ *
8
+ * The id is deliberately opaque:
9
+ * - it never contains the hostname, the user name or a workspace path,
10
+ * - it is not derived from anything that could identify a person,
11
+ * - it is never used as an identity on the server (the tenant comes from
12
+ * the authenticated credential).
13
+ */
14
+ import { randomUUID } from "node:crypto";
15
+ import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
16
+ import { homedir } from "node:os";
17
+ import { dirname, join } from "node:path";
18
+ export const INSTALLATION_ID_FILE = "installation-id.txt";
19
+ /** Default location of the installation id file. */
20
+ export function defaultInstallationIdPath() {
21
+ return join(homedir(), ".pi-harness-runtime", INSTALLATION_ID_FILE);
22
+ }
23
+ const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
24
+ /** True when the value looks like a uuid (the only shape we write). */
25
+ export function isValidInstallationId(value) {
26
+ return UUID_PATTERN.test(value.trim());
27
+ }
28
+ /**
29
+ * Resolve the installation id: read it when it exists, create it otherwise.
30
+ *
31
+ * A failed read or write never throws - the id is best effort metadata and
32
+ * must not break logging.
33
+ */
34
+ export function resolveInstallationId(options = {}) {
35
+ const path = options.path ?? defaultInstallationIdPath();
36
+ const generate = options.generate ?? randomUUID;
37
+ try {
38
+ if (existsSync(path)) {
39
+ const existing = readFileSync(path, "utf8").trim();
40
+ if (isValidInstallationId(existing))
41
+ return existing;
42
+ }
43
+ }
44
+ catch {
45
+ // Fall through and create a new id.
46
+ }
47
+ let id;
48
+ try {
49
+ id = generate();
50
+ }
51
+ catch {
52
+ id = randomUUID();
53
+ }
54
+ try {
55
+ mkdirSync(dirname(path), { recursive: true });
56
+ writeFileSync(path, `${id}\n`, { mode: 0o600 });
57
+ chmodSync(path, 0o600);
58
+ }
59
+ catch {
60
+ // The id still works for this process even when it cannot be persisted.
61
+ }
62
+ return id;
63
+ }
64
+ //# sourceMappingURL=installation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installation.js","sourceRoot":"","sources":["../src/installation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,CAAC,MAAM,oBAAoB,GAAG,qBAAqB,CAAC;AAE1D,oDAAoD;AACpD,MAAM,UAAU,yBAAyB;IACxC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,oBAAoB,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,YAAY,GAAG,iEAAiE,CAAC;AAEvF,uEAAuE;AACvE,MAAM,UAAU,qBAAqB,CAAC,KAAa;IAClD,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AACxC,CAAC;AASD;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAO,GAAiC,EAAE;IAC/E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,yBAAyB,EAAE,CAAC;IACzD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,UAAU,CAAC;IAEhD,IAAI,CAAC;QACJ,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACnD,IAAI,qBAAqB,CAAC,QAAQ,CAAC;gBAAE,OAAO,QAAQ,CAAC;QACtD,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,oCAAoC;IACrC,CAAC;IAED,IAAI,EAAU,CAAC;IACf,IAAI,CAAC;QACJ,EAAE,GAAG,QAAQ,EAAE,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACR,EAAE,GAAG,UAAU,EAAE,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACJ,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAChD,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACR,wEAAwE;IACzE,CAAC;IAED,OAAO,EAAE,CAAC;AACX,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Keys that never leave the machine.
3
+ *
4
+ * A key name is a strong hint about its content: "prompt", "output" or
5
+ * "transcript" carry private text, "path" and "url" carry the shape of the
6
+ * user's workspace. The list is shared by the client side classifier and the
7
+ * server side sanitizer, so both sides agree on what is private.
8
+ */
9
+ export declare const LOCAL_ONLY_FIELD_KEYS: string[];
10
+ /** True when the key is one that must not be shipped. */
11
+ export declare function isLocalOnlyFieldKey(key: string): boolean;
12
+ //# sourceMappingURL=sensitive-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensitive-keys.d.ts","sourceRoot":"","sources":["../src/sensitive-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,qBAAqB,UAwBjC,CAAC;AAEF,yDAAyD;AACzD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGxD"}