@tianshu-ai/tianshu 0.3.16 → 0.3.18

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 (244) hide show
  1. package/README.md +285 -195
  2. package/README.zh-CN.md +307 -88
  3. package/node_modules/@tianshu-ai/plugin-sdk/package.json +2 -2
  4. package/package.json +1 -1
  5. package/packages/plugin-sdk/package.json +2 -2
  6. package/packages/server/dist/chat/agent-loop.d.ts.map +1 -1
  7. package/packages/server/dist/chat/agent-loop.js +11 -2
  8. package/packages/server/dist/chat/agent-loop.js.map +1 -1
  9. package/packages/server/dist/chat/handler.d.ts +25 -0
  10. package/packages/server/dist/chat/handler.d.ts.map +1 -1
  11. package/packages/server/dist/chat/handler.js +75 -1
  12. package/packages/server/dist/chat/handler.js.map +1 -1
  13. package/packages/server/dist/setup/cli-agent.d.ts.map +1 -1
  14. package/packages/server/dist/setup/cli-agent.js +37 -1
  15. package/packages/server/dist/setup/cli-agent.js.map +1 -1
  16. package/packages/server/package.json +2 -2
  17. package/packages/web/dist/assets/index-BMFcYw7S.js +60 -0
  18. package/packages/web/dist/index.html +1 -1
  19. package/packages/web/package.json +2 -2
  20. package/plugins/files/package.json +8 -3
  21. package/plugins/microsandbox/package.json +9 -3
  22. package/plugins/web-search/package.json +2 -2
  23. package/plugins/workboard/dist/routes/handlers.d.ts +11 -0
  24. package/plugins/workboard/dist/routes/handlers.d.ts.map +1 -1
  25. package/plugins/workboard/dist/routes/handlers.js +53 -0
  26. package/plugins/workboard/dist/routes/handlers.js.map +1 -1
  27. package/plugins/workboard/dist/server.d.ts.map +1 -1
  28. package/plugins/workboard/dist/server.js +15 -0
  29. package/plugins/workboard/dist/server.js.map +1 -1
  30. package/plugins/workboard/dist/tools/index.d.ts.map +1 -1
  31. package/plugins/workboard/dist/tools/index.js +39 -0
  32. package/plugins/workboard/dist/tools/index.js.map +1 -1
  33. package/plugins/workboard/package.json +8 -3
  34. package/packages/web/dist/assets/index-DH-gJ09_.js +0 -60
  35. package/plugins/web-search/node_modules/@esbuild/linux-x64/README.md +0 -3
  36. package/plugins/web-search/node_modules/@esbuild/linux-x64/package.json +0 -20
  37. package/plugins/web-search/node_modules/@vitest/expect/LICENSE +0 -21
  38. package/plugins/web-search/node_modules/@vitest/expect/README.md +0 -21
  39. package/plugins/web-search/node_modules/@vitest/expect/dist/index.d.ts +0 -808
  40. package/plugins/web-search/node_modules/@vitest/expect/dist/index.js +0 -1799
  41. package/plugins/web-search/node_modules/@vitest/expect/package.json +0 -46
  42. package/plugins/web-search/node_modules/@vitest/mocker/LICENSE +0 -21
  43. package/plugins/web-search/node_modules/@vitest/mocker/README.md +0 -5
  44. package/plugins/web-search/node_modules/@vitest/mocker/dist/auto-register.d.ts +0 -2
  45. package/plugins/web-search/node_modules/@vitest/mocker/dist/auto-register.js +0 -9
  46. package/plugins/web-search/node_modules/@vitest/mocker/dist/browser.d.ts +0 -53
  47. package/plugins/web-search/node_modules/@vitest/mocker/dist/browser.js +0 -91
  48. package/plugins/web-search/node_modules/@vitest/mocker/dist/chunk-interceptor-native.js +0 -15
  49. package/plugins/web-search/node_modules/@vitest/mocker/dist/chunk-mocker.js +0 -1602
  50. package/plugins/web-search/node_modules/@vitest/mocker/dist/chunk-pathe.M-eThtNZ.js +0 -174
  51. package/plugins/web-search/node_modules/@vitest/mocker/dist/chunk-registry.js +0 -182
  52. package/plugins/web-search/node_modules/@vitest/mocker/dist/chunk-utils.js +0 -16
  53. package/plugins/web-search/node_modules/@vitest/mocker/dist/index.d.ts +0 -21
  54. package/plugins/web-search/node_modules/@vitest/mocker/dist/index.js +0 -174
  55. package/plugins/web-search/node_modules/@vitest/mocker/dist/mocker.d-Ce9_ySj5.d.ts +0 -83
  56. package/plugins/web-search/node_modules/@vitest/mocker/dist/node.d.ts +0 -821
  57. package/plugins/web-search/node_modules/@vitest/mocker/dist/node.js +0 -1306
  58. package/plugins/web-search/node_modules/@vitest/mocker/dist/redirect.d.ts +0 -3
  59. package/plugins/web-search/node_modules/@vitest/mocker/dist/redirect.js +0 -75
  60. package/plugins/web-search/node_modules/@vitest/mocker/dist/register.d.ts +0 -9
  61. package/plugins/web-search/node_modules/@vitest/mocker/dist/register.js +0 -41
  62. package/plugins/web-search/node_modules/@vitest/mocker/dist/registry.d-D765pazg.d.ts +0 -87
  63. package/plugins/web-search/node_modules/@vitest/mocker/dist/types.d-D_aRZRdy.d.ts +0 -8
  64. package/plugins/web-search/node_modules/@vitest/mocker/package.json +0 -82
  65. package/plugins/web-search/node_modules/@vitest/pretty-format/LICENSE +0 -21
  66. package/plugins/web-search/node_modules/@vitest/pretty-format/dist/index.d.ts +0 -119
  67. package/plugins/web-search/node_modules/@vitest/pretty-format/dist/index.js +0 -1387
  68. package/plugins/web-search/node_modules/@vitest/pretty-format/package.json +0 -44
  69. package/plugins/web-search/node_modules/@vitest/runner/LICENSE +0 -21
  70. package/plugins/web-search/node_modules/@vitest/runner/README.md +0 -5
  71. package/plugins/web-search/node_modules/@vitest/runner/dist/chunk-hooks.js +0 -2254
  72. package/plugins/web-search/node_modules/@vitest/runner/dist/index.d.ts +0 -261
  73. package/plugins/web-search/node_modules/@vitest/runner/dist/index.js +0 -6
  74. package/plugins/web-search/node_modules/@vitest/runner/dist/tasks.d-CkscK4of.d.ts +0 -558
  75. package/plugins/web-search/node_modules/@vitest/runner/dist/types.d.ts +0 -163
  76. package/plugins/web-search/node_modules/@vitest/runner/dist/types.js +0 -1
  77. package/plugins/web-search/node_modules/@vitest/runner/dist/utils.d.ts +0 -47
  78. package/plugins/web-search/node_modules/@vitest/runner/dist/utils.js +0 -6
  79. package/plugins/web-search/node_modules/@vitest/runner/package.json +0 -49
  80. package/plugins/web-search/node_modules/@vitest/snapshot/LICENSE +0 -21
  81. package/plugins/web-search/node_modules/@vitest/snapshot/README.md +0 -84
  82. package/plugins/web-search/node_modules/@vitest/snapshot/dist/environment.d-DHdQ1Csl.d.ts +0 -22
  83. package/plugins/web-search/node_modules/@vitest/snapshot/dist/environment.d.ts +0 -16
  84. package/plugins/web-search/node_modules/@vitest/snapshot/dist/environment.js +0 -40
  85. package/plugins/web-search/node_modules/@vitest/snapshot/dist/index.d.ts +0 -137
  86. package/plugins/web-search/node_modules/@vitest/snapshot/dist/index.js +0 -2305
  87. package/plugins/web-search/node_modules/@vitest/snapshot/dist/manager.d.ts +0 -18
  88. package/plugins/web-search/node_modules/@vitest/snapshot/dist/manager.js +0 -73
  89. package/plugins/web-search/node_modules/@vitest/snapshot/dist/rawSnapshot.d-lFsMJFUd.d.ts +0 -61
  90. package/plugins/web-search/node_modules/@vitest/snapshot/package.json +0 -54
  91. package/plugins/web-search/node_modules/@vitest/spy/LICENSE +0 -21
  92. package/plugins/web-search/node_modules/@vitest/spy/README.md +0 -3
  93. package/plugins/web-search/node_modules/@vitest/spy/dist/index.d.ts +0 -356
  94. package/plugins/web-search/node_modules/@vitest/spy/dist/index.js +0 -191
  95. package/plugins/web-search/node_modules/@vitest/spy/package.json +0 -38
  96. package/plugins/web-search/node_modules/@vitest/utils/LICENSE +0 -21
  97. package/plugins/web-search/node_modules/@vitest/utils/dist/chunk-_commonjsHelpers.js +0 -158
  98. package/plugins/web-search/node_modules/@vitest/utils/dist/diff.d.ts +0 -104
  99. package/plugins/web-search/node_modules/@vitest/utils/dist/diff.js +0 -2185
  100. package/plugins/web-search/node_modules/@vitest/utils/dist/error.d.ts +0 -9
  101. package/plugins/web-search/node_modules/@vitest/utils/dist/error.js +0 -162
  102. package/plugins/web-search/node_modules/@vitest/utils/dist/helpers.d.ts +0 -56
  103. package/plugins/web-search/node_modules/@vitest/utils/dist/helpers.js +0 -251
  104. package/plugins/web-search/node_modules/@vitest/utils/dist/index.d.ts +0 -57
  105. package/plugins/web-search/node_modules/@vitest/utils/dist/index.js +0 -633
  106. package/plugins/web-search/node_modules/@vitest/utils/dist/source-map.d.ts +0 -139
  107. package/plugins/web-search/node_modules/@vitest/utils/dist/source-map.js +0 -996
  108. package/plugins/web-search/node_modules/@vitest/utils/dist/types.d-BCElaP-c.d.ts +0 -53
  109. package/plugins/web-search/node_modules/@vitest/utils/dist/types.d.ts +0 -53
  110. package/plugins/web-search/node_modules/@vitest/utils/dist/types.js +0 -1
  111. package/plugins/web-search/node_modules/@vitest/utils/package.json +0 -77
  112. package/plugins/web-search/node_modules/chai/LICENSE +0 -21
  113. package/plugins/web-search/node_modules/chai/README.md +0 -162
  114. package/plugins/web-search/node_modules/chai/package.json +0 -74
  115. package/plugins/web-search/node_modules/esbuild/README.md +0 -3
  116. package/plugins/web-search/node_modules/esbuild/package.json +0 -49
  117. package/plugins/web-search/node_modules/std-env/README.md +0 -118
  118. package/plugins/web-search/node_modules/std-env/dist/index.cjs +0 -1
  119. package/plugins/web-search/node_modules/std-env/dist/index.d.cts +0 -92
  120. package/plugins/web-search/node_modules/std-env/dist/index.d.mts +0 -92
  121. package/plugins/web-search/node_modules/std-env/dist/index.d.ts +0 -92
  122. package/plugins/web-search/node_modules/std-env/dist/index.mjs +0 -1
  123. package/plugins/web-search/node_modules/std-env/package.json +0 -46
  124. package/plugins/web-search/node_modules/tinyexec/LICENSE +0 -21
  125. package/plugins/web-search/node_modules/tinyexec/README.md +0 -256
  126. package/plugins/web-search/node_modules/tinyexec/dist/main.cjs +0 -575
  127. package/plugins/web-search/node_modules/tinyexec/dist/main.d.cts +0 -70
  128. package/plugins/web-search/node_modules/tinyexec/dist/main.d.ts +0 -70
  129. package/plugins/web-search/node_modules/tinyexec/dist/main.js +0 -578
  130. package/plugins/web-search/node_modules/tinyexec/package.json +0 -66
  131. package/plugins/web-search/node_modules/tinyrainbow/README.md +0 -28
  132. package/plugins/web-search/node_modules/tinyrainbow/dist/browser.d.ts +0 -8
  133. package/plugins/web-search/node_modules/tinyrainbow/dist/browser.js +0 -20
  134. package/plugins/web-search/node_modules/tinyrainbow/dist/chunk-BVHSVHOK.js +0 -90
  135. package/plugins/web-search/node_modules/tinyrainbow/dist/index-8b61d5bc.d.ts +0 -59
  136. package/plugins/web-search/node_modules/tinyrainbow/dist/node.d.ts +0 -8
  137. package/plugins/web-search/node_modules/tinyrainbow/dist/node.js +0 -22
  138. package/plugins/web-search/node_modules/tinyrainbow/package.json +0 -37
  139. package/plugins/web-search/node_modules/vite/README.md +0 -20
  140. package/plugins/web-search/node_modules/vite/dist/client/client.mjs +0 -1106
  141. package/plugins/web-search/node_modules/vite/dist/client/env.mjs +0 -19
  142. package/plugins/web-search/node_modules/vite/dist/node/chunks/build.js +0 -4
  143. package/plugins/web-search/node_modules/vite/dist/node/chunks/build2.js +0 -5538
  144. package/plugins/web-search/node_modules/vite/dist/node/chunks/chunk.js +0 -48
  145. package/plugins/web-search/node_modules/vite/dist/node/chunks/config.js +0 -36065
  146. package/plugins/web-search/node_modules/vite/dist/node/chunks/config2.js +0 -4
  147. package/plugins/web-search/node_modules/vite/dist/node/chunks/dist.js +0 -6758
  148. package/plugins/web-search/node_modules/vite/dist/node/chunks/lib.js +0 -377
  149. package/plugins/web-search/node_modules/vite/dist/node/chunks/logger.js +0 -329
  150. package/plugins/web-search/node_modules/vite/dist/node/chunks/moduleRunnerTransport.d.ts +0 -96
  151. package/plugins/web-search/node_modules/vite/dist/node/chunks/optimizer.js +0 -4
  152. package/plugins/web-search/node_modules/vite/dist/node/chunks/postcss-import.js +0 -479
  153. package/plugins/web-search/node_modules/vite/dist/node/chunks/preview.js +0 -4
  154. package/plugins/web-search/node_modules/vite/dist/node/chunks/server.js +0 -4
  155. package/plugins/web-search/node_modules/vite/dist/node/cli.js +0 -698
  156. package/plugins/web-search/node_modules/vite/dist/node/index.d.ts +0 -3717
  157. package/plugins/web-search/node_modules/vite/dist/node/index.js +0 -30
  158. package/plugins/web-search/node_modules/vite/dist/node/module-runner.d.ts +0 -311
  159. package/plugins/web-search/node_modules/vite/dist/node/module-runner.js +0 -1160
  160. package/plugins/web-search/node_modules/vite/package.json +0 -199
  161. package/plugins/web-search/node_modules/vite/types/package.json +0 -4
  162. package/plugins/web-search/node_modules/vitest/README.md +0 -7
  163. package/plugins/web-search/node_modules/vitest/dist/browser.d.ts +0 -34
  164. package/plugins/web-search/node_modules/vitest/dist/browser.js +0 -8
  165. package/plugins/web-search/node_modules/vitest/dist/chunks/_commonjsHelpers.BFTU3MAI.js +0 -7
  166. package/plugins/web-search/node_modules/vitest/dist/chunks/base.DfmxU-tU.js +0 -38
  167. package/plugins/web-search/node_modules/vitest/dist/chunks/benchmark.CYdenmiT.js +0 -37
  168. package/plugins/web-search/node_modules/vitest/dist/chunks/benchmark.d.BwvBVTda.d.ts +0 -24
  169. package/plugins/web-search/node_modules/vitest/dist/chunks/cac.0BJqEUeA.js +0 -1469
  170. package/plugins/web-search/node_modules/vitest/dist/chunks/cli-api.DWGBtMmz.js +0 -10660
  171. package/plugins/web-search/node_modules/vitest/dist/chunks/config.d.BKdhh7Zx.d.ts +0 -224
  172. package/plugins/web-search/node_modules/vitest/dist/chunks/console.CtFJOzRO.js +0 -153
  173. package/plugins/web-search/node_modules/vitest/dist/chunks/constants.DnKduX2e.js +0 -44
  174. package/plugins/web-search/node_modules/vitest/dist/chunks/coverage.DVF1vEu8.js +0 -25
  175. package/plugins/web-search/node_modules/vitest/dist/chunks/coverage.DfSpMS-b.js +0 -4350
  176. package/plugins/web-search/node_modules/vitest/dist/chunks/coverage.d.S9RMNXIe.d.ts +0 -35
  177. package/plugins/web-search/node_modules/vitest/dist/chunks/creator.GK6I-cL4.js +0 -640
  178. package/plugins/web-search/node_modules/vitest/dist/chunks/date.Bq6ZW5rf.js +0 -73
  179. package/plugins/web-search/node_modules/vitest/dist/chunks/defaults.B7q_naMc.js +0 -115
  180. package/plugins/web-search/node_modules/vitest/dist/chunks/env.D4Lgay0q.js +0 -8
  181. package/plugins/web-search/node_modules/vitest/dist/chunks/environment.d.cL3nLXbE.d.ts +0 -119
  182. package/plugins/web-search/node_modules/vitest/dist/chunks/execute.B7h3T_Hc.js +0 -708
  183. package/plugins/web-search/node_modules/vitest/dist/chunks/git.BVQ8w_Sw.js +0 -72
  184. package/plugins/web-search/node_modules/vitest/dist/chunks/global.d.MAmajcmJ.d.ts +0 -136
  185. package/plugins/web-search/node_modules/vitest/dist/chunks/globals.DEHgCU4V.js +0 -26
  186. package/plugins/web-search/node_modules/vitest/dist/chunks/index.B521nVV-.js +0 -157
  187. package/plugins/web-search/node_modules/vitest/dist/chunks/index.BCWujgDG.js +0 -231
  188. package/plugins/web-search/node_modules/vitest/dist/chunks/index.CdQS2e2Q.js +0 -37
  189. package/plugins/web-search/node_modules/vitest/dist/chunks/index.CmSc2RE5.js +0 -587
  190. package/plugins/web-search/node_modules/vitest/dist/chunks/index.CwejwG0H.js +0 -105
  191. package/plugins/web-search/node_modules/vitest/dist/chunks/index.D3XRDfWc.js +0 -213
  192. package/plugins/web-search/node_modules/vitest/dist/chunks/index.VByaPkjc.js +0 -2183
  193. package/plugins/web-search/node_modules/vitest/dist/chunks/index.X0nbfr6-.js +0 -6584
  194. package/plugins/web-search/node_modules/vitest/dist/chunks/inspector.C914Efll.js +0 -57
  195. package/plugins/web-search/node_modules/vitest/dist/chunks/mocker.d.BE_2ls6u.d.ts +0 -17
  196. package/plugins/web-search/node_modules/vitest/dist/chunks/node.fjCdwEIl.js +0 -15
  197. package/plugins/web-search/node_modules/vitest/dist/chunks/reporters.d.BuRON0I0.d.ts +0 -3168
  198. package/plugins/web-search/node_modules/vitest/dist/chunks/rpc.-pEldfrD.js +0 -83
  199. package/plugins/web-search/node_modules/vitest/dist/chunks/runBaseTests.9Ij9_de-.js +0 -129
  200. package/plugins/web-search/node_modules/vitest/dist/chunks/setup-common.Dd054P77.js +0 -60
  201. package/plugins/web-search/node_modules/vitest/dist/chunks/suite.d.FvehnV49.d.ts +0 -10
  202. package/plugins/web-search/node_modules/vitest/dist/chunks/typechecker.DRKU1-1g.js +0 -874
  203. package/plugins/web-search/node_modules/vitest/dist/chunks/utils.CAioKnHs.js +0 -61
  204. package/plugins/web-search/node_modules/vitest/dist/chunks/utils.XdZDrNZV.js +0 -65
  205. package/plugins/web-search/node_modules/vitest/dist/chunks/vi.bdSIJ99Y.js +0 -4015
  206. package/plugins/web-search/node_modules/vitest/dist/chunks/vite.d.BnOPPc46.d.ts +0 -25
  207. package/plugins/web-search/node_modules/vitest/dist/chunks/vm.BThCzidc.js +0 -756
  208. package/plugins/web-search/node_modules/vitest/dist/chunks/worker.d.CUgIPz9V.d.ts +0 -176
  209. package/plugins/web-search/node_modules/vitest/dist/chunks/worker.d.uzWsCv9X.d.ts +0 -8
  210. package/plugins/web-search/node_modules/vitest/dist/cli.js +0 -27
  211. package/plugins/web-search/node_modules/vitest/dist/config.cjs +0 -148
  212. package/plugins/web-search/node_modules/vitest/dist/config.d.ts +0 -100
  213. package/plugins/web-search/node_modules/vitest/dist/config.js +0 -21
  214. package/plugins/web-search/node_modules/vitest/dist/coverage.d.ts +0 -108
  215. package/plugins/web-search/node_modules/vitest/dist/coverage.js +0 -34
  216. package/plugins/web-search/node_modules/vitest/dist/environments.d.ts +0 -26
  217. package/plugins/web-search/node_modules/vitest/dist/environments.js +0 -2
  218. package/plugins/web-search/node_modules/vitest/dist/execute.d.ts +0 -150
  219. package/plugins/web-search/node_modules/vitest/dist/execute.js +0 -13
  220. package/plugins/web-search/node_modules/vitest/dist/index.d.ts +0 -651
  221. package/plugins/web-search/node_modules/vitest/dist/index.js +0 -18
  222. package/plugins/web-search/node_modules/vitest/dist/mocker.d.ts +0 -1
  223. package/plugins/web-search/node_modules/vitest/dist/mocker.js +0 -1
  224. package/plugins/web-search/node_modules/vitest/dist/node.d.ts +0 -158
  225. package/plugins/web-search/node_modules/vitest/dist/node.js +0 -105
  226. package/plugins/web-search/node_modules/vitest/dist/path.js +0 -7
  227. package/plugins/web-search/node_modules/vitest/dist/reporters.d.ts +0 -25
  228. package/plugins/web-search/node_modules/vitest/dist/reporters.js +0 -23
  229. package/plugins/web-search/node_modules/vitest/dist/runners.d.ts +0 -46
  230. package/plugins/web-search/node_modules/vitest/dist/runners.js +0 -235
  231. package/plugins/web-search/node_modules/vitest/dist/snapshot.d.ts +0 -9
  232. package/plugins/web-search/node_modules/vitest/dist/snapshot.js +0 -4
  233. package/plugins/web-search/node_modules/vitest/dist/spy.js +0 -1
  234. package/plugins/web-search/node_modules/vitest/dist/suite.d.ts +0 -5
  235. package/plugins/web-search/node_modules/vitest/dist/suite.js +0 -5
  236. package/plugins/web-search/node_modules/vitest/dist/worker.js +0 -124
  237. package/plugins/web-search/node_modules/vitest/dist/workers/forks.js +0 -43
  238. package/plugins/web-search/node_modules/vitest/dist/workers/runVmTests.js +0 -90
  239. package/plugins/web-search/node_modules/vitest/dist/workers/threads.js +0 -31
  240. package/plugins/web-search/node_modules/vitest/dist/workers/vmForks.js +0 -47
  241. package/plugins/web-search/node_modules/vitest/dist/workers/vmThreads.js +0 -37
  242. package/plugins/web-search/node_modules/vitest/dist/workers.d.ts +0 -40
  243. package/plugins/web-search/node_modules/vitest/dist/workers.js +0 -30
  244. package/plugins/web-search/node_modules/vitest/package.json +0 -207
