denchclaw 2.0.6 → 2.0.7

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 (442) hide show
  1. package/README.md +9 -3
  2. package/apps/web/.next/standalone/apps/web/.next/BUILD_ID +1 -1
  3. package/apps/web/.next/standalone/apps/web/.next/app-build-manifest.json +172 -165
  4. package/apps/web/.next/standalone/apps/web/.next/app-path-routes-manifest.json +29 -28
  5. package/apps/web/.next/standalone/apps/web/.next/build-manifest.json +3 -3
  6. package/apps/web/.next/standalone/apps/web/.next/required-server-files.json +3 -3
  7. package/apps/web/.next/standalone/apps/web/.next/server/app/_not-found/page.js +2 -2
  8. package/apps/web/.next/standalone/apps/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  9. package/apps/web/.next/standalone/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  10. package/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.html +1 -1
  11. package/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.rsc +2 -2
  12. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/active/route.js +1 -1
  13. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/active/route_client-reference-manifest.js +1 -1
  14. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/route.js +2 -2
  15. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/route_client-reference-manifest.js +1 -1
  16. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stop/route.js +1 -1
  17. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stop/route_client-reference-manifest.js +1 -1
  18. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stream/route.js +2 -2
  19. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stream/route_client-reference-manifest.js +1 -1
  20. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/subagents/route.js +1 -1
  21. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/subagents/route_client-reference-manifest.js +1 -1
  22. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/jobs/[jobId]/runs/route.js +1 -1
  23. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/jobs/[jobId]/runs/route_client-reference-manifest.js +1 -1
  24. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/jobs/route.js +1 -1
  25. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/jobs/route_client-reference-manifest.js +1 -1
  26. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/runs/[sessionId]/route.js +1 -1
  27. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/runs/[sessionId]/route_client-reference-manifest.js +1 -1
  28. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/runs/search-transcript/route.js +1 -1
  29. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/runs/search-transcript/route_client-reference-manifest.js +1 -1
  30. package/apps/web/.next/standalone/apps/web/.next/server/app/api/feedback/route.js +1 -0
  31. package/apps/web/.next/standalone/apps/web/.next/server/app/api/feedback/route.js.nft.json +1 -0
  32. package/apps/web/.next/standalone/apps/web/.next/server/app/api/feedback/route_client-reference-manifest.js +1 -0
  33. package/apps/web/.next/standalone/apps/web/.next/server/app/api/memories/route.js +1 -1
  34. package/apps/web/.next/standalone/apps/web/.next/server/app/api/memories/route_client-reference-manifest.js +1 -1
  35. package/apps/web/.next/standalone/apps/web/.next/server/app/api/profiles/route.js +1 -1
  36. package/apps/web/.next/standalone/apps/web/.next/server/app/api/profiles/route_client-reference-manifest.js +1 -1
  37. package/apps/web/.next/standalone/apps/web/.next/server/app/api/profiles/switch/route.js +1 -1
  38. package/apps/web/.next/standalone/apps/web/.next/server/app/api/profiles/switch/route_client-reference-manifest.js +1 -1
  39. package/apps/web/.next/standalone/apps/web/.next/server/app/api/sessions/[sessionId]/route.js +1 -1
  40. package/apps/web/.next/standalone/apps/web/.next/server/app/api/sessions/[sessionId]/route_client-reference-manifest.js +1 -1
  41. package/apps/web/.next/standalone/apps/web/.next/server/app/api/sessions/route.js +1 -1
  42. package/apps/web/.next/standalone/apps/web/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
  43. package/apps/web/.next/standalone/apps/web/.next/server/app/api/skills/route.js +1 -1
  44. package/apps/web/.next/standalone/apps/web/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  45. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/[id]/messages/route.js +1 -1
  46. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/[id]/messages/route_client-reference-manifest.js +1 -1
  47. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/[id]/route.js +1 -1
  48. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/[id]/route_client-reference-manifest.js +1 -1
  49. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/route.js +1 -1
  50. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/route_client-reference-manifest.js +1 -1
  51. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/assets/[...path]/route.js +1 -1
  52. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/assets/[...path]/route_client-reference-manifest.js +1 -1
  53. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/browse/route.js +1 -1
  54. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/browse/route_client-reference-manifest.js +1 -1
  55. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/browse-file/route.js +1 -1
  56. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/browse-file/route_client-reference-manifest.js +1 -1
  57. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/context/route.js +1 -1
  58. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/context/route_client-reference-manifest.js +1 -1
  59. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/copy/route.js +1 -1
  60. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/copy/route_client-reference-manifest.js +1 -1
  61. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/db/introspect/route.js +1 -1
  62. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/db/introspect/route_client-reference-manifest.js +1 -1
  63. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/db/query/route.js +1 -1
  64. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/db/query/route_client-reference-manifest.js +1 -1
  65. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/delete/route.js +1 -1
  66. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/delete/route_client-reference-manifest.js +1 -1
  67. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/file/route.js +1 -1
  68. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/file/route_client-reference-manifest.js +1 -1
  69. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/init/route.js +2 -2
  70. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/init/route_client-reference-manifest.js +1 -1
  71. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/list/route.js +1 -1
  72. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/list/route_client-reference-manifest.js +1 -1
  73. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/mkdir/route.js +1 -1
  74. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/mkdir/route_client-reference-manifest.js +1 -1
  75. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/move/route.js +1 -1
  76. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/move/route_client-reference-manifest.js +1 -1
  77. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/display-field/route.js +1 -1
  78. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/display-field/route_client-reference-manifest.js +1 -1
  79. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/[id]/route.js +2 -2
  80. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/[id]/route_client-reference-manifest.js +1 -1
  81. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/bulk-delete/route.js +1 -1
  82. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/bulk-delete/route_client-reference-manifest.js +1 -1
  83. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/options/route.js +2 -2
  84. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/options/route_client-reference-manifest.js +1 -1
  85. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/route.js +1 -1
  86. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/route_client-reference-manifest.js +1 -1
  87. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route.js +1 -1
  88. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route_client-reference-manifest.js +1 -1
  89. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/[fieldId]/route.js +1 -1
  90. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/[fieldId]/route_client-reference-manifest.js +1 -1
  91. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/reorder/route.js +1 -1
  92. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/reorder/route_client-reference-manifest.js +1 -1
  93. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/route.js +2 -2
  94. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/route_client-reference-manifest.js +1 -1
  95. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/views/route.js +1 -1
  96. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/views/route_client-reference-manifest.js +1 -1
  97. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/open-file/route.js +1 -1
  98. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/open-file/route_client-reference-manifest.js +1 -1
  99. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/path-info/route.js +1 -1
  100. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/path-info/route_client-reference-manifest.js +1 -1
  101. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/query/route.js +1 -1
  102. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/query/route_client-reference-manifest.js +1 -1
  103. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/raw-file/route.js +1 -1
  104. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/raw-file/route_client-reference-manifest.js +1 -1
  105. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/rename/route.js +1 -1
  106. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/rename/route_client-reference-manifest.js +1 -1
  107. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/reports/execute/route.js +1 -1
  108. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/reports/execute/route_client-reference-manifest.js +1 -1
  109. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/search-index/route.js +2 -2
  110. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/search-index/route_client-reference-manifest.js +1 -1
  111. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/suggest-files/route.js +2 -2
  112. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/suggest-files/route_client-reference-manifest.js +1 -1
  113. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/switch/route.js +1 -1
  114. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/switch/route_client-reference-manifest.js +1 -1
  115. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/thumbnail/route.js +1 -1
  116. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/thumbnail/route_client-reference-manifest.js +1 -1
  117. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/tree/route.js +1 -1
  118. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/tree/route_client-reference-manifest.js +1 -1
  119. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/upload/route.js +1 -1
  120. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/upload/route_client-reference-manifest.js +1 -1
  121. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/virtual-file/route.js +1 -1
  122. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/virtual-file/route_client-reference-manifest.js +1 -1
  123. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/watch/route.js +2 -2
  124. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/watch/route_client-reference-manifest.js +1 -1
  125. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/write-binary/route.js +1 -1
  126. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/write-binary/route_client-reference-manifest.js +1 -1
  127. package/apps/web/.next/standalone/apps/web/.next/server/app/index.html +2 -2
  128. package/apps/web/.next/standalone/apps/web/.next/server/app/index.rsc +3 -3
  129. package/apps/web/.next/standalone/apps/web/.next/server/app/page.js +3 -3
  130. package/apps/web/.next/standalone/apps/web/.next/server/app/page.js.nft.json +1 -1
  131. package/apps/web/.next/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  132. package/apps/web/.next/standalone/apps/web/.next/server/app/workspace/page.js +14 -14
  133. package/apps/web/.next/standalone/apps/web/.next/server/app/workspace/page.js.nft.json +1 -1
  134. package/apps/web/.next/standalone/apps/web/.next/server/app/workspace/page_client-reference-manifest.js +1 -1
  135. package/apps/web/.next/standalone/apps/web/.next/server/app/workspace.html +1 -1
  136. package/apps/web/.next/standalone/apps/web/.next/server/app/workspace.rsc +3 -3
  137. package/apps/web/.next/standalone/apps/web/.next/server/app-paths-manifest.json +29 -28
  138. package/apps/web/.next/standalone/apps/web/.next/server/chunks/3180.js +3 -3
  139. package/apps/web/.next/standalone/apps/web/.next/server/functions-config-manifest.json +3 -3
  140. package/apps/web/.next/standalone/apps/web/.next/server/middleware-build-manifest.js +1 -1
  141. package/apps/web/.next/standalone/apps/web/.next/server/pages/404.html +1 -1
  142. package/apps/web/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
  143. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/_not-found/page-23e70510b8d52088.js +1 -0
  144. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/active/route-ff99b057da8a00ed.js +1 -0
  145. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/route-ff99b057da8a00ed.js +1 -0
  146. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/stop/route-ff99b057da8a00ed.js +1 -0
  147. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/stream/route-ff99b057da8a00ed.js +1 -0
  148. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/subagents/route-ff99b057da8a00ed.js +1 -0
  149. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/jobs/[jobId]/runs/route-ff99b057da8a00ed.js +1 -0
  150. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/jobs/route-ff99b057da8a00ed.js +1 -0
  151. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/runs/[sessionId]/route-ff99b057da8a00ed.js +1 -0
  152. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/runs/search-transcript/route-ff99b057da8a00ed.js +1 -0
  153. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/feedback/route-ff99b057da8a00ed.js +1 -0
  154. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/memories/route-ff99b057da8a00ed.js +1 -0
  155. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/profiles/route-ff99b057da8a00ed.js +1 -0
  156. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/profiles/switch/route-ff99b057da8a00ed.js +1 -0
  157. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/sessions/[sessionId]/route-ff99b057da8a00ed.js +1 -0
  158. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/sessions/route-ff99b057da8a00ed.js +1 -0
  159. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/skills/route-ff99b057da8a00ed.js +1 -0
  160. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/[id]/messages/route-ff99b057da8a00ed.js +1 -0
  161. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/[id]/route-ff99b057da8a00ed.js +1 -0
  162. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/route-ff99b057da8a00ed.js +1 -0
  163. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/assets/[...path]/route-ff99b057da8a00ed.js +1 -0
  164. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/browse/route-ff99b057da8a00ed.js +1 -0
  165. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/browse-file/route-ff99b057da8a00ed.js +1 -0
  166. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/context/route-ff99b057da8a00ed.js +1 -0
  167. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/copy/route-ff99b057da8a00ed.js +1 -0
  168. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/db/introspect/route-ff99b057da8a00ed.js +1 -0
  169. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/db/query/route-ff99b057da8a00ed.js +1 -0
  170. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/delete/route-ff99b057da8a00ed.js +1 -0
  171. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/file/route-ff99b057da8a00ed.js +1 -0
  172. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/init/route-ff99b057da8a00ed.js +1 -0
  173. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/list/route-ff99b057da8a00ed.js +1 -0
  174. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/mkdir/route-ff99b057da8a00ed.js +1 -0
  175. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/move/route-ff99b057da8a00ed.js +1 -0
  176. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/display-field/route-ff99b057da8a00ed.js +1 -0
  177. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/[id]/route-ff99b057da8a00ed.js +1 -0
  178. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/bulk-delete/route-ff99b057da8a00ed.js +1 -0
  179. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/options/route-ff99b057da8a00ed.js +1 -0
  180. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/route-ff99b057da8a00ed.js +1 -0
  181. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route-ff99b057da8a00ed.js +1 -0
  182. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/route-ff99b057da8a00ed.js +1 -0
  183. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/reorder/route-ff99b057da8a00ed.js +1 -0
  184. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/route-ff99b057da8a00ed.js +1 -0
  185. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/views/route-ff99b057da8a00ed.js +1 -0
  186. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/open-file/route-ff99b057da8a00ed.js +1 -0
  187. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/path-info/route-ff99b057da8a00ed.js +1 -0
  188. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/query/route-ff99b057da8a00ed.js +1 -0
  189. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/raw-file/route-ff99b057da8a00ed.js +1 -0
  190. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/rename/route-ff99b057da8a00ed.js +1 -0
  191. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/reports/execute/route-ff99b057da8a00ed.js +1 -0
  192. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/search-index/route-ff99b057da8a00ed.js +1 -0
  193. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/suggest-files/route-ff99b057da8a00ed.js +1 -0
  194. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/switch/route-ff99b057da8a00ed.js +1 -0
  195. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/thumbnail/route-ff99b057da8a00ed.js +1 -0
  196. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/tree/route-ff99b057da8a00ed.js +1 -0
  197. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/upload/route-ff99b057da8a00ed.js +1 -0
  198. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/virtual-file/route-ff99b057da8a00ed.js +1 -0
  199. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/watch/route-ff99b057da8a00ed.js +1 -0
  200. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/write-binary/route-ff99b057da8a00ed.js +1 -0
  201. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/layout-af0e9292b7fe2ec1.js +1 -0
  202. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/page-b213929ad6255c65.js +1 -0
  203. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/workspace/{page-a9c68aaa3f71a7fe.js → page-fe39ceef01137175.js} +1 -1
  204. package/apps/web/.next/standalone/apps/web/.next/static/chunks/main-app-c71b105c32544ad9.js +1 -0
  205. package/apps/web/.next/standalone/apps/web/.next/static/ezaYRoo0uHfvCgSL72gWA/_buildManifest.js +1 -0
  206. package/apps/web/.next/standalone/apps/web/server.js +1 -1
  207. package/apps/web/.next/standalone/package.json +2 -1
  208. package/apps/web/.next/static/chunks/app/_not-found/page-23e70510b8d52088.js +1 -0
  209. package/apps/web/.next/static/chunks/app/api/chat/active/route-ff99b057da8a00ed.js +1 -0
  210. package/apps/web/.next/static/chunks/app/api/chat/route-ff99b057da8a00ed.js +1 -0
  211. package/apps/web/.next/static/chunks/app/api/chat/stop/route-ff99b057da8a00ed.js +1 -0
  212. package/apps/web/.next/static/chunks/app/api/chat/stream/route-ff99b057da8a00ed.js +1 -0
  213. package/apps/web/.next/static/chunks/app/api/chat/subagents/route-ff99b057da8a00ed.js +1 -0
  214. package/apps/web/.next/static/chunks/app/api/cron/jobs/[jobId]/runs/route-ff99b057da8a00ed.js +1 -0
  215. package/apps/web/.next/static/chunks/app/api/cron/jobs/route-ff99b057da8a00ed.js +1 -0
  216. package/apps/web/.next/static/chunks/app/api/cron/runs/[sessionId]/route-ff99b057da8a00ed.js +1 -0
  217. package/apps/web/.next/static/chunks/app/api/cron/runs/search-transcript/route-ff99b057da8a00ed.js +1 -0
  218. package/apps/web/.next/static/chunks/app/api/feedback/route-ff99b057da8a00ed.js +1 -0
  219. package/apps/web/.next/static/chunks/app/api/memories/route-ff99b057da8a00ed.js +1 -0
  220. package/apps/web/.next/static/chunks/app/api/profiles/route-ff99b057da8a00ed.js +1 -0
  221. package/apps/web/.next/static/chunks/app/api/profiles/switch/route-ff99b057da8a00ed.js +1 -0
  222. package/apps/web/.next/static/chunks/app/api/sessions/[sessionId]/route-ff99b057da8a00ed.js +1 -0
  223. package/apps/web/.next/static/chunks/app/api/sessions/route-ff99b057da8a00ed.js +1 -0
  224. package/apps/web/.next/static/chunks/app/api/skills/route-ff99b057da8a00ed.js +1 -0
  225. package/apps/web/.next/static/chunks/app/api/web-sessions/[id]/messages/route-ff99b057da8a00ed.js +1 -0
  226. package/apps/web/.next/static/chunks/app/api/web-sessions/[id]/route-ff99b057da8a00ed.js +1 -0
  227. package/apps/web/.next/static/chunks/app/api/web-sessions/route-ff99b057da8a00ed.js +1 -0
  228. package/apps/web/.next/static/chunks/app/api/workspace/assets/[...path]/route-ff99b057da8a00ed.js +1 -0
  229. package/apps/web/.next/static/chunks/app/api/workspace/browse/route-ff99b057da8a00ed.js +1 -0
  230. package/apps/web/.next/static/chunks/app/api/workspace/browse-file/route-ff99b057da8a00ed.js +1 -0
  231. package/apps/web/.next/static/chunks/app/api/workspace/context/route-ff99b057da8a00ed.js +1 -0
  232. package/apps/web/.next/static/chunks/app/api/workspace/copy/route-ff99b057da8a00ed.js +1 -0
  233. package/apps/web/.next/static/chunks/app/api/workspace/db/introspect/route-ff99b057da8a00ed.js +1 -0
  234. package/apps/web/.next/static/chunks/app/api/workspace/db/query/route-ff99b057da8a00ed.js +1 -0
  235. package/apps/web/.next/static/chunks/app/api/workspace/delete/route-ff99b057da8a00ed.js +1 -0
  236. package/apps/web/.next/static/chunks/app/api/workspace/file/route-ff99b057da8a00ed.js +1 -0
  237. package/apps/web/.next/static/chunks/app/api/workspace/init/route-ff99b057da8a00ed.js +1 -0
  238. package/apps/web/.next/static/chunks/app/api/workspace/list/route-ff99b057da8a00ed.js +1 -0
  239. package/apps/web/.next/static/chunks/app/api/workspace/mkdir/route-ff99b057da8a00ed.js +1 -0
  240. package/apps/web/.next/static/chunks/app/api/workspace/move/route-ff99b057da8a00ed.js +1 -0
  241. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/display-field/route-ff99b057da8a00ed.js +1 -0
  242. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/[id]/route-ff99b057da8a00ed.js +1 -0
  243. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/bulk-delete/route-ff99b057da8a00ed.js +1 -0
  244. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/options/route-ff99b057da8a00ed.js +1 -0
  245. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/route-ff99b057da8a00ed.js +1 -0
  246. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route-ff99b057da8a00ed.js +1 -0
  247. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/route-ff99b057da8a00ed.js +1 -0
  248. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/reorder/route-ff99b057da8a00ed.js +1 -0
  249. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/route-ff99b057da8a00ed.js +1 -0
  250. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/views/route-ff99b057da8a00ed.js +1 -0
  251. package/apps/web/.next/static/chunks/app/api/workspace/open-file/route-ff99b057da8a00ed.js +1 -0
  252. package/apps/web/.next/static/chunks/app/api/workspace/path-info/route-ff99b057da8a00ed.js +1 -0
  253. package/apps/web/.next/static/chunks/app/api/workspace/query/route-ff99b057da8a00ed.js +1 -0
  254. package/apps/web/.next/static/chunks/app/api/workspace/raw-file/route-ff99b057da8a00ed.js +1 -0
  255. package/apps/web/.next/static/chunks/app/api/workspace/rename/route-ff99b057da8a00ed.js +1 -0
  256. package/apps/web/.next/static/chunks/app/api/workspace/reports/execute/route-ff99b057da8a00ed.js +1 -0
  257. package/apps/web/.next/static/chunks/app/api/workspace/search-index/route-ff99b057da8a00ed.js +1 -0
  258. package/apps/web/.next/static/chunks/app/api/workspace/suggest-files/route-ff99b057da8a00ed.js +1 -0
  259. package/apps/web/.next/static/chunks/app/api/workspace/switch/route-ff99b057da8a00ed.js +1 -0
  260. package/apps/web/.next/static/chunks/app/api/workspace/thumbnail/route-ff99b057da8a00ed.js +1 -0
  261. package/apps/web/.next/static/chunks/app/api/workspace/tree/route-ff99b057da8a00ed.js +1 -0
  262. package/apps/web/.next/static/chunks/app/api/workspace/upload/route-ff99b057da8a00ed.js +1 -0
  263. package/apps/web/.next/static/chunks/app/api/workspace/virtual-file/route-ff99b057da8a00ed.js +1 -0
  264. package/apps/web/.next/static/chunks/app/api/workspace/watch/route-ff99b057da8a00ed.js +1 -0
  265. package/apps/web/.next/static/chunks/app/api/workspace/write-binary/route-ff99b057da8a00ed.js +1 -0
  266. package/apps/web/.next/static/chunks/app/layout-af0e9292b7fe2ec1.js +1 -0
  267. package/apps/web/.next/static/chunks/app/page-b213929ad6255c65.js +1 -0
  268. package/apps/web/.next/static/chunks/app/workspace/{page-a9c68aaa3f71a7fe.js → page-fe39ceef01137175.js} +1 -1
  269. package/apps/web/.next/static/chunks/main-app-c71b105c32544ad9.js +1 -0
  270. package/apps/web/.next/static/ezaYRoo0uHfvCgSL72gWA/_buildManifest.js +1 -0
  271. package/dist/{cli-name-yhDyCrts.js → cli-name-YmLsNGR6.js} +1 -1
  272. package/dist/entry.js +3 -2
  273. package/dist/{program-CVEqiDmd.js → program-CfNvnqVx.js} +588 -25
  274. package/dist/{run-main-CBWtZaUl.js → run-main-BWHpVYis.js} +4 -4
  275. package/dist/{telemetry-UyOfXAoS.js → telemetry-CwRnbZ2F.js} +3 -2
  276. package/extensions/bluebubbles/node_modules/.bin/ironclaw +21 -0
  277. package/extensions/copilot-proxy/node_modules/.bin/ironclaw +21 -0
  278. package/extensions/diagnostics-otel/node_modules/.bin/ironclaw +21 -0
  279. package/extensions/discord/node_modules/.bin/ironclaw +21 -0
  280. package/extensions/feishu/node_modules/.bin/ironclaw +21 -0
  281. package/extensions/google-antigravity-auth/node_modules/.bin/ironclaw +21 -0
  282. package/extensions/google-gemini-cli-auth/node_modules/.bin/ironclaw +21 -0
  283. package/extensions/googlechat/node_modules/.bin/ironclaw +21 -0
  284. package/extensions/imessage/node_modules/.bin/ironclaw +21 -0
  285. package/extensions/irc/node_modules/.bin/ironclaw +21 -0
  286. package/extensions/line/node_modules/.bin/ironclaw +21 -0
  287. package/extensions/llm-task/node_modules/.bin/ironclaw +21 -0
  288. package/extensions/lobster/node_modules/.bin/ironclaw +21 -0
  289. package/extensions/matrix/node_modules/.bin/ironclaw +21 -0
  290. package/extensions/matrix/node_modules/.bin/markdown-it +21 -0
  291. package/extensions/mattermost/node_modules/.bin/ironclaw +21 -0
  292. package/extensions/memory-core/node_modules/.bin/ironclaw +21 -0
  293. package/extensions/memory-lancedb/node_modules/.bin/ironclaw +21 -0
  294. package/extensions/memory-lancedb/node_modules/.bin/openai +21 -0
  295. package/extensions/minimax-portal-auth/node_modules/.bin/ironclaw +21 -0
  296. package/extensions/msteams/node_modules/.bin/ironclaw +21 -0
  297. package/extensions/nextcloud-talk/node_modules/.bin/ironclaw +21 -0
  298. package/extensions/nostr/node_modules/.bin/ironclaw +21 -0
  299. package/extensions/open-prose/node_modules/.bin/ironclaw +21 -0
  300. package/extensions/posthog-analytics/index.ts +162 -0
  301. package/extensions/posthog-analytics/lib/event-mappers.ts +312 -0
  302. package/extensions/posthog-analytics/lib/posthog-client.ts +81 -0
  303. package/extensions/posthog-analytics/lib/privacy.ts +83 -0
  304. package/extensions/posthog-analytics/lib/trace-context.ts +103 -0
  305. package/extensions/posthog-analytics/lib/types.ts +28 -0
  306. package/extensions/posthog-analytics/openclaw.plugin.json +22 -0
  307. package/extensions/posthog-analytics/package.json +8 -0
  308. package/extensions/signal/node_modules/.bin/ironclaw +21 -0
  309. package/extensions/slack/node_modules/.bin/ironclaw +21 -0
  310. package/extensions/synology-chat/node_modules/.bin/ironclaw +21 -0
  311. package/extensions/telegram/node_modules/.bin/ironclaw +21 -0
  312. package/extensions/tlon/node_modules/.bin/ironclaw +21 -0
  313. package/extensions/twitch/node_modules/.bin/ironclaw +21 -0
  314. package/extensions/voice-call/node_modules/.bin/ironclaw +21 -0
  315. package/extensions/whatsapp/node_modules/.bin/ironclaw +21 -0
  316. package/extensions/zalo/node_modules/.bin/ironclaw +21 -0
  317. package/extensions/zalouser/node_modules/.bin/ironclaw +21 -0
  318. package/package.json +2 -1
  319. package/apps/web/.next/standalone/apps/web/.next/static/bfBSw7Zh4Df36UcKsQE27/_buildManifest.js +0 -1
  320. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/_not-found/page-6934a35b4d14cdab.js +0 -1
  321. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/active/route-5dc3b3b56eb45a36.js +0 -1
  322. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/route-5dc3b3b56eb45a36.js +0 -1
  323. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/stop/route-5dc3b3b56eb45a36.js +0 -1
  324. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/stream/route-5dc3b3b56eb45a36.js +0 -1
  325. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/subagents/route-5dc3b3b56eb45a36.js +0 -1
  326. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/jobs/[jobId]/runs/route-5dc3b3b56eb45a36.js +0 -1
  327. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/jobs/route-5dc3b3b56eb45a36.js +0 -1
  328. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/runs/[sessionId]/route-5dc3b3b56eb45a36.js +0 -1
  329. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/runs/search-transcript/route-5dc3b3b56eb45a36.js +0 -1
  330. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/memories/route-5dc3b3b56eb45a36.js +0 -1
  331. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/profiles/route-5dc3b3b56eb45a36.js +0 -1
  332. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/profiles/switch/route-5dc3b3b56eb45a36.js +0 -1
  333. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/sessions/[sessionId]/route-5dc3b3b56eb45a36.js +0 -1
  334. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/sessions/route-5dc3b3b56eb45a36.js +0 -1
  335. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/skills/route-5dc3b3b56eb45a36.js +0 -1
  336. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/[id]/messages/route-5dc3b3b56eb45a36.js +0 -1
  337. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/[id]/route-5dc3b3b56eb45a36.js +0 -1
  338. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/route-5dc3b3b56eb45a36.js +0 -1
  339. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/assets/[...path]/route-5dc3b3b56eb45a36.js +0 -1
  340. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/browse/route-5dc3b3b56eb45a36.js +0 -1
  341. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/browse-file/route-5dc3b3b56eb45a36.js +0 -1
  342. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/context/route-5dc3b3b56eb45a36.js +0 -1
  343. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/copy/route-5dc3b3b56eb45a36.js +0 -1
  344. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/db/introspect/route-5dc3b3b56eb45a36.js +0 -1
  345. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/db/query/route-5dc3b3b56eb45a36.js +0 -1
  346. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/delete/route-5dc3b3b56eb45a36.js +0 -1
  347. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/file/route-5dc3b3b56eb45a36.js +0 -1
  348. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/init/route-5dc3b3b56eb45a36.js +0 -1
  349. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/list/route-5dc3b3b56eb45a36.js +0 -1
  350. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/mkdir/route-5dc3b3b56eb45a36.js +0 -1
  351. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/move/route-5dc3b3b56eb45a36.js +0 -1
  352. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/display-field/route-5dc3b3b56eb45a36.js +0 -1
  353. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/[id]/route-5dc3b3b56eb45a36.js +0 -1
  354. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/bulk-delete/route-5dc3b3b56eb45a36.js +0 -1
  355. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/options/route-5dc3b3b56eb45a36.js +0 -1
  356. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/route-5dc3b3b56eb45a36.js +0 -1
  357. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route-5dc3b3b56eb45a36.js +0 -1
  358. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/route-5dc3b3b56eb45a36.js +0 -1
  359. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/reorder/route-5dc3b3b56eb45a36.js +0 -1
  360. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/route-5dc3b3b56eb45a36.js +0 -1
  361. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/views/route-5dc3b3b56eb45a36.js +0 -1
  362. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/open-file/route-5dc3b3b56eb45a36.js +0 -1
  363. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/path-info/route-5dc3b3b56eb45a36.js +0 -1
  364. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/query/route-5dc3b3b56eb45a36.js +0 -1
  365. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/raw-file/route-5dc3b3b56eb45a36.js +0 -1
  366. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/rename/route-5dc3b3b56eb45a36.js +0 -1
  367. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/reports/execute/route-5dc3b3b56eb45a36.js +0 -1
  368. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/search-index/route-5dc3b3b56eb45a36.js +0 -1
  369. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/suggest-files/route-5dc3b3b56eb45a36.js +0 -1
  370. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/switch/route-5dc3b3b56eb45a36.js +0 -1
  371. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/thumbnail/route-5dc3b3b56eb45a36.js +0 -1
  372. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/tree/route-5dc3b3b56eb45a36.js +0 -1
  373. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/upload/route-5dc3b3b56eb45a36.js +0 -1
  374. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/virtual-file/route-5dc3b3b56eb45a36.js +0 -1
  375. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/watch/route-5dc3b3b56eb45a36.js +0 -1
  376. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/write-binary/route-5dc3b3b56eb45a36.js +0 -1
  377. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/layout-01f7966beacdd67b.js +0 -1
  378. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/page-f365ecf6d5915738.js +0 -1
  379. package/apps/web/.next/standalone/apps/web/.next/static/chunks/main-app-b49c23ad3d7c2890.js +0 -1
  380. package/apps/web/.next/static/bfBSw7Zh4Df36UcKsQE27/_buildManifest.js +0 -1
  381. package/apps/web/.next/static/chunks/app/_not-found/page-6934a35b4d14cdab.js +0 -1
  382. package/apps/web/.next/static/chunks/app/api/chat/active/route-5dc3b3b56eb45a36.js +0 -1
  383. package/apps/web/.next/static/chunks/app/api/chat/route-5dc3b3b56eb45a36.js +0 -1
  384. package/apps/web/.next/static/chunks/app/api/chat/stop/route-5dc3b3b56eb45a36.js +0 -1
  385. package/apps/web/.next/static/chunks/app/api/chat/stream/route-5dc3b3b56eb45a36.js +0 -1
  386. package/apps/web/.next/static/chunks/app/api/chat/subagents/route-5dc3b3b56eb45a36.js +0 -1
  387. package/apps/web/.next/static/chunks/app/api/cron/jobs/[jobId]/runs/route-5dc3b3b56eb45a36.js +0 -1
  388. package/apps/web/.next/static/chunks/app/api/cron/jobs/route-5dc3b3b56eb45a36.js +0 -1
  389. package/apps/web/.next/static/chunks/app/api/cron/runs/[sessionId]/route-5dc3b3b56eb45a36.js +0 -1
  390. package/apps/web/.next/static/chunks/app/api/cron/runs/search-transcript/route-5dc3b3b56eb45a36.js +0 -1
  391. package/apps/web/.next/static/chunks/app/api/memories/route-5dc3b3b56eb45a36.js +0 -1
  392. package/apps/web/.next/static/chunks/app/api/profiles/route-5dc3b3b56eb45a36.js +0 -1
  393. package/apps/web/.next/static/chunks/app/api/profiles/switch/route-5dc3b3b56eb45a36.js +0 -1
  394. package/apps/web/.next/static/chunks/app/api/sessions/[sessionId]/route-5dc3b3b56eb45a36.js +0 -1
  395. package/apps/web/.next/static/chunks/app/api/sessions/route-5dc3b3b56eb45a36.js +0 -1
  396. package/apps/web/.next/static/chunks/app/api/skills/route-5dc3b3b56eb45a36.js +0 -1
  397. package/apps/web/.next/static/chunks/app/api/web-sessions/[id]/messages/route-5dc3b3b56eb45a36.js +0 -1
  398. package/apps/web/.next/static/chunks/app/api/web-sessions/[id]/route-5dc3b3b56eb45a36.js +0 -1
  399. package/apps/web/.next/static/chunks/app/api/web-sessions/route-5dc3b3b56eb45a36.js +0 -1
  400. package/apps/web/.next/static/chunks/app/api/workspace/assets/[...path]/route-5dc3b3b56eb45a36.js +0 -1
  401. package/apps/web/.next/static/chunks/app/api/workspace/browse/route-5dc3b3b56eb45a36.js +0 -1
  402. package/apps/web/.next/static/chunks/app/api/workspace/browse-file/route-5dc3b3b56eb45a36.js +0 -1
  403. package/apps/web/.next/static/chunks/app/api/workspace/context/route-5dc3b3b56eb45a36.js +0 -1
  404. package/apps/web/.next/static/chunks/app/api/workspace/copy/route-5dc3b3b56eb45a36.js +0 -1
  405. package/apps/web/.next/static/chunks/app/api/workspace/db/introspect/route-5dc3b3b56eb45a36.js +0 -1
  406. package/apps/web/.next/static/chunks/app/api/workspace/db/query/route-5dc3b3b56eb45a36.js +0 -1
  407. package/apps/web/.next/static/chunks/app/api/workspace/delete/route-5dc3b3b56eb45a36.js +0 -1
  408. package/apps/web/.next/static/chunks/app/api/workspace/file/route-5dc3b3b56eb45a36.js +0 -1
  409. package/apps/web/.next/static/chunks/app/api/workspace/init/route-5dc3b3b56eb45a36.js +0 -1
  410. package/apps/web/.next/static/chunks/app/api/workspace/list/route-5dc3b3b56eb45a36.js +0 -1
  411. package/apps/web/.next/static/chunks/app/api/workspace/mkdir/route-5dc3b3b56eb45a36.js +0 -1
  412. package/apps/web/.next/static/chunks/app/api/workspace/move/route-5dc3b3b56eb45a36.js +0 -1
  413. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/display-field/route-5dc3b3b56eb45a36.js +0 -1
  414. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/[id]/route-5dc3b3b56eb45a36.js +0 -1
  415. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/bulk-delete/route-5dc3b3b56eb45a36.js +0 -1
  416. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/options/route-5dc3b3b56eb45a36.js +0 -1
  417. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/route-5dc3b3b56eb45a36.js +0 -1
  418. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route-5dc3b3b56eb45a36.js +0 -1
  419. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/route-5dc3b3b56eb45a36.js +0 -1
  420. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/reorder/route-5dc3b3b56eb45a36.js +0 -1
  421. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/route-5dc3b3b56eb45a36.js +0 -1
  422. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/views/route-5dc3b3b56eb45a36.js +0 -1
  423. package/apps/web/.next/static/chunks/app/api/workspace/open-file/route-5dc3b3b56eb45a36.js +0 -1
  424. package/apps/web/.next/static/chunks/app/api/workspace/path-info/route-5dc3b3b56eb45a36.js +0 -1
  425. package/apps/web/.next/static/chunks/app/api/workspace/query/route-5dc3b3b56eb45a36.js +0 -1
  426. package/apps/web/.next/static/chunks/app/api/workspace/raw-file/route-5dc3b3b56eb45a36.js +0 -1
  427. package/apps/web/.next/static/chunks/app/api/workspace/rename/route-5dc3b3b56eb45a36.js +0 -1
  428. package/apps/web/.next/static/chunks/app/api/workspace/reports/execute/route-5dc3b3b56eb45a36.js +0 -1
  429. package/apps/web/.next/static/chunks/app/api/workspace/search-index/route-5dc3b3b56eb45a36.js +0 -1
  430. package/apps/web/.next/static/chunks/app/api/workspace/suggest-files/route-5dc3b3b56eb45a36.js +0 -1
  431. package/apps/web/.next/static/chunks/app/api/workspace/switch/route-5dc3b3b56eb45a36.js +0 -1
  432. package/apps/web/.next/static/chunks/app/api/workspace/thumbnail/route-5dc3b3b56eb45a36.js +0 -1
  433. package/apps/web/.next/static/chunks/app/api/workspace/tree/route-5dc3b3b56eb45a36.js +0 -1
  434. package/apps/web/.next/static/chunks/app/api/workspace/upload/route-5dc3b3b56eb45a36.js +0 -1
  435. package/apps/web/.next/static/chunks/app/api/workspace/virtual-file/route-5dc3b3b56eb45a36.js +0 -1
  436. package/apps/web/.next/static/chunks/app/api/workspace/watch/route-5dc3b3b56eb45a36.js +0 -1
  437. package/apps/web/.next/static/chunks/app/api/workspace/write-binary/route-5dc3b3b56eb45a36.js +0 -1
  438. package/apps/web/.next/static/chunks/app/layout-01f7966beacdd67b.js +0 -1
  439. package/apps/web/.next/static/chunks/app/page-f365ecf6d5915738.js +0 -1
  440. package/apps/web/.next/static/chunks/main-app-b49c23ad3d7c2890.js +0 -1
  441. /package/apps/web/.next/standalone/apps/web/.next/static/{bfBSw7Zh4Df36UcKsQE27 → ezaYRoo0uHfvCgSL72gWA}/_ssgManifest.js +0 -0
  442. /package/apps/web/.next/static/{bfBSw7Zh4Df36UcKsQE27 → ezaYRoo0uHfvCgSL72gWA}/_ssgManifest.js +0 -0
