@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.
- package/README.md +285 -195
- package/README.zh-CN.md +307 -88
- package/node_modules/@tianshu-ai/plugin-sdk/package.json +2 -2
- package/package.json +1 -1
- package/packages/plugin-sdk/package.json +2 -2
- package/packages/server/dist/chat/agent-loop.d.ts.map +1 -1
- package/packages/server/dist/chat/agent-loop.js +11 -2
- package/packages/server/dist/chat/agent-loop.js.map +1 -1
- package/packages/server/dist/chat/handler.d.ts +25 -0
- package/packages/server/dist/chat/handler.d.ts.map +1 -1
- package/packages/server/dist/chat/handler.js +75 -1
- package/packages/server/dist/chat/handler.js.map +1 -1
- package/packages/server/dist/setup/cli-agent.d.ts.map +1 -1
- package/packages/server/dist/setup/cli-agent.js +37 -1
- package/packages/server/dist/setup/cli-agent.js.map +1 -1
- package/packages/server/package.json +2 -2
- package/packages/web/dist/assets/index-BMFcYw7S.js +60 -0
- package/packages/web/dist/index.html +1 -1
- package/packages/web/package.json +2 -2
- package/plugins/files/package.json +8 -3
- package/plugins/microsandbox/package.json +9 -3
- package/plugins/web-search/package.json +2 -2
- package/plugins/workboard/dist/routes/handlers.d.ts +11 -0
- package/plugins/workboard/dist/routes/handlers.d.ts.map +1 -1
- package/plugins/workboard/dist/routes/handlers.js +53 -0
- package/plugins/workboard/dist/routes/handlers.js.map +1 -1
- package/plugins/workboard/dist/server.d.ts.map +1 -1
- package/plugins/workboard/dist/server.js +15 -0
- package/plugins/workboard/dist/server.js.map +1 -1
- package/plugins/workboard/dist/tools/index.d.ts.map +1 -1
- package/plugins/workboard/dist/tools/index.js +39 -0
- package/plugins/workboard/dist/tools/index.js.map +1 -1
- package/plugins/workboard/package.json +8 -3
- package/packages/web/dist/assets/index-DH-gJ09_.js +0 -60
- package/plugins/web-search/node_modules/@esbuild/linux-x64/README.md +0 -3
- package/plugins/web-search/node_modules/@esbuild/linux-x64/package.json +0 -20
- package/plugins/web-search/node_modules/@vitest/expect/LICENSE +0 -21
- package/plugins/web-search/node_modules/@vitest/expect/README.md +0 -21
- package/plugins/web-search/node_modules/@vitest/expect/dist/index.d.ts +0 -808
- package/plugins/web-search/node_modules/@vitest/expect/dist/index.js +0 -1799
- package/plugins/web-search/node_modules/@vitest/expect/package.json +0 -46
- package/plugins/web-search/node_modules/@vitest/mocker/LICENSE +0 -21
- package/plugins/web-search/node_modules/@vitest/mocker/README.md +0 -5
- package/plugins/web-search/node_modules/@vitest/mocker/dist/auto-register.d.ts +0 -2
- package/plugins/web-search/node_modules/@vitest/mocker/dist/auto-register.js +0 -9
- package/plugins/web-search/node_modules/@vitest/mocker/dist/browser.d.ts +0 -53
- package/plugins/web-search/node_modules/@vitest/mocker/dist/browser.js +0 -91
- package/plugins/web-search/node_modules/@vitest/mocker/dist/chunk-interceptor-native.js +0 -15
- package/plugins/web-search/node_modules/@vitest/mocker/dist/chunk-mocker.js +0 -1602
- package/plugins/web-search/node_modules/@vitest/mocker/dist/chunk-pathe.M-eThtNZ.js +0 -174
- package/plugins/web-search/node_modules/@vitest/mocker/dist/chunk-registry.js +0 -182
- package/plugins/web-search/node_modules/@vitest/mocker/dist/chunk-utils.js +0 -16
- package/plugins/web-search/node_modules/@vitest/mocker/dist/index.d.ts +0 -21
- package/plugins/web-search/node_modules/@vitest/mocker/dist/index.js +0 -174
- package/plugins/web-search/node_modules/@vitest/mocker/dist/mocker.d-Ce9_ySj5.d.ts +0 -83
- package/plugins/web-search/node_modules/@vitest/mocker/dist/node.d.ts +0 -821
- package/plugins/web-search/node_modules/@vitest/mocker/dist/node.js +0 -1306
- package/plugins/web-search/node_modules/@vitest/mocker/dist/redirect.d.ts +0 -3
- package/plugins/web-search/node_modules/@vitest/mocker/dist/redirect.js +0 -75
- package/plugins/web-search/node_modules/@vitest/mocker/dist/register.d.ts +0 -9
- package/plugins/web-search/node_modules/@vitest/mocker/dist/register.js +0 -41
- package/plugins/web-search/node_modules/@vitest/mocker/dist/registry.d-D765pazg.d.ts +0 -87
- package/plugins/web-search/node_modules/@vitest/mocker/dist/types.d-D_aRZRdy.d.ts +0 -8
- package/plugins/web-search/node_modules/@vitest/mocker/package.json +0 -82
- package/plugins/web-search/node_modules/@vitest/pretty-format/LICENSE +0 -21
- package/plugins/web-search/node_modules/@vitest/pretty-format/dist/index.d.ts +0 -119
- package/plugins/web-search/node_modules/@vitest/pretty-format/dist/index.js +0 -1387
- package/plugins/web-search/node_modules/@vitest/pretty-format/package.json +0 -44
- package/plugins/web-search/node_modules/@vitest/runner/LICENSE +0 -21
- package/plugins/web-search/node_modules/@vitest/runner/README.md +0 -5
- package/plugins/web-search/node_modules/@vitest/runner/dist/chunk-hooks.js +0 -2254
- package/plugins/web-search/node_modules/@vitest/runner/dist/index.d.ts +0 -261
- package/plugins/web-search/node_modules/@vitest/runner/dist/index.js +0 -6
- package/plugins/web-search/node_modules/@vitest/runner/dist/tasks.d-CkscK4of.d.ts +0 -558
- package/plugins/web-search/node_modules/@vitest/runner/dist/types.d.ts +0 -163
- package/plugins/web-search/node_modules/@vitest/runner/dist/types.js +0 -1
- package/plugins/web-search/node_modules/@vitest/runner/dist/utils.d.ts +0 -47
- package/plugins/web-search/node_modules/@vitest/runner/dist/utils.js +0 -6
- package/plugins/web-search/node_modules/@vitest/runner/package.json +0 -49
- package/plugins/web-search/node_modules/@vitest/snapshot/LICENSE +0 -21
- package/plugins/web-search/node_modules/@vitest/snapshot/README.md +0 -84
- package/plugins/web-search/node_modules/@vitest/snapshot/dist/environment.d-DHdQ1Csl.d.ts +0 -22
- package/plugins/web-search/node_modules/@vitest/snapshot/dist/environment.d.ts +0 -16
- package/plugins/web-search/node_modules/@vitest/snapshot/dist/environment.js +0 -40
- package/plugins/web-search/node_modules/@vitest/snapshot/dist/index.d.ts +0 -137
- package/plugins/web-search/node_modules/@vitest/snapshot/dist/index.js +0 -2305
- package/plugins/web-search/node_modules/@vitest/snapshot/dist/manager.d.ts +0 -18
- package/plugins/web-search/node_modules/@vitest/snapshot/dist/manager.js +0 -73
- package/plugins/web-search/node_modules/@vitest/snapshot/dist/rawSnapshot.d-lFsMJFUd.d.ts +0 -61
- package/plugins/web-search/node_modules/@vitest/snapshot/package.json +0 -54
- package/plugins/web-search/node_modules/@vitest/spy/LICENSE +0 -21
- package/plugins/web-search/node_modules/@vitest/spy/README.md +0 -3
- package/plugins/web-search/node_modules/@vitest/spy/dist/index.d.ts +0 -356
- package/plugins/web-search/node_modules/@vitest/spy/dist/index.js +0 -191
- package/plugins/web-search/node_modules/@vitest/spy/package.json +0 -38
- package/plugins/web-search/node_modules/@vitest/utils/LICENSE +0 -21
- package/plugins/web-search/node_modules/@vitest/utils/dist/chunk-_commonjsHelpers.js +0 -158
- package/plugins/web-search/node_modules/@vitest/utils/dist/diff.d.ts +0 -104
- package/plugins/web-search/node_modules/@vitest/utils/dist/diff.js +0 -2185
- package/plugins/web-search/node_modules/@vitest/utils/dist/error.d.ts +0 -9
- package/plugins/web-search/node_modules/@vitest/utils/dist/error.js +0 -162
- package/plugins/web-search/node_modules/@vitest/utils/dist/helpers.d.ts +0 -56
- package/plugins/web-search/node_modules/@vitest/utils/dist/helpers.js +0 -251
- package/plugins/web-search/node_modules/@vitest/utils/dist/index.d.ts +0 -57
- package/plugins/web-search/node_modules/@vitest/utils/dist/index.js +0 -633
- package/plugins/web-search/node_modules/@vitest/utils/dist/source-map.d.ts +0 -139
- package/plugins/web-search/node_modules/@vitest/utils/dist/source-map.js +0 -996
- package/plugins/web-search/node_modules/@vitest/utils/dist/types.d-BCElaP-c.d.ts +0 -53
- package/plugins/web-search/node_modules/@vitest/utils/dist/types.d.ts +0 -53
- package/plugins/web-search/node_modules/@vitest/utils/dist/types.js +0 -1
- package/plugins/web-search/node_modules/@vitest/utils/package.json +0 -77
- package/plugins/web-search/node_modules/chai/LICENSE +0 -21
- package/plugins/web-search/node_modules/chai/README.md +0 -162
- package/plugins/web-search/node_modules/chai/package.json +0 -74
- package/plugins/web-search/node_modules/esbuild/README.md +0 -3
- package/plugins/web-search/node_modules/esbuild/package.json +0 -49
- package/plugins/web-search/node_modules/std-env/README.md +0 -118
- package/plugins/web-search/node_modules/std-env/dist/index.cjs +0 -1
- package/plugins/web-search/node_modules/std-env/dist/index.d.cts +0 -92
- package/plugins/web-search/node_modules/std-env/dist/index.d.mts +0 -92
- package/plugins/web-search/node_modules/std-env/dist/index.d.ts +0 -92
- package/plugins/web-search/node_modules/std-env/dist/index.mjs +0 -1
- package/plugins/web-search/node_modules/std-env/package.json +0 -46
- package/plugins/web-search/node_modules/tinyexec/LICENSE +0 -21
- package/plugins/web-search/node_modules/tinyexec/README.md +0 -256
- package/plugins/web-search/node_modules/tinyexec/dist/main.cjs +0 -575
- package/plugins/web-search/node_modules/tinyexec/dist/main.d.cts +0 -70
- package/plugins/web-search/node_modules/tinyexec/dist/main.d.ts +0 -70
- package/plugins/web-search/node_modules/tinyexec/dist/main.js +0 -578
- package/plugins/web-search/node_modules/tinyexec/package.json +0 -66
- package/plugins/web-search/node_modules/tinyrainbow/README.md +0 -28
- package/plugins/web-search/node_modules/tinyrainbow/dist/browser.d.ts +0 -8
- package/plugins/web-search/node_modules/tinyrainbow/dist/browser.js +0 -20
- package/plugins/web-search/node_modules/tinyrainbow/dist/chunk-BVHSVHOK.js +0 -90
- package/plugins/web-search/node_modules/tinyrainbow/dist/index-8b61d5bc.d.ts +0 -59
- package/plugins/web-search/node_modules/tinyrainbow/dist/node.d.ts +0 -8
- package/plugins/web-search/node_modules/tinyrainbow/dist/node.js +0 -22
- package/plugins/web-search/node_modules/tinyrainbow/package.json +0 -37
- package/plugins/web-search/node_modules/vite/README.md +0 -20
- package/plugins/web-search/node_modules/vite/dist/client/client.mjs +0 -1106
- package/plugins/web-search/node_modules/vite/dist/client/env.mjs +0 -19
- package/plugins/web-search/node_modules/vite/dist/node/chunks/build.js +0 -4
- package/plugins/web-search/node_modules/vite/dist/node/chunks/build2.js +0 -5538
- package/plugins/web-search/node_modules/vite/dist/node/chunks/chunk.js +0 -48
- package/plugins/web-search/node_modules/vite/dist/node/chunks/config.js +0 -36065
- package/plugins/web-search/node_modules/vite/dist/node/chunks/config2.js +0 -4
- package/plugins/web-search/node_modules/vite/dist/node/chunks/dist.js +0 -6758
- package/plugins/web-search/node_modules/vite/dist/node/chunks/lib.js +0 -377
- package/plugins/web-search/node_modules/vite/dist/node/chunks/logger.js +0 -329
- package/plugins/web-search/node_modules/vite/dist/node/chunks/moduleRunnerTransport.d.ts +0 -96
- package/plugins/web-search/node_modules/vite/dist/node/chunks/optimizer.js +0 -4
- package/plugins/web-search/node_modules/vite/dist/node/chunks/postcss-import.js +0 -479
- package/plugins/web-search/node_modules/vite/dist/node/chunks/preview.js +0 -4
- package/plugins/web-search/node_modules/vite/dist/node/chunks/server.js +0 -4
- package/plugins/web-search/node_modules/vite/dist/node/cli.js +0 -698
- package/plugins/web-search/node_modules/vite/dist/node/index.d.ts +0 -3717
- package/plugins/web-search/node_modules/vite/dist/node/index.js +0 -30
- package/plugins/web-search/node_modules/vite/dist/node/module-runner.d.ts +0 -311
- package/plugins/web-search/node_modules/vite/dist/node/module-runner.js +0 -1160
- package/plugins/web-search/node_modules/vite/package.json +0 -199
- package/plugins/web-search/node_modules/vite/types/package.json +0 -4
- package/plugins/web-search/node_modules/vitest/README.md +0 -7
- package/plugins/web-search/node_modules/vitest/dist/browser.d.ts +0 -34
- package/plugins/web-search/node_modules/vitest/dist/browser.js +0 -8
- package/plugins/web-search/node_modules/vitest/dist/chunks/_commonjsHelpers.BFTU3MAI.js +0 -7
- package/plugins/web-search/node_modules/vitest/dist/chunks/base.DfmxU-tU.js +0 -38
- package/plugins/web-search/node_modules/vitest/dist/chunks/benchmark.CYdenmiT.js +0 -37
- package/plugins/web-search/node_modules/vitest/dist/chunks/benchmark.d.BwvBVTda.d.ts +0 -24
- package/plugins/web-search/node_modules/vitest/dist/chunks/cac.0BJqEUeA.js +0 -1469
- package/plugins/web-search/node_modules/vitest/dist/chunks/cli-api.DWGBtMmz.js +0 -10660
- package/plugins/web-search/node_modules/vitest/dist/chunks/config.d.BKdhh7Zx.d.ts +0 -224
- package/plugins/web-search/node_modules/vitest/dist/chunks/console.CtFJOzRO.js +0 -153
- package/plugins/web-search/node_modules/vitest/dist/chunks/constants.DnKduX2e.js +0 -44
- package/plugins/web-search/node_modules/vitest/dist/chunks/coverage.DVF1vEu8.js +0 -25
- package/plugins/web-search/node_modules/vitest/dist/chunks/coverage.DfSpMS-b.js +0 -4350
- package/plugins/web-search/node_modules/vitest/dist/chunks/coverage.d.S9RMNXIe.d.ts +0 -35
- package/plugins/web-search/node_modules/vitest/dist/chunks/creator.GK6I-cL4.js +0 -640
- package/plugins/web-search/node_modules/vitest/dist/chunks/date.Bq6ZW5rf.js +0 -73
- package/plugins/web-search/node_modules/vitest/dist/chunks/defaults.B7q_naMc.js +0 -115
- package/plugins/web-search/node_modules/vitest/dist/chunks/env.D4Lgay0q.js +0 -8
- package/plugins/web-search/node_modules/vitest/dist/chunks/environment.d.cL3nLXbE.d.ts +0 -119
- package/plugins/web-search/node_modules/vitest/dist/chunks/execute.B7h3T_Hc.js +0 -708
- package/plugins/web-search/node_modules/vitest/dist/chunks/git.BVQ8w_Sw.js +0 -72
- package/plugins/web-search/node_modules/vitest/dist/chunks/global.d.MAmajcmJ.d.ts +0 -136
- package/plugins/web-search/node_modules/vitest/dist/chunks/globals.DEHgCU4V.js +0 -26
- package/plugins/web-search/node_modules/vitest/dist/chunks/index.B521nVV-.js +0 -157
- package/plugins/web-search/node_modules/vitest/dist/chunks/index.BCWujgDG.js +0 -231
- package/plugins/web-search/node_modules/vitest/dist/chunks/index.CdQS2e2Q.js +0 -37
- package/plugins/web-search/node_modules/vitest/dist/chunks/index.CmSc2RE5.js +0 -587
- package/plugins/web-search/node_modules/vitest/dist/chunks/index.CwejwG0H.js +0 -105
- package/plugins/web-search/node_modules/vitest/dist/chunks/index.D3XRDfWc.js +0 -213
- package/plugins/web-search/node_modules/vitest/dist/chunks/index.VByaPkjc.js +0 -2183
- package/plugins/web-search/node_modules/vitest/dist/chunks/index.X0nbfr6-.js +0 -6584
- package/plugins/web-search/node_modules/vitest/dist/chunks/inspector.C914Efll.js +0 -57
- package/plugins/web-search/node_modules/vitest/dist/chunks/mocker.d.BE_2ls6u.d.ts +0 -17
- package/plugins/web-search/node_modules/vitest/dist/chunks/node.fjCdwEIl.js +0 -15
- package/plugins/web-search/node_modules/vitest/dist/chunks/reporters.d.BuRON0I0.d.ts +0 -3168
- package/plugins/web-search/node_modules/vitest/dist/chunks/rpc.-pEldfrD.js +0 -83
- package/plugins/web-search/node_modules/vitest/dist/chunks/runBaseTests.9Ij9_de-.js +0 -129
- package/plugins/web-search/node_modules/vitest/dist/chunks/setup-common.Dd054P77.js +0 -60
- package/plugins/web-search/node_modules/vitest/dist/chunks/suite.d.FvehnV49.d.ts +0 -10
- package/plugins/web-search/node_modules/vitest/dist/chunks/typechecker.DRKU1-1g.js +0 -874
- package/plugins/web-search/node_modules/vitest/dist/chunks/utils.CAioKnHs.js +0 -61
- package/plugins/web-search/node_modules/vitest/dist/chunks/utils.XdZDrNZV.js +0 -65
- package/plugins/web-search/node_modules/vitest/dist/chunks/vi.bdSIJ99Y.js +0 -4015
- package/plugins/web-search/node_modules/vitest/dist/chunks/vite.d.BnOPPc46.d.ts +0 -25
- package/plugins/web-search/node_modules/vitest/dist/chunks/vm.BThCzidc.js +0 -756
- package/plugins/web-search/node_modules/vitest/dist/chunks/worker.d.CUgIPz9V.d.ts +0 -176
- package/plugins/web-search/node_modules/vitest/dist/chunks/worker.d.uzWsCv9X.d.ts +0 -8
- package/plugins/web-search/node_modules/vitest/dist/cli.js +0 -27
- package/plugins/web-search/node_modules/vitest/dist/config.cjs +0 -148
- package/plugins/web-search/node_modules/vitest/dist/config.d.ts +0 -100
- package/plugins/web-search/node_modules/vitest/dist/config.js +0 -21
- package/plugins/web-search/node_modules/vitest/dist/coverage.d.ts +0 -108
- package/plugins/web-search/node_modules/vitest/dist/coverage.js +0 -34
- package/plugins/web-search/node_modules/vitest/dist/environments.d.ts +0 -26
- package/plugins/web-search/node_modules/vitest/dist/environments.js +0 -2
- package/plugins/web-search/node_modules/vitest/dist/execute.d.ts +0 -150
- package/plugins/web-search/node_modules/vitest/dist/execute.js +0 -13
- package/plugins/web-search/node_modules/vitest/dist/index.d.ts +0 -651
- package/plugins/web-search/node_modules/vitest/dist/index.js +0 -18
- package/plugins/web-search/node_modules/vitest/dist/mocker.d.ts +0 -1
- package/plugins/web-search/node_modules/vitest/dist/mocker.js +0 -1
- package/plugins/web-search/node_modules/vitest/dist/node.d.ts +0 -158
- package/plugins/web-search/node_modules/vitest/dist/node.js +0 -105
- package/plugins/web-search/node_modules/vitest/dist/path.js +0 -7
- package/plugins/web-search/node_modules/vitest/dist/reporters.d.ts +0 -25
- package/plugins/web-search/node_modules/vitest/dist/reporters.js +0 -23
- package/plugins/web-search/node_modules/vitest/dist/runners.d.ts +0 -46
- package/plugins/web-search/node_modules/vitest/dist/runners.js +0 -235
- package/plugins/web-search/node_modules/vitest/dist/snapshot.d.ts +0 -9
- package/plugins/web-search/node_modules/vitest/dist/snapshot.js +0 -4
- package/plugins/web-search/node_modules/vitest/dist/spy.js +0 -1
- package/plugins/web-search/node_modules/vitest/dist/suite.d.ts +0 -5
- package/plugins/web-search/node_modules/vitest/dist/suite.js +0 -5
- package/plugins/web-search/node_modules/vitest/dist/worker.js +0 -124
- package/plugins/web-search/node_modules/vitest/dist/workers/forks.js +0 -43
- package/plugins/web-search/node_modules/vitest/dist/workers/runVmTests.js +0 -90
- package/plugins/web-search/node_modules/vitest/dist/workers/threads.js +0 -31
- package/plugins/web-search/node_modules/vitest/dist/workers/vmForks.js +0 -47
- package/plugins/web-search/node_modules/vitest/dist/workers/vmThreads.js +0 -37
- package/plugins/web-search/node_modules/vitest/dist/workers.d.ts +0 -40
- package/plugins/web-search/node_modules/vitest/dist/workers.js +0 -30
- package/plugins/web-search/node_modules/vitest/package.json +0 -207
package/README.md
CHANGED
|
@@ -1,219 +1,297 @@
|
|
|
1
|
-
<
|
|
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
|
+
<!--  -->
|
|
2
44
|
|
|
3
|
-
|
|
45
|
+
---
|
|
4
46
|
|
|
5
|
-
|
|
47
|
+
## 🚀 Install
|
|
6
48
|
|
|
7
|
-
|
|
8
|
-
[](./LICENSE)
|
|
9
|
-
[](https://nodejs.org)
|
|
10
|
-
[](./CONTRIBUTING.md)
|
|
49
|
+
### Prerequisites
|
|
11
50
|
|
|
12
|
-
|
|
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
|
-
|
|
57
|
+
### One command
|
|
15
58
|
|
|
16
|
-
|
|
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
|
-
|
|
67
|
+
### Configure your provider
|
|
21
68
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
entry plus follow-up content on the channels below.
|
|
69
|
+
```bash
|
|
70
|
+
tianshu setup
|
|
71
|
+
```
|
|
26
72
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
111
|
+
```bash
|
|
112
|
+
tianshu setup --non-interactive --provider=anthropic --api-key=sk-***
|
|
113
|
+
```
|
|
32
114
|
|
|
33
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
126
|
+
Open <http://localhost:3110> and start chatting.
|
|
53
127
|
|
|
54
|
-
|
|
55
|
-
> real shell, on real files — and you could watch it?"
|
|
128
|
+
### Verify everything
|
|
56
129
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
UI is the surface, not the product.
|
|
130
|
+
```bash
|
|
131
|
+
tianshu doctor
|
|
132
|
+
```
|
|
61
133
|
|
|
62
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
140
|
+
## ✨ What you get
|
|
71
141
|
|
|
72
|
-
|
|
73
|
-
npm install -g @tianshu-ai/tianshu@latest
|
|
142
|
+
Tianshu is **a runtime, not a chatbox.** Three things make it different:
|
|
74
143
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
|
|
156
|
+
Plus:
|
|
88
157
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
169
|
+
---
|
|
99
170
|
|
|
100
|
-
|
|
101
|
-
[OpenClaw](https://docs.openclaw.ai)) that:
|
|
171
|
+
## 👋 First run — 5 minutes start to finish
|
|
102
172
|
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
176
|
+
### Step 1 · Install + wizard (~2 min)
|
|
109
177
|
|
|
110
178
|
```bash
|
|
111
|
-
|
|
112
|
-
|
|
179
|
+
npm install -g @tianshu-ai/tianshu@latest
|
|
180
|
+
tianshu setup
|
|
113
181
|
```
|
|
114
182
|
|
|
115
|
-
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
197
|
+
### Step 3 · Ask the setup agent to finish the configuration
|
|
135
198
|
|
|
136
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
164
|
-
|
|
235
|
+
This is the actual product UI — the chat surface your agent
|
|
236
|
+
runs under. Try:
|
|
165
237
|
|
|
166
|
-
|
|
238
|
+
> **You:** Open hacker news and tell me the top story right now.
|
|
167
239
|
|
|
168
|
-
|
|
169
|
-
|
|
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
|
-
|
|
173
|
-
tianshu doctor --probe-providers
|
|
243
|
+
Done. You've got a working agent.
|
|
174
244
|
|
|
175
|
-
|
|
176
|
-
tianshu doctor --probe-sandbox
|
|
177
|
-
```
|
|
245
|
+
### What if something goes wrong?
|
|
178
246
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
-
|
|
255
|
+
More in [Troubleshooting](docs/getting-started.md#troubleshooting).
|
|
186
256
|
|
|
187
|
-
|
|
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
|
-
|
|
195
|
-
install — they don't survive logout and don't auto-restart on
|
|
196
|
-
crash.
|
|
259
|
+
## 🎛️ Day-2 control
|
|
197
260
|
|
|
198
|
-
|
|
261
|
+
Once things are running, these are the commands you'll use daily:
|
|
199
262
|
|
|
200
263
|
```bash
|
|
201
|
-
#
|
|
202
|
-
|
|
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
|
-
|
|
205
|
-
|
|
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
|
-
|
|
208
|
-
npm run dev -w packages/server
|
|
209
|
-
npm run build -w packages/server
|
|
277
|
+
When something breaks:
|
|
210
278
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
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
|
-
|
|
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
|
-
|
|
340
|
+
---
|
|
268
341
|
|
|
269
|
-
|
|
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
|
-
|
|
344
|
+
**Shipped (0.3.x)**
|
|
277
345
|
|
|
278
346
|
- [x] `npm install -g @tianshu-ai/tianshu` published to npm
|
|
279
|
-
- [
|
|
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
|
-
- [ ]
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
378
|
+
A development log goes out roughly every week. Pick the channel that
|
|
379
|
+
fits you:
|
|
296
380
|
|
|
297
|
-
|
|
|
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
|
|
301
|
-
| Bilibili 天枢AI *(launching)* | 中文 | Long-form
|
|
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
|
-
|
|
389
|
+
---
|
|
306
390
|
|
|
307
|
-
|
|
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
|
|
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.
|