package/README.md CHANGED
@@ -1,219 +1,297 @@
1
- <div align="center">
1
+ <h1 align="center">Tianshu · 天枢</h1>
2
+
3
+ <p align="center">
4
+ <strong>The self-hosted AI agent platform — with a real browser, a real sandbox.</strong>
5
+ </p>
6
+
7
+ <p align="center">
8
+ <a href="https://github.com/tianshu-ai/tianshu/actions/workflows/ci.yml"><img alt="CI" src="https://img.shields.io/github/actions/workflow/status/tianshu-ai/tianshu/ci.yml?branch=main&style=flat-square&label=CI&logo=githubactions&logoColor=white"></a>
9
+ <a href="https://www.npmjs.com/package/@tianshu-ai/tianshu"><img alt="npm" src="https://img.shields.io/npm/v/@tianshu-ai/tianshu?style=flat-square&logo=npm&logoColor=white"></a>
10
+ <a href="https://github.com/tianshu-ai/tianshu/releases"><img alt="release" src="https://img.shields.io/github/v/release/tianshu-ai/tianshu?include_prereleases&style=flat-square&logo=github&logoColor=white"></a>
11
+ <a href="./LICENSE"><img alt="License" src="https://img.shields.io/badge/license-Apache--2.0-blue.svg?style=flat-square"></a>
12
+ <a href="https://github.com/tianshu-ai/tianshu/stargazers"><img alt="stars" src="https://img.shields.io/github/stars/tianshu-ai/tianshu?style=flat-square&logo=github&logoColor=white"></a>
13
+ <a href="https://www.typescriptlang.org/"><img alt="TypeScript" src="https://img.shields.io/badge/TypeScript-3178C6?style=flat-square&logo=typescript&logoColor=white"></a>
14
+ <a href="https://nodejs.org"><img alt="Node" src="https://img.shields.io/badge/Node-22%2B-339933?style=flat-square&logo=node.js&logoColor=white"></a>
15
+ </p>
16
+
17
+ <p align="center">
18
+ <a href="./README.md">English</a> ·
19
+ <a href="./README.zh-CN.md">简体中文</a> ·
20
+ <a href="#-install">🚀 Install</a> ·
21
+ <a href="#-what-you-get">✨ What you get</a> ·
22
+ <a href="#-first-run--5-minutes-start-to-finish">👋 First run</a> ·
23
+ <a href="#️-day-2-control">🎛️ Day-2 control</a> ·
24
+ <a href="#️-architecture">🏗️ Architecture</a> ·
25
+ <a href="#️-roadmap">🗺️ Roadmap</a>
26
+ </p>
27
+
28
+ <p align="center">
29
+ <em>⭐ Tianshu (天枢) — the brightest star of the Big Dipper, the celestial pivot.</em>
30
+ </p>
31
+
32
+ <!--
33
+ TODO: drop a 1600×900+ PNG/GIF at docs/assets/hero.png
34
+ showing the chat UI with the sandbox exec output AND the
35
+ browser sidecar in one frame. Recommend either:
36
+ (a) agent live-editing a file with the file tree visible,
37
+ (b) agent driving a real Chromium tab on the right while
38
+ typing on the left.
39
+ When the file exists, the markdown below renders the image;
40
+ until then GitHub shows a broken-image placeholder that
41
+ links to the README's anchor.
42
+ -->
43
+ <!-- ![Tianshu — agent + sandbox + browser, side by side](docs/assets/hero.png) -->
2
44
 
