denchclaw 2.0.6 → 2.0.8

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 (463) 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 +233 -225
  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 +6 -6
  6. package/apps/web/.next/standalone/apps/web/.next/react-loadable-manifest.json +1 -1
  7. package/apps/web/.next/standalone/apps/web/.next/required-server-files.json +3 -3
  8. package/apps/web/.next/standalone/apps/web/.next/server/app/_not-found/page.js +2 -2
  9. package/apps/web/.next/standalone/apps/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  10. package/apps/web/.next/standalone/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  11. package/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.html +1 -1
  12. package/apps/web/.next/standalone/apps/web/.next/server/app/_not-found.rsc +2 -2
  13. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/active/route.js +1 -1
  14. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/active/route_client-reference-manifest.js +1 -1
  15. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/route.js +2 -2
  16. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/route_client-reference-manifest.js +1 -1
  17. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stop/route.js +1 -1
  18. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stop/route_client-reference-manifest.js +1 -1
  19. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stream/route.js +2 -2
  20. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/stream/route_client-reference-manifest.js +1 -1
  21. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/subagents/route.js +1 -1
  22. package/apps/web/.next/standalone/apps/web/.next/server/app/api/chat/subagents/route_client-reference-manifest.js +1 -1
  23. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/jobs/[jobId]/runs/route.js +1 -1
  24. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/jobs/[jobId]/runs/route_client-reference-manifest.js +1 -1
  25. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/jobs/route.js +1 -1
  26. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/jobs/route_client-reference-manifest.js +1 -1
  27. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/runs/[sessionId]/route.js +1 -1
  28. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/runs/[sessionId]/route_client-reference-manifest.js +1 -1
  29. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/runs/search-transcript/route.js +1 -1
  30. package/apps/web/.next/standalone/apps/web/.next/server/app/api/cron/runs/search-transcript/route_client-reference-manifest.js +1 -1
  31. package/apps/web/.next/standalone/apps/web/.next/server/app/api/feedback/route.js +1 -0
  32. package/apps/web/.next/standalone/apps/web/.next/server/app/api/feedback/route.js.nft.json +1 -0
  33. package/apps/web/.next/standalone/apps/web/.next/server/app/api/feedback/route_client-reference-manifest.js +1 -0
  34. package/apps/web/.next/standalone/apps/web/.next/server/app/api/memories/route.js +1 -1
  35. package/apps/web/.next/standalone/apps/web/.next/server/app/api/memories/route_client-reference-manifest.js +1 -1
  36. package/apps/web/.next/standalone/apps/web/.next/server/app/api/profiles/route.js +1 -1
  37. package/apps/web/.next/standalone/apps/web/.next/server/app/api/profiles/route_client-reference-manifest.js +1 -1
  38. package/apps/web/.next/standalone/apps/web/.next/server/app/api/profiles/switch/route.js +1 -1
  39. package/apps/web/.next/standalone/apps/web/.next/server/app/api/profiles/switch/route_client-reference-manifest.js +1 -1
  40. package/apps/web/.next/standalone/apps/web/.next/server/app/api/sessions/[sessionId]/route.js +1 -1
  41. package/apps/web/.next/standalone/apps/web/.next/server/app/api/sessions/[sessionId]/route_client-reference-manifest.js +1 -1
  42. package/apps/web/.next/standalone/apps/web/.next/server/app/api/sessions/route.js +1 -1
  43. package/apps/web/.next/standalone/apps/web/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
  44. package/apps/web/.next/standalone/apps/web/.next/server/app/api/skills/route.js +1 -1
  45. package/apps/web/.next/standalone/apps/web/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  46. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/[id]/messages/route.js +1 -1
  47. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/[id]/messages/route_client-reference-manifest.js +1 -1
  48. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/[id]/route.js +1 -1
  49. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/[id]/route_client-reference-manifest.js +1 -1
  50. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/route.js +1 -1
  51. package/apps/web/.next/standalone/apps/web/.next/server/app/api/web-sessions/route_client-reference-manifest.js +1 -1
  52. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/assets/[...path]/route.js +1 -1
  53. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/assets/[...path]/route_client-reference-manifest.js +1 -1
  54. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/browse/route.js +1 -1
  55. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/browse/route_client-reference-manifest.js +1 -1
  56. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/browse-file/route.js +1 -1
  57. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/browse-file/route_client-reference-manifest.js +1 -1
  58. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/context/route.js +1 -1
  59. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/context/route_client-reference-manifest.js +1 -1
  60. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/copy/route.js +1 -1
  61. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/copy/route_client-reference-manifest.js +1 -1
  62. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/db/introspect/route.js +1 -1
  63. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/db/introspect/route_client-reference-manifest.js +1 -1
  64. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/db/query/route.js +1 -1
  65. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/db/query/route_client-reference-manifest.js +1 -1
  66. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/delete/route.js +1 -1
  67. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/delete/route_client-reference-manifest.js +1 -1
  68. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/file/route.js +1 -1
  69. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/file/route_client-reference-manifest.js +1 -1
  70. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/init/route.js +2 -2
  71. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/init/route_client-reference-manifest.js +1 -1
  72. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/list/route.js +1 -1
  73. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/list/route_client-reference-manifest.js +1 -1
  74. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/mkdir/route.js +1 -1
  75. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/mkdir/route_client-reference-manifest.js +1 -1
  76. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/move/route.js +1 -1
  77. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/move/route_client-reference-manifest.js +1 -1
  78. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/display-field/route.js +1 -1
  79. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/display-field/route_client-reference-manifest.js +1 -1
  80. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/[id]/route.js +2 -2
  81. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/[id]/route_client-reference-manifest.js +1 -1
  82. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/bulk-delete/route.js +1 -1
  83. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/bulk-delete/route_client-reference-manifest.js +1 -1
  84. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/options/route.js +2 -2
  85. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/options/route_client-reference-manifest.js +1 -1
  86. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/route.js +1 -1
  87. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/entries/route_client-reference-manifest.js +1 -1
  88. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route.js +1 -1
  89. 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
  90. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/[fieldId]/route.js +1 -1
  91. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/[fieldId]/route_client-reference-manifest.js +1 -1
  92. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/reorder/route.js +1 -1
  93. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/fields/reorder/route_client-reference-manifest.js +1 -1
  94. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/route.js +2 -2
  95. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/route_client-reference-manifest.js +1 -1
  96. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/views/route.js +1 -1
  97. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/objects/[name]/views/route_client-reference-manifest.js +1 -1
  98. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/open-file/route.js +1 -1
  99. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/open-file/route_client-reference-manifest.js +1 -1
  100. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/path-info/route.js +1 -1
  101. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/path-info/route_client-reference-manifest.js +1 -1
  102. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/query/route.js +1 -1
  103. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/query/route_client-reference-manifest.js +1 -1
  104. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/raw-file/route.js +1 -1
  105. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/raw-file/route_client-reference-manifest.js +1 -1
  106. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/rename/route.js +1 -1
  107. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/rename/route_client-reference-manifest.js +1 -1
  108. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/reports/execute/route.js +1 -1
  109. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/reports/execute/route_client-reference-manifest.js +1 -1
  110. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/search-index/route.js +2 -2
  111. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/search-index/route_client-reference-manifest.js +1 -1
  112. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/suggest-files/route.js +2 -2
  113. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/suggest-files/route_client-reference-manifest.js +1 -1
  114. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/switch/route.js +1 -1
  115. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/switch/route_client-reference-manifest.js +1 -1
  116. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/thumbnail/route.js +1 -1
  117. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/thumbnail/route_client-reference-manifest.js +1 -1
  118. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/tree/route.js +1 -1
  119. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/tree/route_client-reference-manifest.js +1 -1
  120. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/upload/route.js +1 -1
  121. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/upload/route_client-reference-manifest.js +1 -1
  122. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/virtual-file/route.js +1 -1
  123. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/virtual-file/route_client-reference-manifest.js +1 -1
  124. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/watch/route.js +2 -2
  125. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/watch/route_client-reference-manifest.js +1 -1
  126. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/write-binary/route.js +1 -1
  127. package/apps/web/.next/standalone/apps/web/.next/server/app/api/workspace/write-binary/route_client-reference-manifest.js +1 -1
  128. package/apps/web/.next/standalone/apps/web/.next/server/app/index.html +1 -72
  129. package/apps/web/.next/standalone/apps/web/.next/server/app/index.rsc +3 -3
  130. package/apps/web/.next/standalone/apps/web/.next/server/app/page.js +3 -3
  131. package/apps/web/.next/standalone/apps/web/.next/server/app/page.js.nft.json +1 -1
  132. package/apps/web/.next/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  133. package/apps/web/.next/standalone/apps/web/.next/server/app/workspace/page.js +14 -14
  134. package/apps/web/.next/standalone/apps/web/.next/server/app/workspace/page.js.nft.json +1 -1
  135. package/apps/web/.next/standalone/apps/web/.next/server/app/workspace/page_client-reference-manifest.js +1 -1
  136. package/apps/web/.next/standalone/apps/web/.next/server/app/workspace.html +1 -1
  137. package/apps/web/.next/standalone/apps/web/.next/server/app/workspace.rsc +3 -3
  138. package/apps/web/.next/standalone/apps/web/.next/server/app-paths-manifest.json +29 -28
  139. package/apps/web/.next/standalone/apps/web/.next/server/chunks/5334.js +9 -0
  140. package/apps/web/.next/standalone/apps/web/.next/server/functions-config-manifest.json +19 -18
  141. package/apps/web/.next/standalone/apps/web/.next/server/middleware-build-manifest.js +1 -1
  142. package/apps/web/.next/standalone/apps/web/.next/server/middleware-react-loadable-manifest.js +1 -1
  143. package/apps/web/.next/standalone/apps/web/.next/server/pages/404.html +1 -1
  144. package/apps/web/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
  145. package/apps/web/.next/standalone/apps/web/.next/static/_8L73FbiTvTDeQfyyo9Kx/_buildManifest.js +1 -0
  146. package/apps/web/.next/standalone/apps/web/.next/static/chunks/{9978-a2bf90231d08284f.js → 4988-a31fb680255d2e53.js} +3 -3
  147. package/apps/web/.next/{static/chunks/7597.6cb599051f1a46f7.js → standalone/apps/web/.next/static/chunks/9978.7ad588863427f502.js} +1 -1
  148. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/_not-found/page-23e70510b8d52088.js +1 -0
  149. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/active/route-ff99b057da8a00ed.js +1 -0
  150. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/route-ff99b057da8a00ed.js +1 -0
  151. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/stop/route-ff99b057da8a00ed.js +1 -0
  152. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/stream/route-ff99b057da8a00ed.js +1 -0
  153. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/subagents/route-ff99b057da8a00ed.js +1 -0
  154. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/jobs/[jobId]/runs/route-ff99b057da8a00ed.js +1 -0
  155. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/jobs/route-ff99b057da8a00ed.js +1 -0
  156. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/runs/[sessionId]/route-ff99b057da8a00ed.js +1 -0
  157. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/runs/search-transcript/route-ff99b057da8a00ed.js +1 -0
  158. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/feedback/route-ff99b057da8a00ed.js +1 -0
  159. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/memories/route-ff99b057da8a00ed.js +1 -0
  160. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/profiles/route-ff99b057da8a00ed.js +1 -0
  161. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/profiles/switch/route-ff99b057da8a00ed.js +1 -0
  162. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/sessions/[sessionId]/route-ff99b057da8a00ed.js +1 -0
  163. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/sessions/route-ff99b057da8a00ed.js +1 -0
  164. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/skills/route-ff99b057da8a00ed.js +1 -0
  165. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/[id]/messages/route-ff99b057da8a00ed.js +1 -0
  166. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/[id]/route-ff99b057da8a00ed.js +1 -0
  167. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/route-ff99b057da8a00ed.js +1 -0
  168. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/assets/[...path]/route-ff99b057da8a00ed.js +1 -0
  169. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/browse/route-ff99b057da8a00ed.js +1 -0
  170. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/browse-file/route-ff99b057da8a00ed.js +1 -0
  171. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/context/route-ff99b057da8a00ed.js +1 -0
  172. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/copy/route-ff99b057da8a00ed.js +1 -0
  173. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/db/introspect/route-ff99b057da8a00ed.js +1 -0
  174. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/db/query/route-ff99b057da8a00ed.js +1 -0
  175. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/delete/route-ff99b057da8a00ed.js +1 -0
  176. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/file/route-ff99b057da8a00ed.js +1 -0
  177. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/init/route-ff99b057da8a00ed.js +1 -0
  178. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/list/route-ff99b057da8a00ed.js +1 -0
  179. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/mkdir/route-ff99b057da8a00ed.js +1 -0
  180. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/move/route-ff99b057da8a00ed.js +1 -0
  181. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/display-field/route-ff99b057da8a00ed.js +1 -0
  182. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/[id]/route-ff99b057da8a00ed.js +1 -0
  183. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/bulk-delete/route-ff99b057da8a00ed.js +1 -0
  184. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/options/route-ff99b057da8a00ed.js +1 -0
  185. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/route-ff99b057da8a00ed.js +1 -0
  186. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route-ff99b057da8a00ed.js +1 -0
  187. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/route-ff99b057da8a00ed.js +1 -0
  188. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/reorder/route-ff99b057da8a00ed.js +1 -0
  189. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/route-ff99b057da8a00ed.js +1 -0
  190. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/views/route-ff99b057da8a00ed.js +1 -0
  191. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/open-file/route-ff99b057da8a00ed.js +1 -0
  192. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/path-info/route-ff99b057da8a00ed.js +1 -0
  193. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/query/route-ff99b057da8a00ed.js +1 -0
  194. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/raw-file/route-ff99b057da8a00ed.js +1 -0
  195. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/rename/route-ff99b057da8a00ed.js +1 -0
  196. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/reports/execute/route-ff99b057da8a00ed.js +1 -0
  197. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/search-index/route-ff99b057da8a00ed.js +1 -0
  198. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/suggest-files/route-ff99b057da8a00ed.js +1 -0
  199. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/switch/route-ff99b057da8a00ed.js +1 -0
  200. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/thumbnail/route-ff99b057da8a00ed.js +1 -0
  201. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/tree/route-ff99b057da8a00ed.js +1 -0
  202. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/upload/route-ff99b057da8a00ed.js +1 -0
  203. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/virtual-file/route-ff99b057da8a00ed.js +1 -0
  204. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/watch/route-ff99b057da8a00ed.js +1 -0
  205. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/write-binary/route-ff99b057da8a00ed.js +1 -0
  206. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/layout-4d0405acdb5ee8e5.js +1 -0
  207. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/page-b213929ad6255c65.js +1 -0
  208. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/workspace/{page-a9c68aaa3f71a7fe.js → page-ad24ce15d77e044d.js} +1 -1
  209. package/apps/web/.next/standalone/apps/web/.next/static/chunks/df90ee31-b8ee23eaa0135739.js +1 -0
  210. package/apps/web/.next/standalone/apps/web/.next/static/chunks/main-app-c71b105c32544ad9.js +1 -0
  211. package/apps/web/.next/standalone/apps/web/.next/static/chunks/{webpack-1032d39338965700.js → webpack-38d8ef58f812737b.js} +1 -1
  212. package/apps/web/.next/standalone/apps/web/public/fonts/Bookerly-Bold.ttf +0 -0
  213. package/apps/web/.next/standalone/apps/web/public/fonts/Bookerly-BoldItalic.ttf +0 -0
  214. package/apps/web/.next/standalone/apps/web/public/fonts/Bookerly-Regular.ttf +0 -0
  215. package/apps/web/.next/standalone/apps/web/public/fonts/Bookerly-RegularItalic.ttf +0 -0
  216. package/apps/web/.next/standalone/apps/web/server.js +1 -1
  217. package/apps/web/.next/standalone/package.json +2 -1
  218. package/apps/web/.next/static/_8L73FbiTvTDeQfyyo9Kx/_buildManifest.js +1 -0
  219. package/apps/web/.next/static/chunks/{9978-a2bf90231d08284f.js → 4988-a31fb680255d2e53.js} +3 -3
  220. package/apps/web/.next/{standalone/apps/web/.next/static/chunks/7597.6cb599051f1a46f7.js → static/chunks/9978.7ad588863427f502.js} +1 -1
  221. package/apps/web/.next/static/chunks/app/_not-found/page-23e70510b8d52088.js +1 -0
  222. package/apps/web/.next/static/chunks/app/api/chat/active/route-ff99b057da8a00ed.js +1 -0
  223. package/apps/web/.next/static/chunks/app/api/chat/route-ff99b057da8a00ed.js +1 -0
  224. package/apps/web/.next/static/chunks/app/api/chat/stop/route-ff99b057da8a00ed.js +1 -0
  225. package/apps/web/.next/static/chunks/app/api/chat/stream/route-ff99b057da8a00ed.js +1 -0
  226. package/apps/web/.next/static/chunks/app/api/chat/subagents/route-ff99b057da8a00ed.js +1 -0
  227. package/apps/web/.next/static/chunks/app/api/cron/jobs/[jobId]/runs/route-ff99b057da8a00ed.js +1 -0
  228. package/apps/web/.next/static/chunks/app/api/cron/jobs/route-ff99b057da8a00ed.js +1 -0
  229. package/apps/web/.next/static/chunks/app/api/cron/runs/[sessionId]/route-ff99b057da8a00ed.js +1 -0
  230. package/apps/web/.next/static/chunks/app/api/cron/runs/search-transcript/route-ff99b057da8a00ed.js +1 -0
  231. package/apps/web/.next/static/chunks/app/api/feedback/route-ff99b057da8a00ed.js +1 -0
  232. package/apps/web/.next/static/chunks/app/api/memories/route-ff99b057da8a00ed.js +1 -0
  233. package/apps/web/.next/static/chunks/app/api/profiles/route-ff99b057da8a00ed.js +1 -0
  234. package/apps/web/.next/static/chunks/app/api/profiles/switch/route-ff99b057da8a00ed.js +1 -0
  235. package/apps/web/.next/static/chunks/app/api/sessions/[sessionId]/route-ff99b057da8a00ed.js +1 -0
  236. package/apps/web/.next/static/chunks/app/api/sessions/route-ff99b057da8a00ed.js +1 -0
  237. package/apps/web/.next/static/chunks/app/api/skills/route-ff99b057da8a00ed.js +1 -0
  238. package/apps/web/.next/static/chunks/app/api/web-sessions/[id]/messages/route-ff99b057da8a00ed.js +1 -0
  239. package/apps/web/.next/static/chunks/app/api/web-sessions/[id]/route-ff99b057da8a00ed.js +1 -0
  240. package/apps/web/.next/static/chunks/app/api/web-sessions/route-ff99b057da8a00ed.js +1 -0
  241. package/apps/web/.next/static/chunks/app/api/workspace/assets/[...path]/route-ff99b057da8a00ed.js +1 -0
  242. package/apps/web/.next/static/chunks/app/api/workspace/browse/route-ff99b057da8a00ed.js +1 -0
  243. package/apps/web/.next/static/chunks/app/api/workspace/browse-file/route-ff99b057da8a00ed.js +1 -0
  244. package/apps/web/.next/static/chunks/app/api/workspace/context/route-ff99b057da8a00ed.js +1 -0
  245. package/apps/web/.next/static/chunks/app/api/workspace/copy/route-ff99b057da8a00ed.js +1 -0
  246. package/apps/web/.next/static/chunks/app/api/workspace/db/introspect/route-ff99b057da8a00ed.js +1 -0
  247. package/apps/web/.next/static/chunks/app/api/workspace/db/query/route-ff99b057da8a00ed.js +1 -0
  248. package/apps/web/.next/static/chunks/app/api/workspace/delete/route-ff99b057da8a00ed.js +1 -0
  249. package/apps/web/.next/static/chunks/app/api/workspace/file/route-ff99b057da8a00ed.js +1 -0
  250. package/apps/web/.next/static/chunks/app/api/workspace/init/route-ff99b057da8a00ed.js +1 -0
  251. package/apps/web/.next/static/chunks/app/api/workspace/list/route-ff99b057da8a00ed.js +1 -0
  252. package/apps/web/.next/static/chunks/app/api/workspace/mkdir/route-ff99b057da8a00ed.js +1 -0
  253. package/apps/web/.next/static/chunks/app/api/workspace/move/route-ff99b057da8a00ed.js +1 -0
  254. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/display-field/route-ff99b057da8a00ed.js +1 -0
  255. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/[id]/route-ff99b057da8a00ed.js +1 -0
  256. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/bulk-delete/route-ff99b057da8a00ed.js +1 -0
  257. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/options/route-ff99b057da8a00ed.js +1 -0
  258. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/route-ff99b057da8a00ed.js +1 -0
  259. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route-ff99b057da8a00ed.js +1 -0
  260. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/route-ff99b057da8a00ed.js +1 -0
  261. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/reorder/route-ff99b057da8a00ed.js +1 -0
  262. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/route-ff99b057da8a00ed.js +1 -0
  263. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/views/route-ff99b057da8a00ed.js +1 -0
  264. package/apps/web/.next/static/chunks/app/api/workspace/open-file/route-ff99b057da8a00ed.js +1 -0
  265. package/apps/web/.next/static/chunks/app/api/workspace/path-info/route-ff99b057da8a00ed.js +1 -0
  266. package/apps/web/.next/static/chunks/app/api/workspace/query/route-ff99b057da8a00ed.js +1 -0
  267. package/apps/web/.next/static/chunks/app/api/workspace/raw-file/route-ff99b057da8a00ed.js +1 -0
  268. package/apps/web/.next/static/chunks/app/api/workspace/rename/route-ff99b057da8a00ed.js +1 -0
  269. package/apps/web/.next/static/chunks/app/api/workspace/reports/execute/route-ff99b057da8a00ed.js +1 -0
  270. package/apps/web/.next/static/chunks/app/api/workspace/search-index/route-ff99b057da8a00ed.js +1 -0
  271. package/apps/web/.next/static/chunks/app/api/workspace/suggest-files/route-ff99b057da8a00ed.js +1 -0
  272. package/apps/web/.next/static/chunks/app/api/workspace/switch/route-ff99b057da8a00ed.js +1 -0
  273. package/apps/web/.next/static/chunks/app/api/workspace/thumbnail/route-ff99b057da8a00ed.js +1 -0
  274. package/apps/web/.next/static/chunks/app/api/workspace/tree/route-ff99b057da8a00ed.js +1 -0
  275. package/apps/web/.next/static/chunks/app/api/workspace/upload/route-ff99b057da8a00ed.js +1 -0
  276. package/apps/web/.next/static/chunks/app/api/workspace/virtual-file/route-ff99b057da8a00ed.js +1 -0
  277. package/apps/web/.next/static/chunks/app/api/workspace/watch/route-ff99b057da8a00ed.js +1 -0
  278. package/apps/web/.next/static/chunks/app/api/workspace/write-binary/route-ff99b057da8a00ed.js +1 -0
  279. package/apps/web/.next/static/chunks/app/layout-4d0405acdb5ee8e5.js +1 -0
  280. package/apps/web/.next/static/chunks/app/page-b213929ad6255c65.js +1 -0
  281. package/apps/web/.next/static/chunks/app/workspace/{page-a9c68aaa3f71a7fe.js → page-ad24ce15d77e044d.js} +1 -1
  282. package/apps/web/.next/static/chunks/df90ee31-b8ee23eaa0135739.js +1 -0
  283. package/apps/web/.next/static/chunks/main-app-c71b105c32544ad9.js +1 -0
  284. package/apps/web/.next/static/chunks/{webpack-1032d39338965700.js → webpack-38d8ef58f812737b.js} +1 -1
  285. package/apps/web/public/fonts/Bookerly-Bold.ttf +0 -0
  286. package/apps/web/public/fonts/Bookerly-BoldItalic.ttf +0 -0
  287. package/apps/web/public/fonts/Bookerly-Regular.ttf +0 -0
  288. package/apps/web/public/fonts/Bookerly-RegularItalic.ttf +0 -0
  289. package/dist/{cli-name-yhDyCrts.js → cli-name-YmLsNGR6.js} +1 -1
  290. package/dist/entry.js +3 -2
  291. package/dist/{program-CVEqiDmd.js → program-BYwTE_Ot.js} +602 -26
  292. package/dist/{run-main-CBWtZaUl.js → run-main-CWe8UBRN.js} +4 -4
  293. package/dist/{telemetry-UyOfXAoS.js → telemetry-CwRnbZ2F.js} +3 -2
  294. package/extensions/bluebubbles/node_modules/.bin/ironclaw +21 -0
  295. package/extensions/copilot-proxy/node_modules/.bin/ironclaw +21 -0
  296. package/extensions/diagnostics-otel/node_modules/.bin/ironclaw +21 -0
  297. package/extensions/discord/node_modules/.bin/ironclaw +21 -0
  298. package/extensions/feishu/node_modules/.bin/ironclaw +21 -0
  299. package/extensions/google-antigravity-auth/node_modules/.bin/ironclaw +21 -0
  300. package/extensions/google-gemini-cli-auth/node_modules/.bin/ironclaw +21 -0
  301. package/extensions/googlechat/node_modules/.bin/ironclaw +21 -0
  302. package/extensions/imessage/node_modules/.bin/ironclaw +21 -0
  303. package/extensions/irc/node_modules/.bin/ironclaw +21 -0
  304. package/extensions/line/node_modules/.bin/ironclaw +21 -0
  305. package/extensions/llm-task/node_modules/.bin/ironclaw +21 -0
  306. package/extensions/lobster/node_modules/.bin/ironclaw +21 -0
  307. package/extensions/matrix/node_modules/.bin/ironclaw +21 -0
  308. package/extensions/matrix/node_modules/.bin/markdown-it +21 -0
  309. package/extensions/mattermost/node_modules/.bin/ironclaw +21 -0
  310. package/extensions/memory-core/node_modules/.bin/ironclaw +21 -0
  311. package/extensions/memory-lancedb/node_modules/.bin/ironclaw +21 -0
  312. package/extensions/memory-lancedb/node_modules/.bin/openai +21 -0
  313. package/extensions/minimax-portal-auth/node_modules/.bin/ironclaw +21 -0
  314. package/extensions/msteams/node_modules/.bin/ironclaw +21 -0
  315. package/extensions/nextcloud-talk/node_modules/.bin/ironclaw +21 -0
  316. package/extensions/nostr/node_modules/.bin/ironclaw +21 -0
  317. package/extensions/open-prose/node_modules/.bin/ironclaw +21 -0
  318. package/extensions/posthog-analytics/index.ts +162 -0
  319. package/extensions/posthog-analytics/lib/event-mappers.ts +391 -0
  320. package/extensions/posthog-analytics/lib/posthog-client.ts +81 -0
  321. package/extensions/posthog-analytics/lib/privacy.ts +218 -0
  322. package/extensions/posthog-analytics/lib/trace-context.ts +103 -0
  323. package/extensions/posthog-analytics/lib/types.ts +28 -0
  324. package/extensions/posthog-analytics/openclaw.plugin.json +22 -0
  325. package/extensions/posthog-analytics/package.json +8 -0
  326. package/extensions/signal/node_modules/.bin/ironclaw +21 -0
  327. package/extensions/slack/node_modules/.bin/ironclaw +21 -0
  328. package/extensions/synology-chat/node_modules/.bin/ironclaw +21 -0
  329. package/extensions/telegram/node_modules/.bin/ironclaw +21 -0
  330. package/extensions/tlon/node_modules/.bin/ironclaw +21 -0
  331. package/extensions/twitch/node_modules/.bin/ironclaw +21 -0
  332. package/extensions/voice-call/node_modules/.bin/ironclaw +21 -0
  333. package/extensions/whatsapp/node_modules/.bin/ironclaw +21 -0
  334. package/extensions/zalo/node_modules/.bin/ironclaw +21 -0
  335. package/extensions/zalouser/node_modules/.bin/ironclaw +21 -0
  336. package/package.json +2 -1
  337. package/apps/web/.next/standalone/apps/web/.next/server/chunks/3180.js +0 -9
  338. package/apps/web/.next/standalone/apps/web/.next/static/bfBSw7Zh4Df36UcKsQE27/_buildManifest.js +0 -1
  339. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/_not-found/page-6934a35b4d14cdab.js +0 -1
  340. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/active/route-5dc3b3b56eb45a36.js +0 -1
  341. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/route-5dc3b3b56eb45a36.js +0 -1
  342. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/stop/route-5dc3b3b56eb45a36.js +0 -1
  343. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/stream/route-5dc3b3b56eb45a36.js +0 -1
  344. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/chat/subagents/route-5dc3b3b56eb45a36.js +0 -1
  345. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/jobs/[jobId]/runs/route-5dc3b3b56eb45a36.js +0 -1
  346. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/jobs/route-5dc3b3b56eb45a36.js +0 -1
  347. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/runs/[sessionId]/route-5dc3b3b56eb45a36.js +0 -1
  348. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/cron/runs/search-transcript/route-5dc3b3b56eb45a36.js +0 -1
  349. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/memories/route-5dc3b3b56eb45a36.js +0 -1
  350. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/profiles/route-5dc3b3b56eb45a36.js +0 -1
  351. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/profiles/switch/route-5dc3b3b56eb45a36.js +0 -1
  352. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/sessions/[sessionId]/route-5dc3b3b56eb45a36.js +0 -1
  353. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/sessions/route-5dc3b3b56eb45a36.js +0 -1
  354. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/skills/route-5dc3b3b56eb45a36.js +0 -1
  355. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/[id]/messages/route-5dc3b3b56eb45a36.js +0 -1
  356. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/[id]/route-5dc3b3b56eb45a36.js +0 -1
  357. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/web-sessions/route-5dc3b3b56eb45a36.js +0 -1
  358. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/assets/[...path]/route-5dc3b3b56eb45a36.js +0 -1
  359. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/browse/route-5dc3b3b56eb45a36.js +0 -1
  360. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/browse-file/route-5dc3b3b56eb45a36.js +0 -1
  361. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/context/route-5dc3b3b56eb45a36.js +0 -1
  362. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/copy/route-5dc3b3b56eb45a36.js +0 -1
  363. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/db/introspect/route-5dc3b3b56eb45a36.js +0 -1
  364. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/db/query/route-5dc3b3b56eb45a36.js +0 -1
  365. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/delete/route-5dc3b3b56eb45a36.js +0 -1
  366. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/file/route-5dc3b3b56eb45a36.js +0 -1
  367. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/init/route-5dc3b3b56eb45a36.js +0 -1
  368. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/list/route-5dc3b3b56eb45a36.js +0 -1
  369. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/mkdir/route-5dc3b3b56eb45a36.js +0 -1
  370. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/move/route-5dc3b3b56eb45a36.js +0 -1
  371. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/display-field/route-5dc3b3b56eb45a36.js +0 -1
  372. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/[id]/route-5dc3b3b56eb45a36.js +0 -1
  373. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/bulk-delete/route-5dc3b3b56eb45a36.js +0 -1
  374. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/options/route-5dc3b3b56eb45a36.js +0 -1
  375. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/route-5dc3b3b56eb45a36.js +0 -1
  376. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route-5dc3b3b56eb45a36.js +0 -1
  377. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/route-5dc3b3b56eb45a36.js +0 -1
  378. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/reorder/route-5dc3b3b56eb45a36.js +0 -1
  379. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/route-5dc3b3b56eb45a36.js +0 -1
  380. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/views/route-5dc3b3b56eb45a36.js +0 -1
  381. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/open-file/route-5dc3b3b56eb45a36.js +0 -1
  382. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/path-info/route-5dc3b3b56eb45a36.js +0 -1
  383. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/query/route-5dc3b3b56eb45a36.js +0 -1
  384. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/raw-file/route-5dc3b3b56eb45a36.js +0 -1
  385. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/rename/route-5dc3b3b56eb45a36.js +0 -1
  386. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/reports/execute/route-5dc3b3b56eb45a36.js +0 -1
  387. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/search-index/route-5dc3b3b56eb45a36.js +0 -1
  388. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/suggest-files/route-5dc3b3b56eb45a36.js +0 -1
  389. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/switch/route-5dc3b3b56eb45a36.js +0 -1
  390. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/thumbnail/route-5dc3b3b56eb45a36.js +0 -1
  391. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/tree/route-5dc3b3b56eb45a36.js +0 -1
  392. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/upload/route-5dc3b3b56eb45a36.js +0 -1
  393. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/virtual-file/route-5dc3b3b56eb45a36.js +0 -1
  394. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/watch/route-5dc3b3b56eb45a36.js +0 -1
  395. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/api/workspace/write-binary/route-5dc3b3b56eb45a36.js +0 -1
  396. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/layout-01f7966beacdd67b.js +0 -1
  397. package/apps/web/.next/standalone/apps/web/.next/static/chunks/app/page-f365ecf6d5915738.js +0 -1
  398. package/apps/web/.next/standalone/apps/web/.next/static/chunks/df90ee31-33cbf7968acd3b6e.js +0 -1
  399. package/apps/web/.next/standalone/apps/web/.next/static/chunks/main-app-b49c23ad3d7c2890.js +0 -1
  400. package/apps/web/.next/static/bfBSw7Zh4Df36UcKsQE27/_buildManifest.js +0 -1
  401. package/apps/web/.next/static/chunks/app/_not-found/page-6934a35b4d14cdab.js +0 -1
  402. package/apps/web/.next/static/chunks/app/api/chat/active/route-5dc3b3b56eb45a36.js +0 -1
  403. package/apps/web/.next/static/chunks/app/api/chat/route-5dc3b3b56eb45a36.js +0 -1
  404. package/apps/web/.next/static/chunks/app/api/chat/stop/route-5dc3b3b56eb45a36.js +0 -1
  405. package/apps/web/.next/static/chunks/app/api/chat/stream/route-5dc3b3b56eb45a36.js +0 -1
  406. package/apps/web/.next/static/chunks/app/api/chat/subagents/route-5dc3b3b56eb45a36.js +0 -1
  407. package/apps/web/.next/static/chunks/app/api/cron/jobs/[jobId]/runs/route-5dc3b3b56eb45a36.js +0 -1
  408. package/apps/web/.next/static/chunks/app/api/cron/jobs/route-5dc3b3b56eb45a36.js +0 -1
  409. package/apps/web/.next/static/chunks/app/api/cron/runs/[sessionId]/route-5dc3b3b56eb45a36.js +0 -1
  410. package/apps/web/.next/static/chunks/app/api/cron/runs/search-transcript/route-5dc3b3b56eb45a36.js +0 -1
  411. package/apps/web/.next/static/chunks/app/api/memories/route-5dc3b3b56eb45a36.js +0 -1
  412. package/apps/web/.next/static/chunks/app/api/profiles/route-5dc3b3b56eb45a36.js +0 -1
  413. package/apps/web/.next/static/chunks/app/api/profiles/switch/route-5dc3b3b56eb45a36.js +0 -1
  414. package/apps/web/.next/static/chunks/app/api/sessions/[sessionId]/route-5dc3b3b56eb45a36.js +0 -1
  415. package/apps/web/.next/static/chunks/app/api/sessions/route-5dc3b3b56eb45a36.js +0 -1
  416. package/apps/web/.next/static/chunks/app/api/skills/route-5dc3b3b56eb45a36.js +0 -1
  417. package/apps/web/.next/static/chunks/app/api/web-sessions/[id]/messages/route-5dc3b3b56eb45a36.js +0 -1
  418. package/apps/web/.next/static/chunks/app/api/web-sessions/[id]/route-5dc3b3b56eb45a36.js +0 -1
  419. package/apps/web/.next/static/chunks/app/api/web-sessions/route-5dc3b3b56eb45a36.js +0 -1
  420. package/apps/web/.next/static/chunks/app/api/workspace/assets/[...path]/route-5dc3b3b56eb45a36.js +0 -1
  421. package/apps/web/.next/static/chunks/app/api/workspace/browse/route-5dc3b3b56eb45a36.js +0 -1
  422. package/apps/web/.next/static/chunks/app/api/workspace/browse-file/route-5dc3b3b56eb45a36.js +0 -1
  423. package/apps/web/.next/static/chunks/app/api/workspace/context/route-5dc3b3b56eb45a36.js +0 -1
  424. package/apps/web/.next/static/chunks/app/api/workspace/copy/route-5dc3b3b56eb45a36.js +0 -1
  425. package/apps/web/.next/static/chunks/app/api/workspace/db/introspect/route-5dc3b3b56eb45a36.js +0 -1
  426. package/apps/web/.next/static/chunks/app/api/workspace/db/query/route-5dc3b3b56eb45a36.js +0 -1
  427. package/apps/web/.next/static/chunks/app/api/workspace/delete/route-5dc3b3b56eb45a36.js +0 -1
  428. package/apps/web/.next/static/chunks/app/api/workspace/file/route-5dc3b3b56eb45a36.js +0 -1
  429. package/apps/web/.next/static/chunks/app/api/workspace/init/route-5dc3b3b56eb45a36.js +0 -1
  430. package/apps/web/.next/static/chunks/app/api/workspace/list/route-5dc3b3b56eb45a36.js +0 -1
  431. package/apps/web/.next/static/chunks/app/api/workspace/mkdir/route-5dc3b3b56eb45a36.js +0 -1
  432. package/apps/web/.next/static/chunks/app/api/workspace/move/route-5dc3b3b56eb45a36.js +0 -1
  433. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/display-field/route-5dc3b3b56eb45a36.js +0 -1
  434. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/[id]/route-5dc3b3b56eb45a36.js +0 -1
  435. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/bulk-delete/route-5dc3b3b56eb45a36.js +0 -1
  436. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/options/route-5dc3b3b56eb45a36.js +0 -1
  437. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/entries/route-5dc3b3b56eb45a36.js +0 -1
  438. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/enum-rename/route-5dc3b3b56eb45a36.js +0 -1
  439. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/[fieldId]/route-5dc3b3b56eb45a36.js +0 -1
  440. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/fields/reorder/route-5dc3b3b56eb45a36.js +0 -1
  441. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/route-5dc3b3b56eb45a36.js +0 -1
  442. package/apps/web/.next/static/chunks/app/api/workspace/objects/[name]/views/route-5dc3b3b56eb45a36.js +0 -1
  443. package/apps/web/.next/static/chunks/app/api/workspace/open-file/route-5dc3b3b56eb45a36.js +0 -1
  444. package/apps/web/.next/static/chunks/app/api/workspace/path-info/route-5dc3b3b56eb45a36.js +0 -1
  445. package/apps/web/.next/static/chunks/app/api/workspace/query/route-5dc3b3b56eb45a36.js +0 -1
  446. package/apps/web/.next/static/chunks/app/api/workspace/raw-file/route-5dc3b3b56eb45a36.js +0 -1
  447. package/apps/web/.next/static/chunks/app/api/workspace/rename/route-5dc3b3b56eb45a36.js +0 -1
  448. package/apps/web/.next/static/chunks/app/api/workspace/reports/execute/route-5dc3b3b56eb45a36.js +0 -1
  449. package/apps/web/.next/static/chunks/app/api/workspace/search-index/route-5dc3b3b56eb45a36.js +0 -1
  450. package/apps/web/.next/static/chunks/app/api/workspace/suggest-files/route-5dc3b3b56eb45a36.js +0 -1
  451. package/apps/web/.next/static/chunks/app/api/workspace/switch/route-5dc3b3b56eb45a36.js +0 -1
  452. package/apps/web/.next/static/chunks/app/api/workspace/thumbnail/route-5dc3b3b56eb45a36.js +0 -1
  453. package/apps/web/.next/static/chunks/app/api/workspace/tree/route-5dc3b3b56eb45a36.js +0 -1
  454. package/apps/web/.next/static/chunks/app/api/workspace/upload/route-5dc3b3b56eb45a36.js +0 -1
  455. package/apps/web/.next/static/chunks/app/api/workspace/virtual-file/route-5dc3b3b56eb45a36.js +0 -1
  456. package/apps/web/.next/static/chunks/app/api/workspace/watch/route-5dc3b3b56eb45a36.js +0 -1
  457. package/apps/web/.next/static/chunks/app/api/workspace/write-binary/route-5dc3b3b56eb45a36.js +0 -1
  458. package/apps/web/.next/static/chunks/app/layout-01f7966beacdd67b.js +0 -1
  459. package/apps/web/.next/static/chunks/app/page-f365ecf6d5915738.js +0 -1
  460. package/apps/web/.next/static/chunks/df90ee31-33cbf7968acd3b6e.js +0 -1
  461. package/apps/web/.next/static/chunks/main-app-b49c23ad3d7c2890.js +0 -1
  462. /package/apps/web/.next/standalone/apps/web/.next/static/{bfBSw7Zh4Df36UcKsQE27 → _8L73FbiTvTDeQfyyo9Kx}/_ssgManifest.js +0 -0
  463. /package/apps/web/.next/static/{bfBSw7Zh4Df36UcKsQE27 → _8L73FbiTvTDeQfyyo9Kx}/_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, event, getPrivacyMode());
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,391 @@
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 { sanitizeMessages, sanitizeOutputChoices, 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
+ */
19
+ export function extractUsageFromMessages(messages: unknown): {
20
+ inputTokens: number;
21
+ outputTokens: number;
22
+ totalCostUsd: number;
23
+ } {
24
+ if (!Array.isArray(messages)) return { inputTokens: 0, outputTokens: 0, totalCostUsd: 0 };
25
+ let inputTokens = 0;
26
+ let outputTokens = 0;
27
+ let totalCostUsd = 0;
28
+ for (const msg of messages) {
29
+ if (!msg || typeof msg !== "object") continue;
30
+ const m = msg as Record<string, unknown>;
31
+ if (m.role !== "assistant") continue;
32
+ const usage = m.usage as Record<string, unknown> | undefined;
33
+ if (!usage) continue;
34
+ if (typeof usage.input === "number") inputTokens += usage.input;
35
+ if (typeof usage.output === "number") outputTokens += usage.output;
36
+ const cost = usage.cost as Record<string, unknown> | undefined;
37
+ if (cost && typeof cost.total === "number") totalCostUsd += cost.total;
38
+ }
39
+ return { inputTokens, outputTokens, totalCostUsd };
40
+ }
41
+
42
+ /**
43
+ * Extract tool call names from the messages array provided by agent_end.
44
+ * Works regardless of privacy mode since tool names are metadata, not content.
45
+ */
46
+ export function extractToolNamesFromMessages(messages: unknown): string[] {
47
+ if (!Array.isArray(messages)) return [];
48
+ const names: string[] = [];
49
+ for (const msg of messages) {
50
+ if (!msg || typeof msg !== "object") continue;
51
+ const m = msg as Record<string, unknown>;
52
+
53
+ if (Array.isArray(m.tool_calls)) {
54
+ for (const tc of m.tool_calls) {
55
+ const name = (tc as any)?.function?.name ?? (tc as any)?.name;
56
+ if (typeof name === "string" && name) names.push(name);
57
+ }
58
+ }
59
+ if (Array.isArray(m.content)) {
60
+ for (const block of m.content) {
61
+ if ((block as any)?.type === "tool_use" && typeof (block as any)?.name === "string") {
62
+ names.push((block as any).name);
63
+ }
64
+ if ((block as any)?.type === "toolCall" && typeof (block as any)?.name === "string") {
65
+ names.push((block as any).name);
66
+ }
67
+ if ((block as any)?.type === "tool-call" && typeof (block as any)?.toolName === "string") {
68
+ names.push((block as any).toolName);
69
+ }
70
+ }
71
+ }
72
+ if (m.role === "tool" && typeof m.name === "string") {
73
+ names.push(m.name);
74
+ }
75
+ }
76
+ return [...new Set(names)];
77
+ }
78
+
79
+ /**
80
+ * Normalize OpenClaw's message format into OpenAI-compatible output choices
81
+ * so PostHog can extract tool calls for the Tools tab.
82
+ */
83
+ export function normalizeOutputForPostHog(messages: unknown): unknown[] | undefined {
84
+ if (!Array.isArray(messages)) return undefined;
85
+ const choices: unknown[] = [];
86
+ for (const msg of messages) {
87
+ if (!msg || typeof msg !== "object") continue;
88
+ const m = msg as Record<string, unknown>;
89
+ if (m.role !== "assistant") continue;
90
+
91
+ const toolCalls: unknown[] = [];
92
+ let textContent = "";
93
+
94
+ if (Array.isArray(m.content)) {
95
+ for (const block of m.content as Array<Record<string, unknown>>) {
96
+ if (block.type === "text" && typeof block.text === "string") {
97
+ textContent += block.text;
98
+ }
99
+ if (block.type === "toolCall" && typeof block.name === "string") {
100
+ toolCalls.push({
101
+ id: block.id ?? block.toolCallId,
102
+ type: "function",
103
+ function: {
104
+ name: block.name,
105
+ arguments: typeof block.arguments === "string"
106
+ ? block.arguments
107
+ : JSON.stringify(block.arguments ?? {}),
108
+ },
109
+ });
110
+ }
111
+ }
112
+ } else if (typeof m.content === "string") {
113
+ textContent = m.content;
114
+ }
115
+
116
+ if (Array.isArray(m.tool_calls)) {
117
+ for (const tc of m.tool_calls as Array<Record<string, unknown>>) {
118
+ toolCalls.push(tc);
119
+ }
120
+ }
121
+
122
+ const choice: Record<string, unknown> = {
123
+ role: "assistant",
124
+ content: textContent || null,
125
+ };
126
+ if (toolCalls.length > 0) {
127
+ choice.tool_calls = toolCalls;
128
+ }
129
+ choices.push(choice);
130
+ }
131
+ return choices.length > 0 ? choices : undefined;
132
+ }
133
+
134
+ /**
135
+ * Build full conversation state for the $ai_trace event.
136
+ * Splits messages into input (user/tool/system) and output (assistant) arrays,
137
+ * preserving chronological order so PostHog renders the full conversation.
138
+ */
139
+ export function buildTraceState(
140
+ messages: unknown,
141
+ privacyMode: boolean,
142
+ ): { inputState: unknown; outputState: unknown } {
143
+ if (!Array.isArray(messages)) return { inputState: undefined, outputState: undefined };
144
+
145
+ const inputMessages: unknown[] = [];
146
+ const outputMessages: unknown[] = [];
147
+
148
+ for (const msg of messages) {
149
+ if (!msg || typeof msg !== "object") continue;
150
+ const m = msg as Record<string, unknown>;
151
+
152
+ const extractText = () => {
153
+ if (Array.isArray(m.content)) {
154
+ return (m.content as Array<Record<string, unknown>>)
155
+ .filter((b) => b.type === "text")
156
+ .map((b) => b.text)
157
+ .join("");
158
+ }
159
+ return typeof m.content === "string" ? m.content : null;
160
+ };
161
+
162
+ if (m.role === "assistant") {
163
+ const content = privacyMode ? "[REDACTED]" : extractText();
164
+ const entry: Record<string, unknown> = { role: "assistant", content };
165
+
166
+ const toolNames = extractToolNamesFromSingleMessage(m);
167
+ if (toolNames.length > 0) {
168
+ entry.tool_calls = toolNames.map((name) => ({
169
+ type: "function",
170
+ function: { name },
171
+ }));
172
+ }
173
+
174
+ outputMessages.push(entry);
175
+ } else if (m.role === "user" || m.role === "tool" || m.role === "toolResult" || m.role === "system") {
176
+ const content = privacyMode ? "[REDACTED]" : extractText();
177
+ const entry: Record<string, unknown> = { role: m.role, content };
178
+ if (m.name) entry.name = m.name;
179
+ if (m.toolName) entry.toolName = m.toolName;
180
+ inputMessages.push(entry);
181
+ }
182
+ }
183
+
184
+ return {
185
+ inputState: inputMessages.length > 0 ? inputMessages : undefined,
186
+ outputState: outputMessages.length > 0 ? outputMessages : undefined,
187
+ };
188
+ }
189
+
190
+ function extractToolNamesFromSingleMessage(m: Record<string, unknown>): string[] {
191
+ const names: string[] = [];
192
+ if (Array.isArray(m.tool_calls)) {
193
+ for (const tc of m.tool_calls) {
194
+ const name = (tc as any)?.function?.name ?? (tc as any)?.name;
195
+ if (typeof name === "string" && name) names.push(name);
196
+ }
197
+ }
198
+ if (Array.isArray(m.content)) {
199
+ for (const block of m.content) {
200
+ if ((block as any)?.type === "toolCall" && typeof (block as any)?.name === "string") {
201
+ names.push((block as any).name);
202
+ }
203
+ }
204
+ }
205
+ return names;
206
+ }
207
+
208
+ /**
209
+ * Emit a `$ai_generation` event from the agent_end hook data.
210
+ */
211
+ export function emitGeneration(
212
+ ph: PostHogClient,
213
+ traceCtx: TraceContextManager,
214
+ sessionKey: string,
215
+ event: any,
216
+ privacyMode: boolean,
217
+ ): void {
218
+ try {
219
+ const trace = traceCtx.getTrace(sessionKey);
220
+ if (!trace) return;
221
+
222
+ const latency = event.durationMs != null
223
+ ? event.durationMs / 1_000
224
+ : trace.startedAt
225
+ ? (Date.now() - trace.startedAt) / 1_000
226
+ : undefined;
227
+
228
+ const spanToolNames = trace.toolSpans.map((s) => s.toolName);
229
+ const messageToolNames = extractToolNamesFromMessages(event.messages);
230
+ const allToolNames = [...new Set([...spanToolNames, ...messageToolNames])];
231
+
232
+ const properties: Record<string, unknown> = {
233
+ $ai_trace_id: trace.traceId,
234
+ $ai_session_id: trace.sessionId,
235
+ $ai_model: trace.model ?? event.model ?? "unknown",
236
+ $ai_provider: trace.provider ?? event.provider,
237
+ $ai_latency: latency,
238
+ $ai_tools: allToolNames.length > 0
239
+ ? allToolNames.map((name) => ({ type: "function", function: { name } }))
240
+ : undefined,
241
+ $ai_stream: event.stream,
242
+ $ai_temperature: event.temperature,
243
+ $ai_is_error: event.success === false || Boolean(event.error),
244
+ };
245
+
246
+ if (event.usage) {
247
+ const inputTokens = event.usage.inputTokens ?? event.usage.input_tokens;
248
+ const outputTokens = event.usage.outputTokens ?? event.usage.output_tokens;
249
+ if (inputTokens != null && inputTokens > 0) properties.$ai_input_tokens = inputTokens;
250
+ if (outputTokens != null && outputTokens > 0) properties.$ai_output_tokens = outputTokens;
251
+ const cost = event.cost?.totalUsd ?? event.cost?.total_usd;
252
+ if (cost != null && cost > 0) properties.$ai_total_cost_usd = cost;
253
+ } else if (event.messages) {
254
+ const extracted = extractUsageFromMessages(event.messages);
255
+ if (extracted.inputTokens > 0) properties.$ai_input_tokens = extracted.inputTokens;
256
+ if (extracted.outputTokens > 0) properties.$ai_output_tokens = extracted.outputTokens;
257
+ if (extracted.totalCostUsd > 0) properties.$ai_total_cost_usd = extracted.totalCostUsd;
258
+ }
259
+
260
+ properties.$ai_input = sanitizeMessages(trace.input, privacyMode);
261
+
262
+ const outputChoices = normalizeOutputForPostHog(event.messages);
263
+ properties.$ai_output_choices = sanitizeOutputChoices(
264
+ outputChoices ?? event.output ?? event.messages,
265
+ privacyMode,
266
+ );
267
+
268
+ if (event.error) {
269
+ properties.$ai_error = typeof event.error === "string"
270
+ ? event.error
271
+ : event.error?.message ?? String(event.error);
272
+ }
273
+
274
+ ph.capture({
275
+ distinctId: getAnonymousId(),
276
+ event: "$ai_generation",
277
+ properties,
278
+ });
279
+ } catch {
280
+ // Never crash the gateway for telemetry failures.
281
+ }
282
+ }
283
+
284
+ /**
285
+ * Emit a `$ai_span` event for a completed tool call.
286
+ */
287
+ export function emitToolSpan(
288
+ ph: PostHogClient,
289
+ traceCtx: TraceContextManager,
290
+ sessionKey: string,
291
+ event: any,
292
+ privacyMode: boolean,
293
+ ): void {
294
+ try {
295
+ const trace = traceCtx.getTrace(sessionKey);
296
+ const span = traceCtx.getLastToolSpan(sessionKey);
297
+ if (!trace || !span) return;
298
+
299
+ const latency = span.startedAt && span.endedAt
300
+ ? (span.endedAt - span.startedAt) / 1_000
301
+ : event.durationMs != null
302
+ ? event.durationMs / 1_000
303
+ : undefined;
304
+
305
+ const properties: Record<string, unknown> = {
306
+ $ai_trace_id: trace.traceId,
307
+ $ai_session_id: trace.sessionId,
308
+ $ai_span_id: span.spanId,
309
+ $ai_span_name: span.toolName,
310
+ $ai_parent_id: trace.traceId,
311
+ $ai_latency: latency,
312
+ $ai_is_error: span.isError ?? Boolean(event.error),
313
+ };
314
+
315
+ if (!privacyMode) {
316
+ properties.tool_params = stripSecrets(span.params);
317
+ properties.tool_result = stripSecrets(span.result);
318
+ }
319
+
320
+ ph.capture({
321
+ distinctId: getAnonymousId(),
322
+ event: "$ai_span",
323
+ properties,
324
+ });
325
+ } catch {
326
+ // Fail silently.
327
+ }
328
+ }
329
+
330
+ /**
331
+ * Emit a `$ai_trace` event for the completed agent run.
332
+ */
333
+ export function emitTrace(
334
+ ph: PostHogClient,
335
+ traceCtx: TraceContextManager,
336
+ sessionKey: string,
337
+ event?: any,
338
+ privacyMode?: boolean,
339
+ ): void {
340
+ try {
341
+ const trace = traceCtx.getTrace(sessionKey);
342
+ if (!trace) return;
343
+
344
+ const latency = trace.startedAt
345
+ ? (Date.now() - trace.startedAt) / 1_000
346
+ : undefined;
347
+
348
+ const { inputState, outputState } = buildTraceState(
349
+ event?.messages,
350
+ privacyMode ?? true,
351
+ );
352
+
353
+ ph.capture({
354
+ distinctId: getAnonymousId(),
355
+ event: "$ai_trace",
356
+ properties: {
357
+ $ai_trace_id: trace.traceId,
358
+ $ai_session_id: trace.sessionId,
359
+ $ai_latency: latency,
360
+ $ai_span_name: "agent_run",
361
+ $ai_input_state: inputState,
362
+ $ai_output_state: outputState,
363
+ tool_count: trace.toolSpans.length,
364
+ },
365
+ });
366
+ } catch {
367
+ // Fail silently.
368
+ }
369
+ }
370
+
371
+ /**
372
+ * Emit a custom DenchClaw event (not a PostHog $ai_* event).
373
+ */
374
+ export function emitCustomEvent(
375
+ ph: PostHogClient,
376
+ eventName: string,
377
+ properties?: Record<string, unknown>,
378
+ ): void {
379
+ try {
380
+ ph.capture({
381
+ distinctId: getAnonymousId(),
382
+ event: eventName,
383
+ properties: {
384
+ ...properties,
385
+ $process_person_profile: false,
386
+ },
387
+ });
388
+ } catch {
389
+ // Fail silently.
390
+ }
391
+ }
@@ -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
+ }