@@ -0,0 +1,162 @@
1
+ import { createPostHogClient, shutdownPostHogClient } from "./lib/posthog-client.js";
2
+ import { TraceContextManager, resolveSessionKey } from "./lib/trace-context.js";
3
+ import { emitGeneration, emitToolSpan, emitTrace, emitCustomEvent } from "./lib/event-mappers.js";
4
+ import { readPrivacyMode } from "./lib/privacy.js";
5
+ import type { PluginConfig } from "./lib/types.js";
6
+
7
+ export const id = "posthog-analytics";
8
+
9
+ const DEBUG = process.env.DENCHCLAW_POSTHOG_DEBUG === "1";
10
+
11
+ function debugLog(label: string, data: unknown): void {
12
+ if (!DEBUG) return;
13
+ try {
14
+ process.stderr.write(`[posthog-analytics] ${label}: ${JSON.stringify(data, null, 2)}\n`);
15
+ } catch { /* ignore serialization errors */ }
16
+ }
17
+
18
+ export default function register(api: any) {
19
+ const config: PluginConfig | undefined =
20
+ api.config?.plugins?.entries?.["posthog-analytics"]?.config;
21
+
22
+ if (!config?.apiKey) return;
23
+ if (config.enabled === false) return;
24
+
25
+ const ph = createPostHogClient(config.apiKey, config.host);
26
+ const traceCtx = new TraceContextManager();
27
+
28
+ const getPrivacyMode = () => readPrivacyMode(api.config);
29
+
30
+ const getConfigModel = (): string | undefined =>
31
+ api.config?.agents?.defaults?.model?.primary;
32
+
33
+ const ensureTrace = (ctx: any): void => {
34
+ const sk = resolveSessionKey(ctx);
35
+ if (traceCtx.getTrace(sk)) return;
36
+ traceCtx.startTrace(sk, ctx.runId ?? sk);
37
+ const model = getConfigModel();
38
+ if (model) traceCtx.setModel(sk, model);
39
+ };
40
+
41
+ api.on(
42
+ "before_model_resolve",
43
+ (event: any, ctx: any) => {
44
+ debugLog("before_model_resolve event", event);
45
+ debugLog("before_model_resolve ctx", { runId: ctx.runId, sessionId: ctx.sessionId, sessionKey: ctx.sessionKey });
46
+
47
+ const sk = resolveSessionKey(ctx);
48
+ traceCtx.startTrace(sk, ctx.runId ?? sk);
49
+ const model = event.modelOverride || getConfigModel();
50
+ if (model) {
51
+ traceCtx.setModel(sk, model);
52
+ }
53
+ },
54
+ { priority: -10 },
55
+ );
56
+
57
+ api.on(
58
+ "before_prompt_build",
59
+ (_event: any, ctx: any) => {
60
+ debugLog("before_prompt_build ctx", { runId: ctx.runId, sessionId: ctx.sessionId, hasMessages: Boolean(ctx.messages) });
61
+
62
+ const sk = resolveSessionKey(ctx);
63
+ ensureTrace(ctx);
64
+ if (ctx.messages) {
65
+ traceCtx.setInput(sk, ctx.messages, getPrivacyMode());
66
+ }
67
+ },
68
+ { priority: -10 },
69
+ );
70
+
71
+ api.on(
72
+ "before_tool_call",
73
+ (event: any, ctx: any) => {
74
+ debugLog("before_tool_call", { toolName: event.toolName, runId: ctx.runId, sessionId: ctx.sessionId });
75
+
76
+ const sk = resolveSessionKey(ctx);
77
+ ensureTrace(ctx);
78
+ traceCtx.startToolSpan(sk, event.toolName, event.params);
79
+ },
80
+ { priority: -10 },
81
+ );
82
+
83
+ api.on(
84
+ "after_tool_call",
85
+ (event: any, ctx: any) => {
86
+ debugLog("after_tool_call", { toolName: event.toolName, runId: ctx.runId, sessionId: ctx.sessionId, hasError: Boolean(event.error), durationMs: event.durationMs });
87
+
88
+ const sk = resolveSessionKey(ctx);
89
+ ensureTrace(ctx);
90
+ traceCtx.endToolSpan(sk, event.toolName, event.result);
91
+ emitToolSpan(ph, traceCtx, sk, event, getPrivacyMode());
92
+ },
93
+ { priority: -10 },
94
+ );
95
+
96
+ api.on(
97
+ "agent_end",
98
+ (event: any, ctx: any) => {
99
+ debugLog("agent_end event", { success: event.success, error: event.error, durationMs: event.durationMs, messageCount: event.messages?.length });
100
+ debugLog("agent_end ctx", { runId: ctx.runId, sessionId: ctx.sessionId });
101
+
102
+ const sk = resolveSessionKey(ctx);
103
+ ensureTrace(ctx);
104
+
105
+ const trace = traceCtx.getTrace(sk);
106
+ if (trace && !trace.model) {
107
+ const model = getConfigModel();
108
+ if (model) traceCtx.setModel(sk, model);
109
+ }
110
+
111
+ emitGeneration(ph, traceCtx, sk, event, getPrivacyMode());
112
+ emitTrace(ph, traceCtx, sk);
113
+ emitCustomEvent(ph, "dench_turn_completed", {
114
+ session_id: sk,
115
+ run_id: ctx.runId,
116
+ model: traceCtx.getModel(sk),
117
+ });
118
+ traceCtx.endTrace(sk);
119
+ },
120
+ { priority: -10 },
121
+ );
122
+
123
+ api.on(
124
+ "message_received",
125
+ (event: any, ctx: any) => {
126
+ emitCustomEvent(ph, "dench_message_received", {
127
+ channel: ctx.channel ?? ctx.channelId,
128
+ session_id: ctx.sessionId,
129
+ has_attachments: Boolean(event.attachments?.length),
130
+ });
131
+ },
132
+ { priority: -10 },
133
+ );
134
+
135
+ api.on(
136
+ "session_start",
137
+ (_event: any, ctx: any) => {
138
+ emitCustomEvent(ph, "dench_session_start", {
139
+ session_id: ctx.sessionId,
140
+ channel: ctx.channel ?? ctx.channelId,
141
+ });
142
+ },
143
+ { priority: -10 },
144
+ );
145
+
146
+ api.on(
147
+ "session_end",
148
+ (_event: any, ctx: any) => {
149
+ emitCustomEvent(ph, "dench_session_end", {
150
+ session_id: ctx.sessionId,
151
+ channel: ctx.channel ?? ctx.channelId,
152
+ });
153
+ },
154
+ { priority: -10 },
155
+ );
156
+
157
+ api.registerService({
158
+ id: "posthog-analytics",
159
+ start: () => api.logger.info("[posthog-analytics] service started"),
160
+ stop: () => shutdownPostHogClient(ph),
161
+ });
162
+ }
@@ -0,0 +1,312 @@
1
+ import { createHash } from "node:crypto";
2
+ import os from "node:os";
3
+ import type { PostHogClient } from "./posthog-client.js";
4
+ import type { TraceContextManager } from "./trace-context.js";
5
+ import { sanitizeForCapture, stripSecrets } from "./privacy.js";
6
+
7
+ function getAnonymousId(): string {
8
+ try {
9
+ const raw = `${os.hostname()}:${os.userInfo().username}`;
10
+ return createHash("sha256").update(raw).digest("hex").slice(0, 16);
11
+ } catch {
12
+ return "unknown";
13
+ }
14
+ }
15
+
16
+ /**
17
+ * Extract actual token counts and cost from OpenClaw's per-message usage metadata.
18
+ * Each assistant message in the agent_end messages array includes:
19
+ * usage: { input, output, cacheRead, cacheWrite, cost: { total, input, output, ... } }
20
+ */
21
+ export function extractUsageFromMessages(messages: unknown): {
22
+ inputTokens: number;
23
+ outputTokens: number;
24
+ totalCostUsd: number;
25
+ } {
26
+ if (!Array.isArray(messages)) return { inputTokens: 0, outputTokens: 0, totalCostUsd: 0 };
27
+ let inputTokens = 0;
28
+ let outputTokens = 0;
29
+ let totalCostUsd = 0;
30
+ for (const msg of messages) {
31
+ if (!msg || typeof msg !== "object") continue;
32
+ const m = msg as Record<string, unknown>;
33
+ if (m.role !== "assistant") continue;
34
+ const usage = m.usage as Record<string, unknown> | undefined;
35
+ if (!usage) continue;
36
+ if (typeof usage.input === "number") inputTokens += usage.input;
37
+ if (typeof usage.output === "number") outputTokens += usage.output;
38
+ const cost = usage.cost as Record<string, unknown> | undefined;
39
+ if (cost && typeof cost.total === "number") totalCostUsd += cost.total;
40
+ }
41
+ return { inputTokens, outputTokens, totalCostUsd };
42
+ }
43
+
44
+ /**
45
+ * Extract tool call names from the messages array provided by agent_end.
46
+ * Works regardless of privacy mode since tool names are metadata, not content.
47
+ */
48
+ export function extractToolNamesFromMessages(messages: unknown): string[] {
49
+ if (!Array.isArray(messages)) return [];
50
+ const names: string[] = [];
51
+ for (const msg of messages) {
52
+ if (!msg || typeof msg !== "object") continue;
53
+ const m = msg as Record<string, unknown>;
54
+
55
+ // OpenAI format: assistant message with tool_calls array
56
+ if (Array.isArray(m.tool_calls)) {
57
+ for (const tc of m.tool_calls) {
58
+ const name = (tc as any)?.function?.name ?? (tc as any)?.name;
59
+ if (typeof name === "string" && name) names.push(name);
60
+ }
61
+ }
62
+ // Anthropic format: content blocks with type "tool_use"
63
+ if (Array.isArray(m.content)) {
64
+ for (const block of m.content) {
65
+ if ((block as any)?.type === "tool_use" && typeof (block as any)?.name === "string") {
66
+ names.push((block as any).name);
67
+ }
68
+ if ((block as any)?.type === "tool-call" && typeof (block as any)?.toolName === "string") {
69
+ names.push((block as any).toolName);
70
+ }
71
+ }
72
+ }
73
+ // Tool result messages have a "name" field with the tool name
74
+ if (m.role === "tool" && typeof m.name === "string") {
75
+ names.push(m.name);
76
+ }
77
+ }
78
+ return [...new Set(names)];
79
+ }
80
+
81
+ /**
82
+ * Normalize OpenClaw's message format into OpenAI-compatible output choices
83
+ * so PostHog can extract tool calls for the Tools tab.
84
+ * Converts Anthropic-style content blocks (type: "toolCall") to OpenAI's
85
+ * tool_calls array format.
86
+ */
87
+ export function normalizeOutputForPostHog(messages: unknown): unknown[] | undefined {
88
+ if (!Array.isArray(messages)) return undefined;
89
+ const choices: unknown[] = [];
90
+ for (const msg of messages) {
91
+ if (!msg || typeof msg !== "object") continue;
92
+ const m = msg as Record<string, unknown>;
93
+ if (m.role !== "assistant") continue;
94
+
95
+ const toolCalls: unknown[] = [];
96
+ let textContent = "";
97
+
98
+ if (Array.isArray(m.content)) {
99
+ for (const block of m.content as Array<Record<string, unknown>>) {
100
+ if (block.type === "text" && typeof block.text === "string") {
101
+ textContent += block.text;
102
+ }
103
+ if (block.type === "toolCall" && typeof block.name === "string") {
104
+ toolCalls.push({
105
+ id: block.id ?? block.toolCallId,
106
+ type: "function",
107
+ function: {
108
+ name: block.name,
109
+ arguments: typeof block.arguments === "string"
110
+ ? block.arguments
111
+ : JSON.stringify(block.arguments ?? {}),
112
+ },
113
+ });
114
+ }
115
+ }
116
+ } else if (typeof m.content === "string") {
117
+ textContent = m.content;
118
+ }
119
+
120
+ if (Array.isArray(m.tool_calls)) {
121
+ for (const tc of m.tool_calls as Array<Record<string, unknown>>) {
122
+ toolCalls.push(tc);
123
+ }
124
+ }
125
+
126
+ const choice: Record<string, unknown> = {
127
+ role: "assistant",
128
+ content: textContent || null,
129
+ };
130
+ if (toolCalls.length > 0) {
131
+ choice.tool_calls = toolCalls;
132
+ }
133
+ choices.push(choice);
134
+ }
135
+ return choices.length > 0 ? choices : undefined;
136
+ }
137
+
138
+ /**
139
+ * Emit a `$ai_generation` event from the agent_end hook data.
140
+ */
141
+ export function emitGeneration(
142
+ ph: PostHogClient,
143
+ traceCtx: TraceContextManager,
144
+ sessionKey: string,
145
+ event: any,
146
+ privacyMode: boolean,
147
+ ): void {
148
+ try {
149
+ const trace = traceCtx.getTrace(sessionKey);
150
+ if (!trace) return;
151
+
152
+ const latency = event.durationMs != null
153
+ ? event.durationMs / 1_000
154
+ : trace.startedAt
155
+ ? (Date.now() - trace.startedAt) / 1_000
156
+ : undefined;
157
+
158
+ const spanToolNames = trace.toolSpans.map((s) => s.toolName);
159
+ const messageToolNames = extractToolNamesFromMessages(event.messages);
160
+ const allToolNames = [...new Set([...spanToolNames, ...messageToolNames])];
161
+
162
+ const properties: Record<string, unknown> = {
163
+ $ai_trace_id: trace.traceId,
164
+ $ai_session_id: trace.sessionId,
165
+ $ai_model: trace.model ?? event.model ?? "unknown",
166
+ $ai_provider: trace.provider ?? event.provider,
167
+ $ai_latency: latency,
168
+ $ai_tools: allToolNames.length > 0
169
+ ? allToolNames.map((name) => ({ type: "function", function: { name } }))
170
+ : undefined,
171
+ $ai_stream: event.stream,
172
+ $ai_temperature: event.temperature,
173
+ $ai_is_error: event.success === false || Boolean(event.error),
174
+ };
175
+
176
+ if (event.usage) {
177
+ const inputTokens = event.usage.inputTokens ?? event.usage.input_tokens;
178
+ const outputTokens = event.usage.outputTokens ?? event.usage.output_tokens;
179
+ if (inputTokens != null && inputTokens > 0) properties.$ai_input_tokens = inputTokens;
180
+ if (outputTokens != null && outputTokens > 0) properties.$ai_output_tokens = outputTokens;
181
+ const cost = event.cost?.totalUsd ?? event.cost?.total_usd;
182
+ if (cost != null && cost > 0) properties.$ai_total_cost_usd = cost;
183
+ } else if (event.messages) {
184
+ const extracted = extractUsageFromMessages(event.messages);
185
+ if (extracted.inputTokens > 0) properties.$ai_input_tokens = extracted.inputTokens;
186
+ if (extracted.outputTokens > 0) properties.$ai_output_tokens = extracted.outputTokens;
187
+ if (extracted.totalCostUsd > 0) properties.$ai_total_cost_usd = extracted.totalCostUsd;
188
+ }
189
+
190
+ properties.$ai_input = sanitizeForCapture(trace.input, privacyMode);
191
+
192
+ const outputChoices = normalizeOutputForPostHog(event.messages);
193
+ properties.$ai_output_choices = sanitizeForCapture(
194
+ outputChoices ?? event.output ?? event.messages,
195
+ privacyMode,
196
+ );
197
+
198
+ if (event.error) {
199
+ properties.$ai_error = typeof event.error === "string"
200
+ ? event.error
201
+ : event.error?.message ?? String(event.error);
202
+ }
203
+
204
+ ph.capture({
205
+ distinctId: getAnonymousId(),
206
+ event: "$ai_generation",
207
+ properties,
208
+ });
209
+ } catch {
210
+ // Never crash the gateway for telemetry failures.
211
+ }
212
+ }
213
+
214
+ /**
215
+ * Emit a `$ai_span` event for a completed tool call.
216
+ */
217
+ export function emitToolSpan(
218
+ ph: PostHogClient,
219
+ traceCtx: TraceContextManager,
220
+ sessionKey: string,
221
+ event: any,
222
+ privacyMode: boolean,
223
+ ): void {
224
+ try {
225
+ const trace = traceCtx.getTrace(sessionKey);
226
+ const span = traceCtx.getLastToolSpan(sessionKey);
227
+ if (!trace || !span) return;
228
+
229
+ const latency = span.startedAt && span.endedAt
230
+ ? (span.endedAt - span.startedAt) / 1_000
231
+ : event.durationMs != null
232
+ ? event.durationMs / 1_000
233
+ : undefined;
234
+
235
+ const properties: Record<string, unknown> = {
236
+ $ai_trace_id: trace.traceId,
237
+ $ai_session_id: trace.sessionId,
238
+ $ai_span_id: span.spanId,
239
+ $ai_span_name: span.toolName,
240
+ $ai_parent_id: trace.traceId,
241
+ $ai_latency: latency,
242
+ $ai_is_error: span.isError ?? Boolean(event.error),
243
+ };
244
+
245
+ if (!privacyMode) {
246
+ properties.tool_params = stripSecrets(span.params);
247
+ properties.tool_result = stripSecrets(span.result);
248
+ }
249
+
250
+ ph.capture({
251
+ distinctId: getAnonymousId(),
252
+ event: "$ai_span",
253
+ properties,
254
+ });
255
+ } catch {
256
+ // Fail silently.
257
+ }
258
+ }
259
+
260
+ /**
261
+ * Emit a `$ai_trace` event for the completed agent run.
262
+ */
263
+ export function emitTrace(
264
+ ph: PostHogClient,
265
+ traceCtx: TraceContextManager,
266
+ sessionKey: string,
267
+ ): void {
268
+ try {
269
+ const trace = traceCtx.getTrace(sessionKey);
270
+ if (!trace) return;
271
+
272
+ const latency = trace.startedAt
273
+ ? (Date.now() - trace.startedAt) / 1_000
274
+ : undefined;
275
+
276
+ ph.capture({
277
+ distinctId: getAnonymousId(),
278
+ event: "$ai_trace",
279
+ properties: {
280
+ $ai_trace_id: trace.traceId,
281
+ $ai_session_id: trace.sessionId,
282
+ $ai_latency: latency,
283
+ $ai_span_name: "agent_run",
284
+ tool_count: trace.toolSpans.length,
285
+ },
286
+ });
287
+ } catch {
288
+ // Fail silently.
289
+ }
290
+ }
291
+
292
+ /**
293
+ * Emit a custom DenchClaw event (not a PostHog $ai_* event).
294
+ */
295
+ export function emitCustomEvent(
296
+ ph: PostHogClient,
297
+ eventName: string,
298
+ properties?: Record<string, unknown>,
299
+ ): void {
300
+ try {
301
+ ph.capture({
302
+ distinctId: getAnonymousId(),
303
+ event: eventName,
304
+ properties: {
305
+ ...properties,
306
+ $process_person_profile: false,
307
+ },
308
+ });
309
+ } catch {
310
+ // Fail silently.
311
+ }
312
+ }
@@ -0,0 +1,81 @@
1
+ const DEFAULT_HOST = "https://us.i.posthog.com";
2
+ const FLUSH_INTERVAL_MS = 15_000;
3
+ const FLUSH_AT = 10;
4
+
5
+ export interface CaptureEvent {
6
+ distinctId: string;
7
+ event: string;
8
+ properties?: Record<string, unknown>;
9
+ }
10
+
11
+ /**
12
+ * Minimal PostHog client using the HTTP capture API directly.
13
+ * Zero npm dependencies -- uses built-in fetch (Node 18+).
14
+ */
15
+ export class PostHogClient {
16
+ private apiKey: string;
17
+ private host: string;
18
+ private queue: Array<Record<string, unknown>> = [];
19
+ private timer: ReturnType<typeof setInterval> | null = null;
20
+
21
+ constructor(apiKey: string, host?: string) {
22
+ this.apiKey = apiKey;
23
+ this.host = (host || DEFAULT_HOST).replace(/\/$/, "");
24
+ this.timer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);
25
+ if (this.timer.unref) this.timer.unref();
26
+ }
27
+
28
+ capture(event: CaptureEvent): void {
29
+ this.queue.push({
30
+ event: event.event,
31
+ distinct_id: event.distinctId,
32
+ properties: {
33
+ ...event.properties,
34
+ $lib: "denchclaw-posthog-plugin",
35
+ },
36
+ timestamp: new Date().toISOString(),
37
+ });
38
+
39
+ if (this.queue.length >= FLUSH_AT) {
40
+ this.flush();
41
+ }
42
+ }
43
+
44
+ flush(): void {
45
+ if (this.queue.length === 0) return;
46
+
47
+ const batch = this.queue.splice(0);
48
+ const body = JSON.stringify({
49
+ api_key: this.apiKey,
50
+ batch,
51
+ });
52
+
53
+ fetch(`${this.host}/batch/`, {
54
+ method: "POST",
55
+ headers: { "Content-Type": "application/json" },
56
+ body,
57
+ }).catch(() => {
58
+ // Fail silently -- telemetry should never block the gateway.
59
+ });
60
+ }
61
+
62
+ async shutdown(): Promise<void> {
63
+ if (this.timer) {
64
+ clearInterval(this.timer);
65
+ this.timer = null;
66
+ }
67
+ this.flush();
68
+ }
69
+ }
70
+
71
+ export function createPostHogClient(apiKey: string, host?: string): PostHogClient {
72
+ return new PostHogClient(apiKey, host);
73
+ }
74
+
75
+ export async function shutdownPostHogClient(client: PostHogClient): Promise<void> {
76
+ try {
77
+ await client.shutdown();
78
+ } catch {
79
+ // Non-fatal.
80
+ }
81
+ }
@@ -0,0 +1,83 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+
4
+ const SECRETS_PATTERN =
5
+ /(?:sk-[a-zA-Z0-9]{20,}|ghp_[a-zA-Z0-9]{36}|xoxb-[a-zA-Z0-9-]+|AKIA[A-Z0-9]{16}|eyJ[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,})/g;
6
+
7
+ const REDACTED = "[REDACTED]";
8
+
9
+ /**
10
+ * Read privacy mode from DenchClaw's telemetry config.
11
+ * Default is true (privacy on) when the file is missing or unreadable.
12
+ */
13
+ export function readPrivacyMode(openclawConfig?: any): boolean {
14
+ try {
15
+ const stateDir =
16
+ openclawConfig?.stateDir ??
17
+ join(process.env.HOME || "~", ".openclaw-dench");
18
+ const configPath = join(stateDir, "telemetry.json");
19
+ if (!existsSync(configPath)) return true;
20
+ const raw = JSON.parse(readFileSync(configPath, "utf-8"));
21
+ return raw.privacyMode !== false;
22
+ } catch {
23
+ return true;
24
+ }
25
+ }
26
+
27
+ /** Strip known credential patterns from any string value. */
28
+ export function stripSecrets(value: unknown): unknown {
29
+ if (typeof value === "string") {
30
+ return value.replace(SECRETS_PATTERN, REDACTED);
31
+ }
32
+ if (Array.isArray(value)) {
33
+ return value.map(stripSecrets);
34
+ }
35
+ if (value && typeof value === "object") {
36
+ const out: Record<string, unknown> = {};
37
+ for (const [k, v] of Object.entries(value)) {
38
+ const keyLower = k.toLowerCase();
39
+ if (
40
+ keyLower.includes("key") ||
41
+ keyLower.includes("token") ||
42
+ keyLower.includes("secret") ||
43
+ keyLower.includes("password") ||
44
+ keyLower.includes("credential")
45
+ ) {
46
+ out[k] = REDACTED;
47
+ } else {
48
+ out[k] = stripSecrets(v);
49
+ }
50
+ }
51
+ return out;
52
+ }
53
+ return value;
54
+ }
55
+
56
+ /**
57
+ * Redact message content for privacy mode.
58
+ * Preserves structure (role, tool names) but removes actual text content.
59
+ */
60
+ export function redactMessages(messages: unknown): unknown {
61
+ if (!Array.isArray(messages)) return messages;
62
+ return messages.map((msg: any) => {
63
+ if (!msg || typeof msg !== "object") return msg;
64
+ const redacted: Record<string, unknown> = { role: msg.role };
65
+ if (msg.name) redacted.name = msg.name;
66
+ if (msg.tool_call_id) redacted.tool_call_id = msg.tool_call_id;
67
+ redacted.content = REDACTED;
68
+ return redacted;
69
+ });
70
+ }
71
+
72
+ /**
73
+ * Sanitize a value based on privacy mode.
74
+ * When privacy is on: redacts content, always strips secrets.
75
+ * When privacy is off: only strips secrets.
76
+ */
77
+ export function sanitizeForCapture(
78
+ value: unknown,
79
+ privacyMode: boolean,
80
+ ): unknown {
81
+ if (privacyMode) return REDACTED;
82
+ return stripSecrets(value);
83
+ }