@pellux/goodvibes-sdk 0.25.8 → 0.25.11

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 (245) hide show
  1. package/README.md +4 -0
  2. package/dist/_internal/contracts/artifacts/operator-contract.json +178 -6
  3. package/dist/_internal/contracts/generated/foundation-client-types.d.ts +16 -1
  4. package/dist/_internal/contracts/generated/foundation-client-types.d.ts.map +1 -1
  5. package/dist/_internal/contracts/generated/foundation-metadata.d.ts +2 -2
  6. package/dist/_internal/contracts/generated/foundation-metadata.js +2 -2
  7. package/dist/_internal/contracts/generated/operator-contract.d.ts.map +1 -1
  8. package/dist/_internal/contracts/generated/operator-contract.js +178 -6
  9. package/dist/_internal/contracts/generated/operator-method-ids.d.ts +1 -1
  10. package/dist/_internal/contracts/generated/operator-method-ids.d.ts.map +1 -1
  11. package/dist/_internal/contracts/generated/operator-method-ids.js +1 -0
  12. package/dist/_internal/daemon/context.d.ts +1 -0
  13. package/dist/_internal/daemon/context.d.ts.map +1 -1
  14. package/dist/_internal/daemon/integration-route-types.d.ts +1 -0
  15. package/dist/_internal/daemon/integration-route-types.d.ts.map +1 -1
  16. package/dist/_internal/daemon/integration-routes.d.ts +1 -1
  17. package/dist/_internal/daemon/integration-routes.d.ts.map +1 -1
  18. package/dist/_internal/daemon/integration-routes.js +3 -0
  19. package/dist/_internal/daemon/operator.d.ts +1 -1
  20. package/dist/_internal/daemon/operator.d.ts.map +1 -1
  21. package/dist/_internal/daemon/operator.js +2 -0
  22. package/dist/_internal/daemon/runtime-route-types.d.ts +1 -1
  23. package/dist/_internal/daemon/runtime-route-types.d.ts.map +1 -1
  24. package/dist/_internal/platform/adapters/discord/index.d.ts.map +1 -1
  25. package/dist/_internal/platform/adapters/discord/index.js +4 -5
  26. package/dist/_internal/platform/adapters/github/index.d.ts.map +1 -1
  27. package/dist/_internal/platform/adapters/github/index.js +4 -5
  28. package/dist/_internal/platform/adapters/google-chat/index.d.ts.map +1 -1
  29. package/dist/_internal/platform/adapters/google-chat/index.js +7 -5
  30. package/dist/_internal/platform/adapters/helpers.d.ts +2 -1
  31. package/dist/_internal/platform/adapters/helpers.d.ts.map +1 -1
  32. package/dist/_internal/platform/adapters/helpers.js +3 -34
  33. package/dist/_internal/platform/adapters/homeassistant/index.d.ts +3 -0
  34. package/dist/_internal/platform/adapters/homeassistant/index.d.ts.map +1 -0
  35. package/dist/_internal/platform/adapters/homeassistant/index.js +177 -0
  36. package/dist/_internal/platform/adapters/index.d.ts +1 -0
  37. package/dist/_internal/platform/adapters/index.d.ts.map +1 -1
  38. package/dist/_internal/platform/adapters/index.js +1 -0
  39. package/dist/_internal/platform/adapters/mattermost/index.d.ts.map +1 -1
  40. package/dist/_internal/platform/adapters/mattermost/index.js +6 -2
  41. package/dist/_internal/platform/adapters/slack/index.d.ts.map +1 -1
  42. package/dist/_internal/platform/adapters/slack/index.js +4 -5
  43. package/dist/_internal/platform/adapters/telegram/index.d.ts.map +1 -1
  44. package/dist/_internal/platform/adapters/telegram/index.js +7 -5
  45. package/dist/_internal/platform/adapters/types.d.ts +1 -1
  46. package/dist/_internal/platform/adapters/types.d.ts.map +1 -1
  47. package/dist/_internal/platform/adapters/webhook/index.d.ts.map +1 -1
  48. package/dist/_internal/platform/adapters/webhook/index.js +4 -1
  49. package/dist/_internal/platform/automation/types.d.ts +1 -1
  50. package/dist/_internal/platform/automation/types.d.ts.map +1 -1
  51. package/dist/_internal/platform/batch/manager.d.ts.map +1 -1
  52. package/dist/_internal/platform/batch/manager.js +4 -0
  53. package/dist/_internal/platform/batch/types.d.ts +4 -0
  54. package/dist/_internal/platform/batch/types.d.ts.map +1 -1
  55. package/dist/_internal/platform/channels/builtin/accounts.d.ts.map +1 -1
  56. package/dist/_internal/platform/channels/builtin/accounts.js +22 -0
  57. package/dist/_internal/platform/channels/builtin/contracts.d.ts.map +1 -1
  58. package/dist/_internal/platform/channels/builtin/contracts.js +9 -0
  59. package/dist/_internal/platform/channels/builtin/descriptors.d.ts.map +1 -1
  60. package/dist/_internal/platform/channels/builtin/descriptors.js +9 -2
  61. package/dist/_internal/platform/channels/builtin/homeassistant.d.ts +64 -0
  62. package/dist/_internal/platform/channels/builtin/homeassistant.d.ts.map +1 -0
  63. package/dist/_internal/platform/channels/builtin/homeassistant.js +380 -0
  64. package/dist/_internal/platform/channels/builtin/plugins.d.ts.map +1 -1
  65. package/dist/_internal/platform/channels/builtin/plugins.js +2 -1
  66. package/dist/_internal/platform/channels/builtin/presentation.d.ts.map +1 -1
  67. package/dist/_internal/platform/channels/builtin/presentation.js +4 -0
  68. package/dist/_internal/platform/channels/builtin/setup-schema.d.ts.map +1 -1
  69. package/dist/_internal/platform/channels/builtin/setup-schema.js +46 -0
  70. package/dist/_internal/platform/channels/builtin/shared.d.ts +1 -1
  71. package/dist/_internal/platform/channels/builtin/shared.d.ts.map +1 -1
  72. package/dist/_internal/platform/channels/builtin/shared.js +2 -0
  73. package/dist/_internal/platform/channels/builtin/surfaces.d.ts.map +1 -1
  74. package/dist/_internal/platform/channels/builtin/surfaces.js +1 -0
  75. package/dist/_internal/platform/channels/builtin/targets.d.ts.map +1 -1
  76. package/dist/_internal/platform/channels/builtin/targets.js +24 -0
  77. package/dist/_internal/platform/channels/builtin-runtime.d.ts.map +1 -1
  78. package/dist/_internal/platform/channels/builtin-runtime.js +6 -0
  79. package/dist/_internal/platform/channels/delivery/strategies-core.d.ts +1 -0
  80. package/dist/_internal/platform/channels/delivery/strategies-core.d.ts.map +1 -1
  81. package/dist/_internal/platform/channels/delivery/strategies-core.js +41 -1
  82. package/dist/_internal/platform/channels/delivery-router.d.ts.map +1 -1
  83. package/dist/_internal/platform/channels/delivery-router.js +2 -1
  84. package/dist/_internal/platform/channels/reply-pipeline.d.ts.map +1 -1
  85. package/dist/_internal/platform/channels/reply-pipeline.js +9 -0
  86. package/dist/_internal/platform/channels/route-manager.d.ts.map +1 -1
  87. package/dist/_internal/platform/channels/route-manager.js +1 -0
  88. package/dist/_internal/platform/channels/surface-registry.d.ts.map +1 -1
  89. package/dist/_internal/platform/channels/surface-registry.js +4 -0
  90. package/dist/_internal/platform/channels/types.d.ts +1 -1
  91. package/dist/_internal/platform/channels/types.d.ts.map +1 -1
  92. package/dist/_internal/platform/cloudflare/client.d.ts +3 -0
  93. package/dist/_internal/platform/cloudflare/client.d.ts.map +1 -0
  94. package/dist/_internal/platform/cloudflare/client.js +9 -0
  95. package/dist/_internal/platform/cloudflare/config.d.ts +8 -0
  96. package/dist/_internal/platform/cloudflare/config.d.ts.map +1 -0
  97. package/dist/_internal/platform/cloudflare/config.js +48 -0
  98. package/dist/_internal/platform/cloudflare/constants.d.ts +18 -0
  99. package/dist/_internal/platform/cloudflare/constants.d.ts.map +1 -0
  100. package/dist/_internal/platform/cloudflare/constants.js +36 -0
  101. package/dist/_internal/platform/cloudflare/discovery.d.ts +23 -0
  102. package/dist/_internal/platform/cloudflare/discovery.d.ts.map +1 -0
  103. package/dist/_internal/platform/cloudflare/discovery.js +57 -0
  104. package/dist/_internal/platform/cloudflare/index.d.ts +6 -0
  105. package/dist/_internal/platform/cloudflare/index.d.ts.map +1 -0
  106. package/dist/_internal/platform/cloudflare/index.js +4 -0
  107. package/dist/_internal/platform/cloudflare/manager.d.ts +30 -0
  108. package/dist/_internal/platform/cloudflare/manager.d.ts.map +1 -0
  109. package/dist/_internal/platform/cloudflare/manager.js +674 -0
  110. package/dist/_internal/platform/cloudflare/resources.d.ts +79 -0
  111. package/dist/_internal/platform/cloudflare/resources.d.ts.map +1 -0
  112. package/dist/_internal/platform/cloudflare/resources.js +353 -0
  113. package/dist/_internal/platform/cloudflare/types.d.ts +694 -0
  114. package/dist/_internal/platform/cloudflare/types.d.ts.map +1 -0
  115. package/dist/_internal/platform/cloudflare/types.js +10 -0
  116. package/dist/_internal/platform/cloudflare/utils.d.ts +14 -0
  117. package/dist/_internal/platform/cloudflare/utils.d.ts.map +1 -0
  118. package/dist/_internal/platform/cloudflare/utils.js +216 -0
  119. package/dist/_internal/platform/cloudflare/worker-source.d.ts +2 -0
  120. package/dist/_internal/platform/cloudflare/worker-source.d.ts.map +1 -0
  121. package/dist/_internal/platform/cloudflare/worker-source.js +165 -0
  122. package/dist/_internal/platform/companion/companion-chat-manager.d.ts +24 -4
  123. package/dist/_internal/platform/companion/companion-chat-manager.d.ts.map +1 -1
  124. package/dist/_internal/platform/companion/companion-chat-manager.js +128 -78
  125. package/dist/_internal/platform/config/schema-domain-runtime.d.ts +24 -0
  126. package/dist/_internal/platform/config/schema-domain-runtime.d.ts.map +1 -1
  127. package/dist/_internal/platform/config/schema-domain-runtime.js +169 -0
  128. package/dist/_internal/platform/config/schema-domain-surfaces.d.ts +11 -0
  129. package/dist/_internal/platform/config/schema-domain-surfaces.d.ts.map +1 -1
  130. package/dist/_internal/platform/config/schema-domain-surfaces.js +59 -0
  131. package/dist/_internal/platform/config/schema-types.d.ts +38 -2
  132. package/dist/_internal/platform/config/schema-types.d.ts.map +1 -1
  133. package/dist/_internal/platform/control-plane/gateway-utils.d.ts +37 -0
  134. package/dist/_internal/platform/control-plane/gateway-utils.d.ts.map +1 -0
  135. package/dist/_internal/platform/control-plane/gateway-utils.js +97 -0
  136. package/dist/_internal/platform/control-plane/gateway.d.ts +4 -9
  137. package/dist/_internal/platform/control-plane/gateway.d.ts.map +1 -1
  138. package/dist/_internal/platform/control-plane/gateway.js +26 -61
  139. package/dist/_internal/platform/control-plane/method-catalog-runtime.d.ts.map +1 -1
  140. package/dist/_internal/platform/control-plane/method-catalog-runtime.js +11 -1
  141. package/dist/_internal/platform/control-plane/operator-contract-schemas-admin.d.ts.map +1 -1
  142. package/dist/_internal/platform/control-plane/operator-contract-schemas-admin.js +3 -2
  143. package/dist/_internal/platform/control-plane/operator-contract-schemas-control.d.ts +1 -0
  144. package/dist/_internal/platform/control-plane/operator-contract-schemas-control.d.ts.map +1 -1
  145. package/dist/_internal/platform/control-plane/operator-contract-schemas-control.js +26 -0
  146. package/dist/_internal/platform/control-plane/routes/operator.d.ts +1 -1
  147. package/dist/_internal/platform/control-plane/routes/operator.d.ts.map +1 -1
  148. package/dist/_internal/platform/control-plane/routes/operator.js +2 -0
  149. package/dist/_internal/platform/control-plane/types.d.ts +1 -1
  150. package/dist/_internal/platform/control-plane/types.d.ts.map +1 -1
  151. package/dist/_internal/platform/daemon/control-plane.d.ts.map +1 -1
  152. package/dist/_internal/platform/daemon/control-plane.js +50 -6
  153. package/dist/_internal/platform/daemon/facade-composition.d.ts.map +1 -1
  154. package/dist/_internal/platform/daemon/facade-composition.js +30 -2
  155. package/dist/_internal/platform/daemon/facade-types.d.ts +1 -1
  156. package/dist/_internal/platform/daemon/facade-types.d.ts.map +1 -1
  157. package/dist/_internal/platform/daemon/http/cloudflare-routes.d.ts +7 -0
  158. package/dist/_internal/platform/daemon/http/cloudflare-routes.d.ts.map +1 -0
  159. package/dist/_internal/platform/daemon/http/cloudflare-routes.js +201 -0
  160. package/dist/_internal/platform/daemon/http/router.d.ts +3 -3
  161. package/dist/_internal/platform/daemon/http/router.d.ts.map +1 -1
  162. package/dist/_internal/platform/daemon/http/router.js +22 -16
  163. package/dist/_internal/platform/daemon/http/runtime-route-types.d.ts +1 -1
  164. package/dist/_internal/platform/daemon/http/runtime-route-types.d.ts.map +1 -1
  165. package/dist/_internal/platform/daemon/http-listener.d.ts.map +1 -1
  166. package/dist/_internal/platform/daemon/http-listener.js +4 -8
  167. package/dist/_internal/platform/daemon/surface-actions.d.ts +1 -1
  168. package/dist/_internal/platform/daemon/surface-actions.d.ts.map +1 -1
  169. package/dist/_internal/platform/daemon/surface-delivery.d.ts +1 -1
  170. package/dist/_internal/platform/daemon/surface-delivery.d.ts.map +1 -1
  171. package/dist/_internal/platform/daemon/surface-delivery.js +1 -0
  172. package/dist/_internal/platform/daemon/surface-policy.d.ts +1 -1
  173. package/dist/_internal/platform/daemon/surface-policy.d.ts.map +1 -1
  174. package/dist/_internal/platform/daemon/surface-policy.js +8 -0
  175. package/dist/_internal/platform/daemon/types.d.ts +2 -2
  176. package/dist/_internal/platform/daemon/types.d.ts.map +1 -1
  177. package/dist/_internal/platform/integrations/homeassistant.d.ts +58 -0
  178. package/dist/_internal/platform/integrations/homeassistant.d.ts.map +1 -0
  179. package/dist/_internal/platform/integrations/homeassistant.js +174 -0
  180. package/dist/_internal/platform/integrations/index.d.ts +2 -0
  181. package/dist/_internal/platform/integrations/index.d.ts.map +1 -1
  182. package/dist/_internal/platform/integrations/index.js +1 -0
  183. package/dist/_internal/platform/runtime/events/control-plane.d.ts +1 -1
  184. package/dist/_internal/platform/runtime/events/control-plane.d.ts.map +1 -1
  185. package/dist/_internal/platform/runtime/events/control-plane.js +1 -0
  186. package/dist/_internal/platform/runtime/events/routes.d.ts +1 -1
  187. package/dist/_internal/platform/runtime/events/routes.d.ts.map +1 -1
  188. package/dist/_internal/platform/runtime/events/routes.js +1 -0
  189. package/dist/_internal/platform/runtime/feature-flags/flags.d.ts.map +1 -1
  190. package/dist/_internal/platform/runtime/feature-flags/flags.js +9 -0
  191. package/dist/_internal/platform/runtime/feature-flags/gates.d.ts.map +1 -1
  192. package/dist/_internal/platform/runtime/feature-flags/gates.js +2 -0
  193. package/dist/_internal/platform/runtime/index.d.ts +2 -0
  194. package/dist/_internal/platform/runtime/index.d.ts.map +1 -1
  195. package/dist/_internal/platform/runtime/index.js +1 -0
  196. package/dist/_internal/platform/runtime/integration/helpers.d.ts +4 -0
  197. package/dist/_internal/platform/runtime/integration/helpers.d.ts.map +1 -1
  198. package/dist/_internal/platform/runtime/integration/helpers.js +4 -0
  199. package/dist/_internal/platform/runtime/security-settings.d.ts +19 -0
  200. package/dist/_internal/platform/runtime/security-settings.d.ts.map +1 -0
  201. package/dist/_internal/platform/runtime/security-settings.js +187 -0
  202. package/dist/_internal/platform/runtime/services.d.ts.map +1 -1
  203. package/dist/_internal/platform/runtime/services.js +1 -0
  204. package/dist/_internal/platform/security/user-auth.d.ts +1 -1
  205. package/dist/_internal/platform/security/user-auth.d.ts.map +1 -1
  206. package/dist/_internal/platform/security/user-auth.js +18 -3
  207. package/dist/_internal/platform/tools/edit/core.d.ts.map +1 -1
  208. package/dist/_internal/platform/tools/edit/core.js +4 -47
  209. package/dist/_internal/platform/tools/exec/runtime.d.ts.map +1 -1
  210. package/dist/_internal/platform/tools/exec/runtime.js +7 -1
  211. package/dist/_internal/platform/tools/exec/schema.d.ts +1 -0
  212. package/dist/_internal/platform/tools/exec/schema.d.ts.map +1 -1
  213. package/dist/_internal/platform/tools/exec/schema.js +1 -0
  214. package/dist/_internal/platform/tools/fetch/runtime.d.ts.map +1 -1
  215. package/dist/_internal/platform/tools/fetch/runtime.js +140 -19
  216. package/dist/_internal/platform/tools/fetch/schema.d.ts +1 -0
  217. package/dist/_internal/platform/tools/fetch/schema.d.ts.map +1 -1
  218. package/dist/_internal/platform/tools/fetch/schema.js +1 -0
  219. package/dist/_internal/platform/tools/find/executor.d.ts.map +1 -1
  220. package/dist/_internal/platform/tools/find/executor.js +7 -1
  221. package/dist/_internal/platform/tools/find/schema.d.ts.map +1 -1
  222. package/dist/_internal/platform/tools/find/schema.js +2 -0
  223. package/dist/_internal/platform/tools/read/index.d.ts.map +1 -1
  224. package/dist/_internal/platform/tools/read/index.js +7 -1
  225. package/dist/_internal/platform/tools/read/schema.d.ts +1 -0
  226. package/dist/_internal/platform/tools/read/schema.d.ts.map +1 -1
  227. package/dist/_internal/platform/tools/read/schema.js +1 -0
  228. package/dist/_internal/platform/tools/shared/process-manager.d.ts +2 -0
  229. package/dist/_internal/platform/tools/shared/process-manager.d.ts.map +1 -1
  230. package/dist/_internal/platform/tools/shared/process-manager.js +67 -5
  231. package/dist/_internal/platform/tools/write/index.d.ts.map +1 -1
  232. package/dist/_internal/platform/tools/write/index.js +3 -36
  233. package/dist/_internal/platform/utils/concurrency.d.ts +3 -0
  234. package/dist/_internal/platform/utils/concurrency.d.ts.map +1 -0
  235. package/dist/_internal/platform/utils/concurrency.js +17 -0
  236. package/dist/_internal/platform/utils/logger.d.ts.map +1 -1
  237. package/dist/_internal/platform/utils/logger.js +19 -1
  238. package/dist/_internal/platform/utils/request-body.d.ts +4 -0
  239. package/dist/_internal/platform/utils/request-body.d.ts.map +1 -0
  240. package/dist/_internal/platform/utils/request-body.js +45 -0
  241. package/dist/_internal/platform/version.js +1 -1
  242. package/dist/workers.d.ts +9 -0
  243. package/dist/workers.d.ts.map +1 -1
  244. package/dist/workers.js +67 -3
  245. package/package.json +2 -1