3
- # 天枢 · Tianshu
45
+ ---
4
46
 
5
- **An open AI agent platform with a sidecar browser. Built in public.**
47
+ ## 🚀 Install
6
48
 
7
- [![CI](https://github.com/tianshu-ai/tianshu/actions/workflows/ci.yml/badge.svg)](https://github.com/tianshu-ai/tianshu/actions/workflows/ci.yml)
8
- [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](./LICENSE)
9
- [![Node 22+](https://img.shields.io/badge/node-22%2B-brightgreen)](https://nodejs.org)
10
- [![PRs welcome](https://img.shields.io/badge/PRs-welcome-orange)](./CONTRIBUTING.md)
49
+ ### Prerequisites
11
50
 
12
- *Tianshu (天枢) — the brightest star of the Big Dipper, the celestial pivot.*
51
+ | What | Why |
52
+ |----------------|----------------------------------------------------|
53
+ | **Node 22+** | Runtime. Use a Node manager (`nvm` / `volta` / `asdf`); avoid system Node with `sudo`. |
54
+ | **macOS Apple Silicon** *or* **Linux + KVM** | Sandbox layer ([microsandbox](https://github.com/microsandbox/microsandbox)) needs hardware virt. Chat surface still works elsewhere, but `exec` / browser tools won't. |
55
+ | **An LLM API key** | Anthropic, OpenAI, or Google. Or a local model server reachable on the network. |
13
56
 
14
- [中文](./README.zh-CN.md) · [What it will be](#what-it-will-be) · [Why](#why) · [Quick start](#quick-start) · [Roadmap](#roadmap) · [Build log](#build-log) · [Contributing](./CONTRIBUTING.md)
57
+ ### One command
15
58
 
16
- </div>
59
+ ```bash
60
+ npm install -g @tianshu-ai/tianshu@latest
61
+ ```
17
62
 
18
- ---
63
+ Don't `sudo`. If you hit `EACCES`, switch to a Node manager that
64
+ puts the global bin under your user directory — not a system
65
+ folder.
19
66
 
20
- ## Status: 0.x preview
67
+ ### Configure your provider
21
68
 
22
- The core loop — chat, sandbox `exec`, sidecar browser, multi-tenant
23
- filesystem, background workers — all works end-to-end. Build-in-public
24
- stays the same: every meaningful change ships as a [DEV_LOG](./docs/DEV_LOG.md)
25
- entry plus follow-up content on the channels below.
69
+ ```bash
70
+ tianshu setup
71
+ ```
26
72
 
27
- **Hardware needed**: macOS Apple Silicon, or Linux + KVM. The sandbox
28
- layer (microsandbox) won't boot anywhere else; the chat surface still
29
- works but `exec` / browser tools will be unavailable.
73
+ A short interactive wizard. It:
74
+
75
+ 1. Asks which provider to use (Anthropic / OpenAI / Google).
76
+ 2. Reads your API key with a hidden prompt.
77
+ 3. Writes `~/.tianshu/config.json` (settings) and `~/.tianshu/.env`
78
+ (secret).
79
+
80
+ Once a model is configured, the wizard hands you over to the
81
+ **setup agent** — an LLM-driven assistant running in the same
82
+ terminal that can finish the rest of the configuration for
83
+ you. It has 18 tools (`run_doctor`, `sandbox_inventory`,
84
+ `config_write`, `plugin_enable`, `build_sandbox`,
85
+ `use_sandbox_build`, `secret_write`, `apply_update`, ...) and
86
+ asks for your confirmation before every state-changing call.
87
+ Things you can ask it right now:
88
+
89
+ - *"Set me up a search API key for the web-search plugin."* —
90
+ it'll ask which provider (Tavily / Brave / SerpAPI / ...),
91
+ prompt for the key, and write it via `secret_write` into
92
+ the right tenant's plugin config. No editing JSON by hand.
93
+ - *"Build my sandboxes so I can use the browser."* — it
94
+ calls `sandbox_inventory` first to see what's already on
95
+ disk, then `build_sandbox` and `use_sandbox_build` to fill
96
+ in whatever's missing. Browser tools work the moment the
97
+ layered `task-runner-with-browser` snapshot is published.
98
+ - *"Doctor's complaining about my provider — fix it."* — it
99
+ reads `run_doctor`, finds the offending line, and proposes
100
+ the specific `config_write` or `secret_write` call to fix
101
+ it before running anything.
102
+ - *"Am I on the latest version?"* — it runs
103
+ `check_for_update` and, if you say yes, `apply_update`.
104
+
105
+ You can exit anytime (type *done* / Ctrl-C) and come back
106
+ later — the agent re-reads state from disk on each invocation.
107
+
108
+ Non-interactive flavour for Docker / CI (skips the
109
+ interactive agent, only writes the provider config):
30
110
 
31
- ## What it will be
111
+ ```bash
112
+ tianshu setup --non-interactive --provider=anthropic --api-key=sk-***
113
+ ```
32
114
 
33
- Tianshu is a self-hostable, multi-tenant **AI agent platform** built on
34
- [`@mariozechner/pi-agent-core`](https://www.npmjs.com/package/@mariozechner/pi-agent-core).
35
- The opinionated parts:
115
+ ### Start the service
36
116
 
37
- - 🌐 **A real Chromium sidecar per tenant** — Playwright + noVNC. The
38
- agent navigates, clicks, types; you watch it live in a side panel.
39
- - 📦 **A real Linux sandbox per tenant** — every `exec` runs isolated.
40
- Crash it, fork-bomb it, fill the disk — your host is fine.
41
- - 📁 **A real workspace filesystem per tenant** — the agent reads and
42
- writes files; you preview them in the UI; they persist across sessions.
43
- - 🤖 **Background workers, not "tools"** — dispatch parallel agents onto
44
- a Kanban board, watch elapsed time per task, intervene when one stalls.
45
- - 🏢 **Multi-tenancy from row 1** — every record carries `tenantId`.
46
- Sidecars, workspaces, and worker pools are tenant-isolated.
117
+ ```bash
118
+ tianshu start
119
+ ```
47
120
 
48
- A previous closed-source iteration of this idea has been running in the
49
- maintainer's day-to-day setup for months. This repo is the from-scratch,
50
- open-source rebuild.
121
+ On macOS this installs a launchd agent
122
+ (`~/Library/LaunchAgents/ai.tianshu.prod.plist`) that auto-starts
123
+ at login and auto-restarts on crash. Linux systemd support is on
124
+ the roadmap; for now, run `npm run dev` from a checkout.
51
125
 
52
- ## Why
126
+ Open <http://localhost:3110> and start chatting.
53
127
 
54
- > "What if the agent could actually do the work — in a real browser, in a
55
- > real shell, on real files — and you could watch it?"
128
+ ### Verify everything
56
129
 
57
- Most "AI chat" platforms are wrappers around a chat completions endpoint.
58
- Tianshu starts from the other end: the agent runtime is real software,
59
- the sidecar is a real browser, the sandbox is a real container. The chat
60
- UI is the surface, not the product.
130
+ ```bash
131
+ tianshu doctor
132
+ ```
61
133
 
62
- For the long version of the motivation, see the launch post:
134
+ Reports across 8 dimensions runtime / version freshness / config
135
+ files / LLM providers / network / sandbox / plugins / tenant DBs.
136
+ Read-only. Run it anytime something feels off.
63
137
 
64
- - 📝 dev.to — *Three things AI agents keep getting wrong (and why I'm
65
- rebuilding the platform from scratch)*
66
- → <https://dev.to/tianshu_ai/three-things-ai-agents-keep-getting-wrong-and-why-im-rebuilding-the-platform-from-scratch-42p6>
67
- - 🎥 YouTube — *Building an AI agent platform in public — starting from
68
- three pains I want to fix* → <https://youtu.be/Xw7c3JrlUVo>
138
+ ---
69
139
 
70
- ## Quick start
140
+ ## What you get
71
141
 
72
- ```bash
73
- npm install -g @tianshu-ai/tianshu@latest
142
+ Tianshu is **a runtime, not a chatbox.** Three things make it different:
74
143
 
75
- tianshu setup # interactive: pick provider, paste key, write config
76
- tianshu doctor # verify everything is wired up
77
- tianshu start # bootstrap the launchd service (macOS) and open the UI
78
- ```
144
+ 🌐 **A real Chromium sidecar per tenant.** Playwright + noVNC. The agent
145
+ navigates, clicks, types you watch it live in a side panel, take the
146
+ mouse back when you want to.
79
147
 
80
- Open <http://localhost:3110> and start chatting.
148
+ 📦 **A real Linux sandbox per tenant.** Every `exec` runs in a
149
+ [microsandbox](https://github.com/microsandbox/microsandbox) VM. Crash
150
+ it, fork-bomb it, fill the disk — your host is untouched.
81
151
 
82
- The server hosts the SPA on a single port one process, one URL.
83
- Need a public hostname (Cloudflare tunnel, reverse proxy)? Set
84
- `server.publicUrl` in `~/.tianshu/config.json`; CLI commands will
85
- print that instead.
152
+ 📁 **A real per-tenant workspace.** The agent reads and writes files
153
+ you can preview in the UI; they persist across sessions. The file
154
+ tree is a first-class citizen, not a "tool output."
86
155
 
87
- ### Day-2 control
156
+ Plus:
88
157
 
89
- ```bash
90
- tianshu status # what's loaded? port? health?
91
- tianshu logs --follow # tail server stdout + stderr
92
- tianshu restart # bounce the server
93
- tianshu stop # bootout from launchd
94
- tianshu tenant list # tenants + users + open-in-browser URLs
95
- tianshu update # check for / install a newer published version
96
- ```
158
+ - 🤖 **Background workers, not "tools."** Dispatch parallel agents
159
+ onto a Kanban board; watch elapsed time per task; intervene when
160
+ one stalls.
161
+ - 🏢 **Multi-tenant from row 1.** Every record carries `tenantId`.
162
+ Sidecars, workspaces, and worker pools are tenant-isolated.
163
+ - 🧠 **A setup assistant that fixes things.** `tianshu setup` runs a
164
+ Claude/Codex-driven wizard with 18 tools: it can read your doctor
165
+ report, enable plugins, write config, build sandboxes, and even
166
+ upgrade itself. See it talk you through it in
167
+ [the launch video](https://youtu.be/Xw7c3JrlUVo).
97
168
 
98
- ### What `tianshu setup` does
169
+ ---
99
170
 
100
- It's an interactive wizard (built on `@clack/prompts`, same family as
101
- [OpenClaw](https://docs.openclaw.ai)) that:
171
+ ## 👋 First run 5 minutes start to finish
102
172
 
103
- - Asks which LLM provider to use (Anthropic / OpenAI / Google).
104
- - Reads your API key with a hidden input.
105
- - Writes `~/.tianshu/config.json` (provider settings, models, default).
106
- - Writes `~/.tianshu/.env` (your key, referenced as `${VAR}` from the config).
173
+ A narrated walk-through. From zero to "agent driving a real
174
+ browser on your screen":
107
175
 
108
- Non-interactive mode is supported for Docker / CI:
176
+ ### Step 1 · Install + wizard (~2 min)
109
177
 
110
178
  ```bash
111
- tianshu setup --non-interactive \
112
- --provider=anthropic --api-key=sk-***
179
+ npm install -g @tianshu-ai/tianshu@latest
180
+ tianshu setup
113
181
  ```
114
182
 
115
- ### What `tianshu doctor` checks
183
+ The wizard picks a provider, reads your key, writes config. If
184
+ you skip the LLM step you can edit `~/.tianshu/config.json` by
185
+ hand later.
116
186
 
117
- ```
118
- ┌ Tianshu doctor
119
-
120
- ◇ Runtime → Node ≥ 22, OS supported
121
- ◇ Config files → ~/.tianshu/config.json + .env present + parseable
122
- ◇ LLM providers → at least one provider has a non-empty API key,
123
- │ defaultModel resolves
124
- ◇ Network → server port reachable, /api/health responding
125
- ◇ Sandbox → microsandbox binary present (--probe-sandbox
126
- │ boots an alpine VM as a smoke test)
127
- ◇ Builtin plugins → manifests parse, ids unique
128
- ◇ Tenant DBs → each tenant's sqlite opens cleanly
129
- └ Setup looks healthy
187
+ ### Step 2 · Start the service (~10 s)
188
+
189
+ ```bash
190
+ tianshu start
130
191
  ```
131
192
 
132
- Use it whenever something doesn't feel right it's read-only.
193
+ The wizard already verified network / config. `tianshu start`
194
+ installs the launchd agent and waits for the server to answer
195
+ `/api/health`.
133
196
 
134
- ### Developing from a checkout
197
+ ### Step 3 · Ask the setup agent to finish the configuration
135
198
 
136
- If you want to hack on tianshu itself (not just run it):
199
+ After `tianshu setup` writes the provider config it drops you
200
+ straight into the **setup agent** (still in the same terminal).
201
+ This is where you finish wiring things up. Type plain English:
137
202
 
138
- ```bash
139
- git clone https://github.com/tianshu-ai/tianshu.git
140
- cd tianshu
203
+ > **You:** Set up sandboxes so I can use the browser tool.
141
204
 
142
- npm install
143
- npm run setup # same wizard, writes to ~/.tianshu/
144
- npm run doctor
145
- npm run dev # vite (5183) + server (3110) + plugin watcher
146
- ```
205
+ The agent will:
147
206
 
148
- In dev mode you open <http://localhost:5183>. The wizard's
149
- launchd plist installer (`tianshu start` from inside a checkout)
150
- stays in dev shape vite hosts the SPA, server is API-only —
151
- because the heuristic detects `.git/` in the install root.
207
+ 1. Run `sandbox_inventory` to see what's already built.
208
+ 2. If a snapshot is missing, propose `build_sandbox
209
+ (template='task-runner')` and ask you to confirm.
210
+ 3. After ~10 min (cold) or ~3 min (warm) the snapshot lands; the
211
+ agent publishes it to the `task` role pointer with
212
+ `use_sandbox_build`.
213
+ 4. Repeat for the browser layer
214
+ (`task-runner-with-browser` on top of the task snapshot).
152
215
 
153
- Updating:
216
+ If the build looks stuck, the agent calls `check_build_progress`
217
+ first — it reads the launchd logs, classifies the build state
218
+ (`in_progress` / `stalled` / `errored`), and tells you whether
219
+ to wait or retry. It will NOT silently retry a 10-minute build
220
+ that's still pulling apt packages.
154
221
 
155
- ### Updating
222
+ While you're here, you can keep talking to the agent about
223
+ other setup work — say *"add a Tavily API key for web search"*
224
+ or *"check for tianshu updates"* and it'll handle them with the
225
+ same confirm-before-mutating loop. When you're done, type
226
+ *done* or Ctrl-C; the agent saves state to disk and you can
227
+ come back later with another `tianshu setup`.
228
+
229
+ ### Step 4 · Open the SPA and use it
156
230
 
157
231
  ```bash
158
- tianshu update --check # peek at what `latest` is on npm
159
- tianshu update # npm install -g the latest, prints next steps
160
- tianshu update --tag next # install pre-release channel (if available)
232
+ open http://localhost:3110
161
233
  ```
162
234
 
163
- `tianshu update` detects a git checkout and refuses use
164
- `git pull` there instead.
235
+ This is the actual product UI the chat surface your agent
236
+ runs under. Try:
165
237
 
166
- ### Useful flags
238
+ > **You:** Open hacker news and tell me the top story right now.
167
239
 
168
- ```bash
169
- # Skip the readiness check on startup (useful for empty-shell deploys)
170
- TIANSHU_IGNORE_SETUP=1 tianshu start
240
+ Watch the side panel: a real Chromium tab navigates. The agent
241
+ can click, type, scroll. You can take the mouse back any time.
171
242
 
172
- # Probe each provider's /v1/models endpoint to test reachability
173
- tianshu doctor --probe-providers
243
+ Done. You've got a working agent.
174
244
 
175
- # Boot a real microsandbox VM as a smoke test (~30s, pulls image)
176
- tianshu doctor --probe-sandbox
177
- ```
245
+ ### What if something goes wrong?
178
246
 
179
- > Default ports are `3110` (server / SPA) and, in dev mode only,
180
- > `5183` (vite). Both are different from the closed-source
181
- > predecessor's `3100 / 5173` so the two projects can run
182
- > alongside each other on the same machine. Override via `PORT=`
183
- > / `WEB_PORT=` if you need to.
247
+ | Symptom | First step |
248
+ |---|---|
249
+ | `tianshu doctor` flags a blocker | Read the line; the `detail` field has the fix. |
250
+ | Browser tool says "runner not ready" | `sandbox_inventory` in chat; build the missing snapshot. |
251
+ | `tianshu start` says "server didn't respond" | `tianshu logs --stream=err -f` for the actual error. |
252
+ | Setup wizard wedged | Ctrl-C, re-run `tianshu setup --wizard`. |
253
+ | `npm install -g` errors with EACCES | Switch to nvm / volta / asdf. Don't `sudo`. |
184
254
 
185
- ### Running as a background service
255
+ More in [Troubleshooting](docs/getting-started.md#troubleshooting).
186
256
 
187
- `tianshu start` (from a global install) installs a launchd agent
188
- under `~/Library/LaunchAgents/` that auto-starts at login and
189
- auto-restarts on crash. `tianshu stop` / `restart` / `status` /
190
- `logs` manage it day to day. See
191
- [docs/running.md](./docs/running.md) for the plist shape and
192
- Linux / Docker plans (still TODO at the time of writing).
257
+ ---
193
258
 
194
- **Don't** use `nohup`, `&`, or `screen` for a long-running
195
- install — they don't survive logout and don't auto-restart on
196
- crash.
259
+ ## 🎛️ Day-2 control
197
260
 
198
- ### Workspace-scoped npm scripts (dev checkouts only)
261
+ Once things are running, these are the commands you'll use daily:
199
262
 
200
263
  ```bash
201
- # build everything (type-check + bundle)
202
- npm run build
264
+ tianshu status # plist label, pid, port, /api/health
265
+ tianshu logs -f # tail stdout + stderr
266
+ tianshu restart # bounce the server
267
+ tianshu stop # bootout the launchd agent
268
+ tianshu tenant list # tenants + users + open-in-browser URLs
269
+ tianshu update # check + install npm latest
270
+ tianshu update --check # only check, exit 0/1/2
271
+ ```
203
272
 
204
- # tests
205
- npm test
273
+ Behind a Cloudflare tunnel or reverse proxy? Set
274
+ `server.publicUrl` in `~/.tianshu/config.json` once — every CLI
275
+ command prints that hostname instead of `localhost`.
206
276
 
207
- # server only
208
- npm run dev -w packages/server
209
- npm run build -w packages/server
277
+ When something breaks:
210
278
 
211
- # web only
212
- npm run dev -w packages/web
213
- npm run build -w packages/web
279
+ ```bash
280
+ tianshu doctor # what's wrong?
281
+ tianshu logs -f # what's the server saying?
282
+ ls ~/Library/LaunchAgents/ai.tianshu*.plist # is the agent installed?
283
+ launchctl list | grep tianshu # is it loaded? PID? exit code?
214
284
  ```
215
285
 
216
- ## Architecture (target)
286
+ Deeper guides:
287
+ [Getting started](docs/getting-started.md) ·
288
+ [Updating](docs/updating.md) ·
289
+ [Running as a service](docs/running.md) ·
290
+ [Developing from a checkout](docs/developing.md).
291
+
292
+ ---
293
+
294
+ ## 🏗️ Architecture
217
295
 
218
296
  ```mermaid
219
297
  flowchart LR
@@ -221,7 +299,7 @@ flowchart LR
221
299
  UI["React + Vite UI"]
222
300
  end
223
301
 
224
- subgraph Server["@tianshu/server"]
302
+ subgraph Server["@tianshu-ai/server"]
225
303
  REST["REST /api"]
226
304
  WS["WebSocket /ws"]
227
305
  Agent["Agent runtime<br/>pi-agent-core"]
@@ -229,9 +307,9 @@ flowchart LR
229
307
  DB[("SQLite<br/>(WAL)")]
230
308
  end
231
309
 
232
- subgraph Sidecars["Per-tenant sidecars (optional)"]
310
+ subgraph Sidecars["Per-tenant sidecars"]
233
311
  ChromiumBox["Chromium + Playwright + noVNC"]
234
- SandBox["Linux microsandbox"]
312
+ SandBox["Linux microsandbox VM"]
235
313
  Files["Workspace filesystem"]
236
314
  end
237
315
 
@@ -249,70 +327,82 @@ flowchart LR
249
327
  Agent <--> LLM
250
328
  ```
251
329
 
252
- ```text
253
- tianshu/
254
- ├── packages/
255
- │ ├── server/ # Express + WS backend, agent runtime
256
- │ └── web/ # React + Tailwind + Vite frontend
257
- └── docs/ # DEV_LOG, architecture notes, RFCs
258
- ```
259
-
260
- The agent runtime is built on
261
- [`@mariozechner/pi-agent-core`](https://www.npmjs.com/package/@mariozechner/pi-agent-core)
262
- by [@badlogic](https://github.com/badlogic). Standing on the shoulders of
263
- giants.
330
+ The agent runtime stands on
331
+ [`@earendil-works/pi-agent-core`](https://www.npmjs.com/package/@earendil-works/pi-agent-core)
332
+ by [@badlogic](https://github.com/badlogic). The sandbox layer is
333
+ [microsandbox](https://github.com/microsandbox/microsandbox).
264
334
 
265
- ## Roadmap
335
+ A 0.x repo, but the core loop — chat, sandbox `exec`, sidecar browser,
336
+ multi-tenant filesystem, background workers — works end-to-end today.
337
+ See the [Architecture Decision Records](docs/architecture/) for
338
+ the full picture.
266
339
 
267
- ### Done (0.2.x)
340
+ ---
268
341
 
269
- - [x] **Tenant model** — `tenantId` everywhere, dev-mode JWT
270
- - [x] **Agent runtime wired up** — `pi-agent-core` streaming over WS
271
- - [x] **Browser sidecar** — Playwright + noVNC via microsandbox
272
- - [x] **Microsandbox** — per-tenant + per-task Linux VMs for `exec` / file I/O
273
- - [x] **Task board** — background workers as Kanban cards
274
- - [x] **Doctor + setup wizard** — `tianshu doctor` / `tianshu setup --wizard`
342
+ ## 🗺️ Roadmap
275
343
 
276
- ### Next (0.3.x)
344
+ **Shipped (0.3.x)**
277
345
 
278
346
  - [x] `npm install -g @tianshu-ai/tianshu` published to npm
279
- - [ ] `tianshu start` single-port server (web + API together for prod)
347
+ - [x] Production single-port server (SPA + API on `:3110`)
348
+ - [x] `tianshu doctor` — runtime / config / network / sandbox / plugins
349
+ - [x] Setup agent with 18 tools (inventory, build, fix, upgrade)
350
+ - [x] Tenant model, plugin registry, sandbox role pointers
351
+
352
+ **Next (0.4.x)**
353
+
280
354
  - [ ] Docker image with sandbox layer baked in
281
- - [ ] Hosted demo at `demo.tianshu-ai.com`
355
+ - [ ] Linux systemd user service (matches macOS launchd UX)
356
+ - [ ] Skills marketplace (registry + install command)
282
357
 
283
358
  Tracked in [GitHub Issues](https://github.com/tianshu-ai/tianshu/issues).
284
359
 
285
- ## What it's not
360
+ ---
361
+
362
+ ## 🚫 What it's not
363
+
364
+ - ❌ A drop-in ChatGPT clone — see
365
+ [LibreChat](https://github.com/danny-avila/LibreChat),
366
+ [Open WebUI](https://github.com/open-webui/open-webui).
367
+ - ❌ A no-code workflow builder — see
368
+ [Dify](https://github.com/langgenius/dify),
369
+ [Flowise](https://github.com/FlowiseAI/Flowise).
370
+ - ❌ A hosted SaaS — no billing, no SSO, no SLA. Run it on a box you own.
371
+ - ❌ An LLM dev framework — Tianshu is an *application* on top of
372
+ pi-agent-core.
286
373
 
287
- - ❌ A drop-in ChatGPT clone — go look at LibreChat or Open WebUI.
288
- - ❌ A no-code workflow builder — Dify is the right shape for that.
289
- - ❌ A hosted SaaS — no billing, no SSO, no SLA. Run it for your team.
290
- - ❌ An LLM dev framework — it's an *application*; the runtime is
291
- pi-agent-core underneath.
374
+ ---
292
375
 
293
- ## Build log
376
+ ## 📺 Build log
294
377
 
295
- We post a development log every week. Pick the channel that fits you:
378
+ A development log goes out roughly every week. Pick the channel that
379
+ fits you:
296
380
 
297
- | Where | Language | Format |
381
+ | Channel | Language | Format |
298
382
  | --- | --- | --- |
299
383
  | [dev.to/tianshu_ai](https://dev.to/tianshu_ai) | English | Long-form articles |
300
- | [YouTube @Tianshu-AI](https://www.youtube.com/@Tianshu-AI) | English | Long-form videos |
301
- | Bilibili 天枢AI *(launching)* | 中文 | Long-form videos |
384
+ | [YouTube @Tianshu-AI](https://www.youtube.com/@Tianshu-AI) | English | Long-form video |
385
+ | Bilibili 天枢AI *(launching)* | 中文 | Long-form video |
302
386
  | X / Twitter *(launching)* | English | Build-in-public threads |
303
387
  | 小红书 / 抖音 *(launching)* | 中文 | Short-form clips |
304
388
 
305
- ## Contributing
389
+ ---
306
390
 
307
- PRs, issues, and discussions are all welcome — even on day 0. See
391
+ ## 🤝 Contributing
392
+
393
+ PRs, issues, and discussions are welcome — even on day 0. See
308
394
  [CONTRIBUTING.md](./CONTRIBUTING.md) for setup and code style.
309
395
 
310
- For security issues please follow [SECURITY.md](./SECURITY.md). Do not
311
- file vulnerabilities in public issues.
396
+ For security issues please follow [SECURITY.md](./SECURITY.md). **Do
397
+ not** file vulnerabilities in public issues.
398
+
399
+ ---
312
400
 
313
- ## License
401
+ ## 📜 License
314
402
 
315
403
  [Apache License 2.0](./LICENSE) © 2026 Yu Yu and Tianshu contributors.
316
404
 
317
405
  Built on [pi-agent-core](https://github.com/badlogic/pi-mono) (MIT) by
318
- [@badlogic](https://github.com/badlogic).
406
+ [@badlogic](https://github.com/badlogic), and
407
+ [microsandbox](https://github.com/microsandbox/microsandbox) (Apache-2.0)
408
+ by [@nyxxxie](https://github.com/nyxxxie) and contributors.