@@ -5,6 +5,8 @@ import { join } from 'path';
5
5
  const LOG_BUFFER_MAX = 10;
6
6
  /** Flush interval in milliseconds when buffer is below max. */
7
7
  const LOG_FLUSH_INTERVAL_MS = 100;
8
+ const REDACTED = '[REDACTED]';
9
+ const SENSITIVE_KEY_PATTERN = /(authorization|api[-_]?key|token|password|passwd|secret|credential|cookie|set-cookie)/i;
8
10
  /**
9
11
  * ActivityLogger — Persistent debug logger for GoodVibes.
10
12
  * Writes to .goodvibes/logs/activity.md
@@ -30,6 +32,7 @@ class ActivityLogger {
30
32
  if (this.flushTimer !== null)
31
33
  return;
32
34
  this.flushTimer = setTimeout(() => this.flush(), LOG_FLUSH_INTERVAL_MS);
35
+ this.flushTimer.unref?.();
33
36
  }
34
37
  flush() {
35
38
  this.flushTimer = null;
@@ -49,7 +52,7 @@ class ActivityLogger {
49
52
  const timestamp = new Date().toISOString();
50
53
  let entry = `[${timestamp}] [${level}] ${message}\n`;
51
54
  if (data) {
52
- entry += '```json\n' + JSON.stringify(data, null, 2) + '\n```\n';
55
+ entry += '```json\n' + JSON.stringify(redactLogData(data), null, 2) + '\n```\n';
53
56
  }
54
57
  this.buffer.push(entry);
55
58
  if (this.buffer.length >= LOG_BUFFER_MAX) {
@@ -73,3 +76,18 @@ export const logger = new ActivityLogger();
73
76
  export function configureActivityLogger(logDir) {
74
77
  logger.configure(logDir);
75
78
  }
79
+ function redactLogData(value, seen = new WeakSet()) {
80
+ if (value === null || typeof value !== 'object')
81
+ return value;
82
+ if (seen.has(value))
83
+ return '[Circular]';
84
+ seen.add(value);
85
+ if (Array.isArray(value)) {
86
+ return value.map((item) => redactLogData(item, seen));
87
+ }
88
+ const out = {};
89
+ for (const [key, nested] of Object.entries(value)) {
90
+ out[key] = SENSITIVE_KEY_PATTERN.test(key) ? REDACTED : redactLogData(nested, seen);
91
+ }
92
+ return out;
93
+ }
@@ -0,0 +1,4 @@
1
+ export declare const DEFAULT_MAX_REQUEST_BODY_BYTES = 1000000;
2
+ export declare function readTextBodyWithinLimit(req: Request, maxBytes?: number): Promise<string | Response>;
3
+ export declare function readJsonBodyWithinLimit(req: Request, maxBytes?: number): Promise<unknown | Response>;
4
+ //# sourceMappingURL=request-body.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-body.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/utils/request-body.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,8BAA8B,UAAY,CAAC;AAMxD,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,OAAO,EACZ,QAAQ,SAAiC,GACxC,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,CA4B5B;AAED,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,OAAO,EACZ,QAAQ,SAAiC,GACxC,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC,CAQ7B"}
@@ -0,0 +1,45 @@
1
+ export const DEFAULT_MAX_REQUEST_BODY_BYTES = 1_000_000;
2
+ function ignoreCancelError() {
3
+ // Best-effort stream cancellation.
4
+ }
5
+ export async function readTextBodyWithinLimit(req, maxBytes = DEFAULT_MAX_REQUEST_BODY_BYTES) {
6
+ const contentLength = Number.parseInt(req.headers.get('content-length') ?? '0', 10);
7
+ if (Number.isFinite(contentLength) && contentLength > maxBytes) {
8
+ return Response.json({ error: 'Payload too large' }, { status: 413 });
9
+ }
10
+ if (!req.body)
11
+ return '';
12
+ const reader = req.body.getReader();
13
+ const decoder = new TextDecoder();
14
+ let total = 0;
15
+ let body = '';
16
+ try {
17
+ for (;;) {
18
+ const { done, value } = await reader.read();
19
+ if (done)
20
+ break;
21
+ total += value.byteLength;
22
+ if (total > maxBytes) {
23
+ await reader.cancel('Payload too large').catch(ignoreCancelError);
24
+ return Response.json({ error: 'Payload too large' }, { status: 413 });
25
+ }
26
+ body += decoder.decode(value, { stream: true });
27
+ }
28
+ body += decoder.decode();
29
+ return body;
30
+ }
31
+ finally {
32
+ reader.releaseLock();
33
+ }
34
+ }
35
+ export async function readJsonBodyWithinLimit(req, maxBytes = DEFAULT_MAX_REQUEST_BODY_BYTES) {
36
+ const raw = await readTextBodyWithinLimit(req, maxBytes);
37
+ if (raw instanceof Response)
38
+ return raw;
39
+ try {
40
+ return JSON.parse(raw);
41
+ }
42
+ catch {
43
+ return Response.json({ error: 'Invalid JSON body' }, { status: 400 });
44
+ }
45
+ }
@@ -1,6 +1,6 @@
1
1
  import { readFileSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
- let version = '0.25.8';
3
+ let version = '0.25.11';
4
4
  try {
5
5
  const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', '..', 'package.json'), 'utf-8'));
6
6
  version = pkg.version ?? version;
package/dist/workers.d.ts CHANGED
@@ -15,6 +15,8 @@ export interface GoodVibesCloudflareExecutionContext {
15
15
  export interface GoodVibesCloudflareWorkerEnv {
16
16
  GOODVIBES_DAEMON_URL?: string;
17
17
  GOODVIBES_OPERATOR_TOKEN?: string;
18
+ GOODVIBES_WORKER_TOKEN?: string;
19
+ GOODVIBES_QUEUE_JOB_PAYLOADS?: string;
18
20
  GOODVIBES_BATCH_QUEUE?: GoodVibesCloudflareQueue<GoodVibesCloudflareQueuePayload>;
19
21
  }
20
22
  export type GoodVibesCloudflareQueuePayload = {
@@ -29,7 +31,14 @@ export type GoodVibesCloudflareQueuePayload = {
29
31
  export interface GoodVibesCloudflareWorkerOptions {
30
32
  readonly daemonUrl?: string;
31
33
  readonly authToken?: string;
34
+ readonly workerAuthToken?: string;
32
35
  readonly queueJobPayloads?: boolean;
36
+ /**
37
+ * Explicitly allow unauthenticated non-health endpoints.
38
+ * Default is false: GOODVIBES_WORKER_TOKEN or workerAuthToken is required.
39
+ */
40
+ readonly allowUnauthenticated?: boolean;
41
+ readonly maxRequestBodyBytes?: number;
33
42
  }
34
43
  export interface GoodVibesCloudflareWorker {
35
44
  fetch(request: Request, env: GoodVibesCloudflareWorkerEnv, ctx: GoodVibesCloudflareExecutionContext): Promise<Response>;
@@ -1 +1 @@
1
- {"version":3,"file":"workers.d.ts","sourceRoot":"","sources":["../src/workers.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB,CAAC,IAAI,GAAG,OAAO;IACtD,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,+BAA+B,CAAC,IAAI,GAAG,OAAO;IAC7D,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,GAAG,CAAC,IAAI,IAAI,CAAC;IACb,KAAK,CAAC,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,+BAA+B,CAAC,IAAI,GAAG,OAAO;IAC7D,QAAQ,CAAC,QAAQ,EAAE,SAAS,+BAA+B,CAAC,IAAI,CAAC,EAAE,CAAC;CACrE;AAED,MAAM,WAAW,mCAAmC;IAClD,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CAC5C;AAED,MAAM,WAAW,4BAA4B;IAC3C,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,qBAAqB,CAAC,EAAE,wBAAwB,CAAC,+BAA+B,CAAC,CAAC;CACnF;AAED,MAAM,MAAM,+BAA+B,GACvC;IACE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEN,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,4BAA4B,EAAE,GAAG,EAAE,mCAAmC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxH,KAAK,CAAC,KAAK,EAAE,+BAA+B,CAAC,+BAA+B,CAAC,EAAE,GAAG,EAAE,4BAA4B,EAAE,GAAG,EAAE,mCAAmC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3K,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,4BAA4B,EAAE,GAAG,EAAE,mCAAmC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvH;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,GAAE,gCAAqC,GAC7C,yBAAyB,CAgE3B"}
1
+ {"version":3,"file":"workers.d.ts","sourceRoot":"","sources":["../src/workers.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB,CAAC,IAAI,GAAG,OAAO;IACtD,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,+BAA+B,CAAC,IAAI,GAAG,OAAO;IAC7D,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,GAAG,CAAC,IAAI,IAAI,CAAC;IACb,KAAK,CAAC,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,+BAA+B,CAAC,IAAI,GAAG,OAAO;IAC7D,QAAQ,CAAC,QAAQ,EAAE,SAAS,+BAA+B,CAAC,IAAI,CAAC,EAAE,CAAC;CACrE;AAED,MAAM,WAAW,mCAAmC;IAClD,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CAC5C;AAED,MAAM,WAAW,4BAA4B;IAC3C,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,qBAAqB,CAAC,EAAE,wBAAwB,CAAC,+BAA+B,CAAC,CAAC;CACnF;AAED,MAAM,MAAM,+BAA+B,GACvC;IACE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEN,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC;;;OAGG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IACxC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACvC;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,4BAA4B,EAAE,GAAG,EAAE,mCAAmC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxH,KAAK,CAAC,KAAK,EAAE,+BAA+B,CAAC,+BAA+B,CAAC,EAAE,GAAG,EAAE,4BAA4B,EAAE,GAAG,EAAE,mCAAmC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3K,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,4BAA4B,EAAE,GAAG,EAAE,mCAAmC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvH;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,GAAE,gCAAqC,GAC7C,yBAAyB,CAqE3B"}
package/dist/workers.js CHANGED
@@ -5,11 +5,16 @@ export function createGoodVibesCloudflareWorker(options = {}) {
5
5
  if (url.pathname === '/health' || url.pathname === '/batch/health') {
6
6
  return json({ ok: true, service: 'goodvibes-cloudflare-worker' });
7
7
  }
8
+ const authError = requireWorkerAuth(request, env, options);
9
+ if (authError)
10
+ return authError;
8
11
  if (url.pathname === '/batch/tick/enqueue' && request.method === 'POST') {
9
12
  const queue = env.GOODVIBES_BATCH_QUEUE;
10
13
  if (!queue)
11
14
  return json({ error: 'GOODVIBES_BATCH_QUEUE is not bound', code: 'QUEUE_NOT_CONFIGURED' }, 503);
12
15
  const body = await optionalJson(request);
16
+ if (body instanceof Response)
17
+ return body;
13
18
  await queue.send({
14
19
  type: 'batch.tick',
15
20
  force: toRecord(body)['force'] === true,
@@ -21,7 +26,7 @@ export function createGoodVibesCloudflareWorker(options = {}) {
21
26
  if (!daemonPath)
22
27
  return json({ error: 'Not found', code: 'NOT_FOUND' }, 404);
23
28
  if (url.pathname === '/batch/jobs/enqueue' && request.method === 'POST') {
24
- if (!options.queueJobPayloads) {
29
+ if (!options.queueJobPayloads && env.GOODVIBES_QUEUE_JOB_PAYLOADS !== 'true') {
25
30
  return json({
26
31
  error: 'Queueing full batch job payloads is disabled. Post /batch/jobs to proxy directly to the daemon, or enable queueJobPayloads explicitly.',
27
32
  code: 'QUEUE_PAYLOADS_DISABLED',
@@ -31,6 +36,8 @@ export function createGoodVibesCloudflareWorker(options = {}) {
31
36
  if (!queue)
32
37
  return json({ error: 'GOODVIBES_BATCH_QUEUE is not bound', code: 'QUEUE_NOT_CONFIGURED' }, 503);
33
38
  const body = await optionalJson(request);
39
+ if (body instanceof Response)
40
+ return body;
34
41
  await queue.send({
35
42
  type: 'batch.job.create',
36
43
  body: toRecord(body),
@@ -83,7 +90,17 @@ async function handleQueuePayload(payload, env, options) {
83
90
  });
84
91
  }
85
92
  async function proxyDaemonBatch(request, env, options, daemonPath) {
86
- const body = request.method === 'GET' || request.method === 'HEAD' ? undefined : await request.text();
93
+ if (request.method !== 'GET' && request.method !== 'HEAD') {
94
+ const contentType = request.headers.get('content-type') ?? '';
95
+ if (contentType && !contentType.toLowerCase().includes('application/json')) {
96
+ return json({ error: 'Only application/json batch payloads are supported', code: 'UNSUPPORTED_MEDIA_TYPE' }, 415);
97
+ }
98
+ }
99
+ const body = request.method === 'GET' || request.method === 'HEAD'
100
+ ? undefined
101
+ : await readTextBodyWithinLimit(request, options.maxRequestBodyBytes);
102
+ if (body instanceof Response)
103
+ return body;
87
104
  return proxyDaemonJson(env, options, daemonPath, {
88
105
  method: request.method,
89
106
  body,
@@ -116,12 +133,29 @@ function toDaemonBatchPath(pathname) {
116
133
  return '/api/batch';
117
134
  return null;
118
135
  }
136
+ function requireWorkerAuth(request, env, options) {
137
+ const expected = options.workerAuthToken ?? env.GOODVIBES_WORKER_TOKEN ?? '';
138
+ if (!expected && options.allowUnauthenticated === true)
139
+ return null;
140
+ if (!expected) {
141
+ return json({
142
+ error: 'GOODVIBES_WORKER_TOKEN is required for non-health endpoints',
143
+ code: 'WORKER_AUTH_TOKEN_REQUIRED',
144
+ }, 503);
145
+ }
146
+ const auth = request.headers.get('authorization') ?? '';
147
+ if (auth === `Bearer ${expected}`)
148
+ return null;
149
+ return json({ error: 'Worker authorization required', code: 'WORKER_AUTH_REQUIRED' }, 401);
150
+ }
119
151
  function resolveDaemonUrl(env, options) {
120
152
  const raw = options.daemonUrl ?? env.GOODVIBES_DAEMON_URL ?? '';
121
153
  return raw.replace(/\/+$/, '');
122
154
  }
123
155
  async function optionalJson(request) {
124
- const text = await request.text();
156
+ const text = await readTextBodyWithinLimit(request);
157
+ if (text instanceof Response)
158
+ return text;
125
159
  if (!text.trim())
126
160
  return {};
127
161
  try {
@@ -131,6 +165,36 @@ async function optionalJson(request) {
131
165
  return {};
132
166
  }
133
167
  }
168
+ async function readTextBodyWithinLimit(request, maxBytes = 1_000_000) {
169
+ const contentLength = Number.parseInt(request.headers.get('content-length') ?? '0', 10);
170
+ if (Number.isFinite(contentLength) && contentLength > maxBytes) {
171
+ return json({ error: 'Payload too large', code: 'PAYLOAD_TOO_LARGE' }, 413);
172
+ }
173
+ if (!request.body)
174
+ return '';
175
+ const reader = request.body.getReader();
176
+ const decoder = new TextDecoder();
177
+ let total = 0;
178
+ let body = '';
179
+ try {
180
+ for (;;) {
181
+ const { done, value } = await reader.read();
182
+ if (done)
183
+ break;
184
+ total += value.byteLength;
185
+ if (total > maxBytes) {
186
+ await reader.cancel('Payload too large').catch(() => { });
187
+ return json({ error: 'Payload too large', code: 'PAYLOAD_TOO_LARGE' }, 413);
188
+ }
189
+ body += decoder.decode(value, { stream: true });
190
+ }
191
+ body += decoder.decode();
192
+ return body;
193
+ }
194
+ finally {
195
+ reader.releaseLock();
196
+ }
197
+ }
134
198
  function json(body, status = 200) {
135
199
  return new Response(JSON.stringify(body), {
136
200
  status,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pellux/goodvibes-sdk",
3
- "version": "0.25.8",
3
+ "version": "0.25.11",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/mgd34msu/goodvibes-sdk.git"
@@ -13,6 +13,7 @@
13
13
  "@ast-grep/napi": "^0.42.0",
14
14
  "@aws/bedrock-token-generator": "^1.1.0",
15
15
  "bash-language-server": "file:vendor/bash-language-server",
16
+ "cloudflare": "5.2.0",
16
17
  "fuse.js": "^7.1.0",
17
18
  "google-auth-library": "10.6.2",
18
19
  "graphql": "^16.13.2",