@tianshu-ai/tianshu 0.3.36 → 0.3.38

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 (143) hide show
  1. package/README.md +15 -0
  2. package/README.zh-CN.md +11 -0
  3. package/node_modules/@tianshu-ai/plugin-sdk/dist/capabilities.d.ts +4 -0
  4. package/node_modules/@tianshu-ai/plugin-sdk/dist/capabilities.d.ts.map +1 -1
  5. package/node_modules/@tianshu-ai/plugin-sdk/dist/capabilities.js +4 -0
  6. package/node_modules/@tianshu-ai/plugin-sdk/dist/capabilities.js.map +1 -1
  7. package/node_modules/@tianshu-ai/plugin-sdk/dist/channel-bindings.d.ts +60 -0
  8. package/node_modules/@tianshu-ai/plugin-sdk/dist/channel-bindings.d.ts.map +1 -0
  9. package/node_modules/@tianshu-ai/plugin-sdk/dist/channel-bindings.js +18 -0
  10. package/node_modules/@tianshu-ai/plugin-sdk/dist/channel-bindings.js.map +1 -0
  11. package/node_modules/@tianshu-ai/plugin-sdk/dist/client.d.ts +28 -0
  12. package/node_modules/@tianshu-ai/plugin-sdk/dist/client.d.ts.map +1 -1
  13. package/node_modules/@tianshu-ai/plugin-sdk/dist/client.js +39 -0
  14. package/node_modules/@tianshu-ai/plugin-sdk/dist/client.js.map +1 -1
  15. package/node_modules/@tianshu-ai/plugin-sdk/dist/index.d.ts +1 -0
  16. package/node_modules/@tianshu-ai/plugin-sdk/dist/index.d.ts.map +1 -1
  17. package/node_modules/@tianshu-ai/plugin-sdk/dist/index.js +1 -0
  18. package/node_modules/@tianshu-ai/plugin-sdk/dist/index.js.map +1 -1
  19. package/node_modules/@tianshu-ai/plugin-sdk/src/capabilities.ts +5 -0
  20. package/node_modules/@tianshu-ai/plugin-sdk/src/channel-bindings.ts +75 -0
  21. package/node_modules/@tianshu-ai/plugin-sdk/src/client.ts +106 -0
  22. package/node_modules/@tianshu-ai/plugin-sdk/src/index.ts +1 -0
  23. package/package.json +1 -1
  24. package/packages/plugin-sdk/dist/capabilities.d.ts +4 -0
  25. package/packages/plugin-sdk/dist/capabilities.d.ts.map +1 -1
  26. package/packages/plugin-sdk/dist/capabilities.js +4 -0
  27. package/packages/plugin-sdk/dist/capabilities.js.map +1 -1
  28. package/packages/plugin-sdk/dist/channel-bindings.d.ts +60 -0
  29. package/packages/plugin-sdk/dist/channel-bindings.d.ts.map +1 -0
  30. package/packages/plugin-sdk/dist/channel-bindings.js +18 -0
  31. package/packages/plugin-sdk/dist/channel-bindings.js.map +1 -0
  32. package/packages/plugin-sdk/dist/client.d.ts +28 -0
  33. package/packages/plugin-sdk/dist/client.d.ts.map +1 -1
  34. package/packages/plugin-sdk/dist/client.js +39 -0
  35. package/packages/plugin-sdk/dist/client.js.map +1 -1
  36. package/packages/plugin-sdk/dist/index.d.ts +1 -0
  37. package/packages/plugin-sdk/dist/index.d.ts.map +1 -1
  38. package/packages/plugin-sdk/dist/index.js +1 -0
  39. package/packages/plugin-sdk/dist/index.js.map +1 -1
  40. package/packages/server/builtinConfig/plugins/wechat/manifest.json +24 -19
  41. package/packages/server/dist/channels/adapter-manager.d.ts +4 -0
  42. package/packages/server/dist/channels/adapter-manager.d.ts.map +1 -1
  43. package/packages/server/dist/channels/adapter-manager.js +15 -0
  44. package/packages/server/dist/channels/adapter-manager.js.map +1 -1
  45. package/packages/server/dist/channels/bindings.d.ts +8 -2
  46. package/packages/server/dist/channels/bindings.d.ts.map +1 -1
  47. package/packages/server/dist/channels/bindings.js +22 -7
  48. package/packages/server/dist/channels/bindings.js.map +1 -1
  49. package/packages/server/dist/channels/index.d.ts +1 -1
  50. package/packages/server/dist/channels/index.d.ts.map +1 -1
  51. package/packages/server/dist/channels/index.js +1 -1
  52. package/packages/server/dist/channels/index.js.map +1 -1
  53. package/packages/server/dist/channels/router.d.ts.map +1 -1
  54. package/packages/server/dist/channels/router.js +19 -3
  55. package/packages/server/dist/channels/router.js.map +1 -1
  56. package/packages/server/dist/channels/sessions.d.ts.map +1 -1
  57. package/packages/server/dist/channels/sessions.js +19 -9
  58. package/packages/server/dist/channels/sessions.js.map +1 -1
  59. package/packages/server/dist/channels/types.d.ts +4 -0
  60. package/packages/server/dist/channels/types.d.ts.map +1 -1
  61. package/packages/server/dist/chat/handler.d.ts.map +1 -1
  62. package/packages/server/dist/chat/handler.js +20 -8
  63. package/packages/server/dist/chat/handler.js.map +1 -1
  64. package/packages/server/dist/chat/messages.d.ts +12 -0
  65. package/packages/server/dist/chat/messages.d.ts.map +1 -1
  66. package/packages/server/dist/chat/messages.js +60 -1
  67. package/packages/server/dist/chat/messages.js.map +1 -1
  68. package/packages/server/dist/chat/ws-protocol.d.ts +19 -0
  69. package/packages/server/dist/chat/ws-protocol.d.ts.map +1 -1
  70. package/packages/server/dist/chat/ws-protocol.js.map +1 -1
  71. package/packages/server/dist/core/migrations/011-channel-bindings-owner.d.ts +4 -0
  72. package/packages/server/dist/core/migrations/011-channel-bindings-owner.d.ts.map +1 -0
  73. package/packages/server/dist/core/migrations/011-channel-bindings-owner.js +62 -0
  74. package/packages/server/dist/core/migrations/011-channel-bindings-owner.js.map +1 -0
  75. package/packages/server/dist/core/migrations/index.d.ts.map +1 -1
  76. package/packages/server/dist/core/migrations/index.js +2 -0
  77. package/packages/server/dist/core/migrations/index.js.map +1 -1
  78. package/packages/server/dist/core/plugins/manifest.js +16 -0
  79. package/packages/server/dist/core/plugins/manifest.js.map +1 -1
  80. package/packages/server/dist/index.js +130 -2
  81. package/packages/server/dist/index.js.map +1 -1
  82. package/packages/server/dist/plugins-routes.d.ts +3 -3
  83. package/packages/web/dist/assets/{angular-html-Iamn8VeB.js → angular-html-C0dYPx6r.js} +1 -1
  84. package/packages/web/dist/assets/{angular-ts-Dc_oiB71.js → angular-ts-Oj3r5XKT.js} +1 -1
  85. package/packages/web/dist/assets/{astro-DHQtQe0F.js → astro-CCOewSfI.js} +1 -1
  86. package/packages/web/dist/assets/{blade-PmaEpBP5.js → blade-CMoBaI-c.js} +1 -1
  87. package/packages/web/dist/assets/{bundle-web-BPLQz4q7.js → bundle-web-CKXVGjGn.js} +3 -3
  88. package/packages/web/dist/assets/{c-6d0N850q.js → c-C3xsc8VJ.js} +1 -1
  89. package/packages/web/dist/assets/{coffee-D8kWvGFl.js → coffee-Bk95m5xZ.js} +1 -1
  90. package/packages/web/dist/assets/{cpp-CcjEAZiA.js → cpp-BDq9NJ6M.js} +1 -1
  91. package/packages/web/dist/assets/{css-BXLZJH0u.js → css-o-wak23w.js} +1 -1
  92. package/packages/web/dist/assets/{glsl-B5wzeQ70.js → glsl-C_vdhPcI.js} +1 -1
  93. package/packages/web/dist/assets/{graphql-C5sRBXVN.js → graphql-CTaScu0D.js} +1 -1
  94. package/packages/web/dist/assets/{haml-CmlLXAwX.js → haml-DPJlUtZO.js} +1 -1
  95. package/packages/web/dist/assets/{handlebars-Cho472sw.js → handlebars-BOguOpb_.js} +1 -1
  96. package/packages/web/dist/assets/{html-CHJOEdwS.js → html-D-U32qVf.js} +1 -1
  97. package/packages/web/dist/assets/{html-derivative-CnnsD8XF.js → html-derivative-jL4OI3XO.js} +1 -1
  98. package/packages/web/dist/assets/{http-QdLrXf_j.js → http-BS0vPRn7.js} +1 -1
  99. package/packages/web/dist/assets/{hurl-BVvBfFkA.js → hurl-B_HjhbX9.js} +1 -1
  100. package/packages/web/dist/assets/index-BNIrE3EB.css +2 -0
  101. package/packages/web/dist/assets/index-uCaxo84h.js +70 -0
  102. package/packages/web/dist/assets/{java-V8b8Q0RE.js → java-ChRhPBC6.js} +1 -1
  103. package/packages/web/dist/assets/{javascript-C3ati9Uv.js → javascript-LHwMkPdo.js} +1 -1
  104. package/packages/web/dist/assets/{jinja-IFferrAR.js → jinja-CFd74q6T.js} +1 -1
  105. package/packages/web/dist/assets/{jison-Du-VEKXM.js → jison-Ce1sYH7G.js} +1 -1
  106. package/packages/web/dist/assets/{jsx-DKW7cyot.js → jsx-gt-LpmXz.js} +1 -1
  107. package/packages/web/dist/assets/{julia-DZx644uB.js → julia-C6Y23mvC.js} +1 -1
  108. package/packages/web/dist/assets/{marko-DUOUvUjN.js → marko-P-1kEquO.js} +1 -1
  109. package/packages/web/dist/assets/{mdc-Ba06-lkg.js → mdc-2lMXMbYI.js} +1 -1
  110. package/packages/web/dist/assets/{papaparse.min-DDRMXFnP.js → papaparse.min-CsGIlyex.js} +1 -1
  111. package/packages/web/dist/assets/{php-DBWTNhOc.js → php-DwOfEa28.js} +1 -1
  112. package/packages/web/dist/assets/{pug-BAVJkaVg.js → pug-CM67KWgR.js} +1 -1
  113. package/packages/web/dist/assets/{regexp-BM38l-oV.js → regexp-BPbwK-Xq.js} +1 -1
  114. package/packages/web/dist/assets/{scss-BEtxFDif.js → scss-Cu9uCmMu.js} +1 -1
  115. package/packages/web/dist/assets/{sql-BWivcsR1.js → sql-Crihb3H8.js} +1 -1
  116. package/packages/web/dist/assets/{svelte-BwreCCAO.js → svelte-7M-KmR78.js} +1 -1
  117. package/packages/web/dist/assets/{ts-tags-B1VvoL7n.js → ts-tags-DCJuj_w-.js} +1 -1
  118. package/packages/web/dist/assets/{tsx-B38DHfPy.js → tsx-BghSsf5x.js} +1 -1
  119. package/packages/web/dist/assets/{typescript-BXszQdhG.js → typescript-DZ9XjC6y.js} +1 -1
  120. package/packages/web/dist/assets/{vue-B8BzggBE.js → vue--cfr4Gjc.js} +1 -1
  121. package/packages/web/dist/assets/{vue-html-3A7KBMS_.js → vue-html-B65J0UBj.js} +1 -1
  122. package/packages/web/dist/assets/{vue-vine-DayxEfJh.js → vue-vine-D8DvctWg.js} +1 -1
  123. package/packages/web/dist/assets/{xml-MqMTuZ7-.js → xml-BZQysVLh.js} +1 -1
  124. package/packages/web/dist/index.html +2 -2
  125. package/plugins/wechat/dist/channel.d.ts +25 -12
  126. package/plugins/wechat/dist/channel.d.ts.map +1 -1
  127. package/plugins/wechat/dist/channel.js +80 -32
  128. package/plugins/wechat/dist/channel.js.map +1 -1
  129. package/plugins/wechat/dist/client.d.ts +5 -0
  130. package/plugins/wechat/dist/client.d.ts.map +1 -0
  131. package/plugins/wechat/dist/client.js +280 -0
  132. package/plugins/wechat/dist/client.js.map +1 -0
  133. package/plugins/wechat/dist/ilink-api.d.ts +115 -27
  134. package/plugins/wechat/dist/ilink-api.d.ts.map +1 -1
  135. package/plugins/wechat/dist/ilink-api.js +171 -28
  136. package/plugins/wechat/dist/ilink-api.js.map +1 -1
  137. package/plugins/wechat/dist/server.d.ts.map +1 -1
  138. package/plugins/wechat/dist/server.js +209 -88
  139. package/plugins/wechat/dist/server.js.map +1 -1
  140. package/plugins/wechat/manifest.json +24 -19
  141. package/plugins/wechat/package.json +15 -2
  142. package/packages/web/dist/assets/index-DlQunQDm.css +0 -2
  143. package/packages/web/dist/assets/index-dNBs1BYn.js +0 -63
package/README.md CHANGED
@@ -158,6 +158,16 @@ Plus:
158
158
  - 🤖 **Background workers, not "tools."** Dispatch parallel agents
159
159
  onto a Kanban board; watch elapsed time per task; intervene when
160
160
  one stalls.
161
+ - 🔍 **The orchestrator is a supervisor.** The main agent (天枢,
162
+ literally "the pivot") doesn't just dispatch — it reads across
163
+ every worker run on the board (duration, intervention rate,
164
+ failure-reason clusters, token cost) and proposes tuning back
165
+ to you: *“Your `web-research` worker hits the 10-min watchdog
166
+ on 1 in 5 runs — want me to raise its `timeoutMs` to 15 min?”*
167
+ Analytics is a recommendation surface, never an auto-tuning
168
+ control loop — every change still needs your confirm. See
169
+ [ADR-0002 §12](docs/architecture/workers.md#12-orchestrator-side-analytics--continuous-improvement)
170
+ for the full story.
161
171
  - 🏢 **Multi-tenant from row 1.** Every record carries `tenantId`.
162
172
  Sidecars, workspaces, and worker pools are tenant-isolated.
163
173
  - 🧠 **A setup assistant that fixes things.** `tianshu setup` runs a
@@ -354,6 +364,11 @@ the full picture.
354
364
  - [ ] Docker image with sandbox layer baked in
355
365
  - [ ] Linux systemd user service (matches macOS launchd UX)
356
366
  - [ ] Skills marketplace (registry + install command)
367
+ - [ ] **Orchestrator analytics**: `worker_analytics` /
368
+ `worker_task_timeline` /
369
+ `worker_propose_tuning` tools so the main agent
370
+ can read across worker runs and propose concrete
371
+ tuning (see ADR-0002 §12)
357
372
 
358
373
  Tracked in [GitHub Issues](https://github.com/tianshu-ai/tianshu/issues).
359
374
 
package/README.zh-CN.md CHANGED
@@ -136,6 +136,13 @@ Tianshu 是**一个 agent 运行时,不是一个聊天框**。三件事跟同
136
136
 
137
137
  - 🤖 **后台 worker,不是 "tool"**。多个 agent 并行调度到 Kanban
138
138
  看板上,每个任务的耗时实时可见,卡住能介入。
139
+ - 🔍 **主 agent 是个 supervisor**。主 agent(天枢,“中枢”之意)
140
+ 不只是调度——它跨任务读看板上的所有 worker 表现(耗时、干
141
+ 预率、失败原因聚类、token 成本),主动向你提调优建议:
142
+ *“你的 web-research worker 每 5 次跑有 1 次撞 10 分钟 watchdog
143
+ —— 要不要把 `timeoutMs` 改成 15 分钟?”* 分析是推荐面,不是
144
+ 自动调优控制环 —— 每个改动都要你确认。详见
145
+ [ADR-0002 §12](docs/architecture/workers.md#12-orchestrator-side-analytics--continuous-improvement)。
139
146
  - 🏢 **多租户从第一行 schema 起**。每条记录都带 `tenantId`,
140
147
  sidecar、workspace、worker pool 全部按租户隔离。
141
148
  - 🧠 **能修问题的 setup agent**。`tianshu setup` 是个由 Claude/Codex
@@ -324,6 +331,10 @@ Agent 运行时基于
324
331
  - [ ] Docker 镜像(带沙箱层)
325
332
  - [ ] Linux systemd 用户服务(跟 macOS launchd 体验对齐)
326
333
  - [ ] Skills 市场(registry + 安装命令)
334
+ - [ ] **主 agent 分析能力**:`worker_analytics` /
335
+ `worker_task_timeline` / `worker_propose_tuning` 工具,
336
+ 让主 agent 跨 worker 读性能数据、提出具体调优建议
337
+ (见 ADR-0002 §12)
327
338
 
328
339
  进度跟踪:[GitHub Issues](https://github.com/tianshu-ai/tianshu/issues)。
329
340
 
@@ -39,6 +39,10 @@ export declare const KNOWN_CAPABILITIES: {
39
39
  readonly exclusive: true;
40
40
  readonly description: "Diagnose a file via the host's LSP manager after a write/edit. Plugins (notably `files`) call `diagnoseAfterEdit({ filePath, contents })` and append the formatted diagnostic block to their tool result so the model sees compile errors in the same turn that introduced them. Tenant-scoped: the manager refuses files outside the calling tenant's workspace. See ADR-0005.";
41
41
  };
42
+ readonly "host.channelBindings": {
43
+ readonly exclusive: true;
44
+ readonly description: "Manage channel adapter bindings (chat-platform integrations). Plugins contributing a channel (Feishu / Telegram / WeChat / ...) call create/start/stop/delete here so the host's adapter manager actually wires the inbound stream to the agent. The DB row + adapter lifecycle live together behind this capability.";
45
+ };
42
46
  };
43
47
  export type CapabilityName = keyof typeof KNOWN_CAPABILITIES;
44
48
  /** True iff the given string is a registered capability name. */
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8CoB,CAAC;AAEpD,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,kBAAkB,CAAC;AAE7D,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,cAAc,CAE/D;AAED,2DAA2D;AAC3D,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEvE"}
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmDoB,CAAC;AAEpD,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,kBAAkB,CAAC;AAE7D,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,cAAc,CAE/D;AAED,2DAA2D;AAC3D,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEvE"}
@@ -49,6 +49,10 @@ export const KNOWN_CAPABILITIES = {
49
49
  exclusive: true,
50
50
  description: "Diagnose a file via the host's LSP manager after a write/edit. Plugins (notably `files`) call `diagnoseAfterEdit({ filePath, contents })` and append the formatted diagnostic block to their tool result so the model sees compile errors in the same turn that introduced them. Tenant-scoped: the manager refuses files outside the calling tenant's workspace. See ADR-0005.",
51
51
  },
52
+ "host.channelBindings": {
53
+ exclusive: true,
54
+ description: "Manage channel adapter bindings (chat-platform integrations). Plugins contributing a channel (Feishu / Telegram / WeChat / ...) call create/start/stop/delete here so the host's adapter manager actually wires the inbound stream to the agent. The DB row + adapter lifecycle live together behind this capability.",
55
+ },
52
56
  };
53
57
  /** True iff the given string is a registered capability name. */
54
58
  export function isCapabilityName(s) {
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,EAAE;AACF,iEAAiE;AACjE,iEAAiE;AACjE,sEAAsE;AACtE,oEAAoE;AACpE,0DAA0D;AAC1D,EAAE;AACF,mBAAmB;AACnB,kEAAkE;AAClE,+DAA+D;AAC/D,mCAAmC;AACnC,kEAAkE;AAClE,2DAA2D;AAO3D,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,eAAe,EAAE;QACf,SAAS,EAAE,IAAI;QACf,WAAW,EACT,8EAA8E;KACjF;IACD,kBAAkB,EAAE;QAClB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,0SAA0S;KAC7S;IACD,aAAa,EAAE;QACb,SAAS,EAAE,IAAI;QACf,WAAW,EACT,0HAA0H;KAC7H;IACD,gBAAgB,EAAE;QAChB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,uTAAuT;KAC1T;IACD,mBAAmB,EAAE;QACnB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,sWAAsW;KACzW;IACD,kBAAkB,EAAE;QAClB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,qTAAqT;KACxT;IACD,mBAAmB,EAAE;QACnB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,oNAAoN;KACvN;IACD,mBAAmB,EAAE;QACnB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,sRAAsR;KACzR;IACD,UAAU,EAAE;QACV,SAAS,EAAE,IAAI;QACf,WAAW,EACT,iXAAiX;KACpX;CACgD,CAAC;AAIpD,iEAAiE;AACjE,MAAM,UAAU,gBAAgB,CAAC,CAAS;IACxC,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC"}
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,EAAE;AACF,iEAAiE;AACjE,iEAAiE;AACjE,sEAAsE;AACtE,oEAAoE;AACpE,0DAA0D;AAC1D,EAAE;AACF,mBAAmB;AACnB,kEAAkE;AAClE,+DAA+D;AAC/D,mCAAmC;AACnC,kEAAkE;AAClE,2DAA2D;AAO3D,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,eAAe,EAAE;QACf,SAAS,EAAE,IAAI;QACf,WAAW,EACT,8EAA8E;KACjF;IACD,kBAAkB,EAAE;QAClB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,0SAA0S;KAC7S;IACD,aAAa,EAAE;QACb,SAAS,EAAE,IAAI;QACf,WAAW,EACT,0HAA0H;KAC7H;IACD,gBAAgB,EAAE;QAChB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,uTAAuT;KAC1T;IACD,mBAAmB,EAAE;QACnB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,sWAAsW;KACzW;IACD,kBAAkB,EAAE;QAClB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,qTAAqT;KACxT;IACD,mBAAmB,EAAE;QACnB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,oNAAoN;KACvN;IACD,mBAAmB,EAAE;QACnB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,sRAAsR;KACzR;IACD,UAAU,EAAE;QACV,SAAS,EAAE,IAAI;QACf,WAAW,EACT,iXAAiX;KACpX;IACD,sBAAsB,EAAE;QACtB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,uTAAuT;KAC1T;CACgD,CAAC;AAIpD,iEAAiE;AACjE,MAAM,UAAU,gBAAgB,CAAC,CAAS;IACxC,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC"}
@@ -0,0 +1,60 @@
1
+ /** Subset of the channel_bindings row plugins can see. The full row
2
+ * (status, status_detail, timestamps) is host-internal; the plugin
3
+ * cares about creating / updating identity + config. */
4
+ export interface ChannelBindingView {
5
+ /** Stable id, prefixed `cb_`. */
6
+ id: string;
7
+ /** Tenant this binding belongs to. */
8
+ tenantId: string;
9
+ /** The user this binding belongs to. Channel accounts (a wechat
10
+ * login, a telegram bot token, ...) are personal credentials —
11
+ * one user binding their phone shouldn't surface that account
12
+ * to other users on the same tenant. The host scopes list /
13
+ * delete to this id. */
14
+ ownerUserId: string;
15
+ /** Channel id ("wechat" / "telegram" / ...). */
16
+ channelId: string;
17
+ /** Plugin id that contributes the channel. */
18
+ pluginId: string;
19
+ /** Human-readable label admins set / the login flow inferred. */
20
+ displayName: string | null;
21
+ /** Whether the host's adapter manager should keep it active. */
22
+ enabled: boolean;
23
+ /** Last lifecycle state the adapter reached. */
24
+ status: "idle" | "starting" | "running" | "error" | "stopped";
25
+ /** Free-text last status detail (auth failure, last reconnect, etc.). */
26
+ statusDetail: string | null;
27
+ /** Per-binding adapter config (token + identity, plugin-defined). */
28
+ config: Record<string, unknown>;
29
+ createdAt: number;
30
+ updatedAt: number;
31
+ }
32
+ export interface CreateChannelBindingInput {
33
+ /** Per-user scope. Channel credentials are personal — the host
34
+ * refuses any operation where the caller-supplied userId doesn't
35
+ * own the targeted binding. Plugin admin routes get this from
36
+ * `req.ctx.userId` (set by the host's tenant middleware). */
37
+ ownerUserId: string;
38
+ channelId: string;
39
+ pluginId: string;
40
+ displayName?: string;
41
+ config: Record<string, unknown>;
42
+ /** Default true. Set false to create a binding without starting
43
+ * the adapter (admin can flip later). */
44
+ enabled?: boolean;
45
+ }
46
+ export interface ChannelBindingsCapability {
47
+ /** Create + start a binding in one call. Returns the row the
48
+ * host persisted. */
49
+ create(input: CreateChannelBindingInput): Promise<ChannelBindingView>;
50
+ /** Enumerate the calling user's bindings. */
51
+ list(opts: {
52
+ ownerUserId: string;
53
+ channelId?: string;
54
+ }): ChannelBindingView[];
55
+ /** Stop the adapter, delete the row. Refuses the operation when
56
+ * the binding doesn't belong to the supplied user. Returns true
57
+ * if anything was removed. */
58
+ delete(bindingId: string, ownerUserId: string): Promise<boolean>;
59
+ }
60
+ //# sourceMappingURL=channel-bindings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-bindings.d.ts","sourceRoot":"","sources":["../src/channel-bindings.ts"],"names":[],"mappings":"AAiBA;;yDAEyD;AACzD,MAAM,WAAW,kBAAkB;IACjC,iCAAiC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;6BAIyB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gEAAgE;IAChE,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IAC9D,yEAAyE;IACzE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC;;;kEAG8D;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC;8CAC0C;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC;0BACsB;IACtB,MAAM,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACtE,6CAA6C;IAC7C,IAAI,CAAC,IAAI,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,kBAAkB,EAAE,CAAC;IAC9E;;mCAE+B;IAC/B,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAClE"}
@@ -0,0 +1,18 @@
1
+ // Capability-side type for `host.channelBindings`.
2
+ //
3
+ // Channel plugins (wechat / telegram / discord / ...) call into
4
+ // this through `ctx.capabilities.get<ChannelBindingsCapability>(
5
+ // "host.channelBindings")` after a successful login flow to:
6
+ //
7
+ // - persist the binding row (token, account metadata, ...) on
8
+ // `channel_bindings`
9
+ // - kick the adapter manager to actually start the adapter so
10
+ // the long-poll begins immediately, no server restart
11
+ // - list / delete previously-created bindings for the admin UI
12
+ //
13
+ // We keep the wire shape in plugin-sdk (not @tianshu/server) so
14
+ // plugins don't pull a host dep just to register a binding. The
15
+ // host registers a matching impl in index.ts; the registry hooks
16
+ // it under the capability name.
17
+ export {};
18
+ //# sourceMappingURL=channel-bindings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-bindings.js","sourceRoot":"","sources":["../src/channel-bindings.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,EAAE;AACF,gEAAgE;AAChE,iEAAiE;AACjE,6DAA6D;AAC7D,EAAE;AACF,gEAAgE;AAChE,yBAAyB;AACzB,gEAAgE;AAChE,0DAA0D;AAC1D,iEAAiE;AACjE,EAAE;AACF,gEAAgE;AAChE,gEAAgE;AAChE,iEAAiE;AACjE,gCAAgC"}
@@ -293,4 +293,32 @@ export declare function __resetUseThemeForTest(): void;
293
293
  /** Hook plugins call. Returns the live theme state; re-renders
294
294
  * the consuming component on theme change. */
295
295
  export declare function useTheme(): ThemeApi;
296
+ export interface ChatNavApi {
297
+ /** What the chat area is currently showing. null = webchat. */
298
+ viewingSessionId: string | null;
299
+ /** Pin the chat area to a given session. Pass null to return
300
+ * to the user's webchat thread. */
301
+ setViewingSession: (sessionId: string | null) => void;
302
+ }
303
+ export declare function __installChatNav(fn: () => ChatNavApi): void;
304
+ export declare function __resetChatNavForTest(): void;
305
+ /** Hook returning the host's current chat-navigation state. */
306
+ export declare function useChatNav(): ChatNavApi;
307
+ export interface WsEventApi {
308
+ /** Subscribe to a typed server event. Returns the cleanup
309
+ * function the React effect needs to unsubscribe. Caller
310
+ * is responsible for stable handler identity (React-shaped). */
311
+ subscribe: (type: string, handler: (event: {
312
+ type: string;
313
+ } & Record<string, unknown>) => void) => () => void;
314
+ }
315
+ export declare function __installWsEventApi(api: WsEventApi): void;
316
+ export declare function __resetWsEventApiForTest(): void;
317
+ /** Programmatic subscribe — plugins call this from their own
318
+ * useEffect to receive WebSocket events from the host. Returns the
319
+ * unsubscribe function (or a no-op when the host hasn't installed
320
+ * an API yet, e.g. unit tests or pre-mount probing). */
321
+ export declare function subscribeToWsEvent<TEvent extends {
322
+ type: string;
323
+ }>(type: TEvent["type"], handler: (event: TEvent) => void): () => void;
296
324
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAoB,SAAQ,UAAU;IACrD,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD;qCACiC;IACjC,MAAM,EAAE,MAAM,CAAC;CAChB;AAID;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IACzB,yDAAyD;IACzD,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,OAAO,GAAG,OAAO,CAAC;IACxC;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,MAAM,cAAc,GAAG;AAC3B,wEAAwE;AACxE,IAAI,EAAE,MAAM;AACZ,0EAA0E;AAC1E,WAAW,EAAE,UAAU,EAAE,KACtB,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAE9B;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,sEAAsE;IACtE,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,oDAAoD;IACpD,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC;IACjD,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IAC3E,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,IAAI,CAAC;CACxD;AAED,MAAM,WAAW,mBAAoB,SAAQ,UAAU;IACrD,QAAQ,EAAE,WAAW,CAAC;CACvB;AAID;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAwB,SAAQ,UAAU;IACzD,UAAU,EAAE,oBAAoB,CAAC;IACjC;;uEAEmE;IACnE,KAAK,EAAE,OAAO,GAAG,KAAK,CAAC;IACvB;;;;;;OAMG;IACH,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAChB,MAAM,EACN,aAAa,CACT,UAAU,GACV,mBAAmB,GACnB,mBAAmB,GACnB,uBAAuB,GACvB,cAAc,CACjB,CACF,CAAC;CACH;AA2BD;;qBAEqB;AACrB,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,WAAW,GAAG,IAAI,CAEhE;AAED;;iBAEiB;AACjB,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED,wBAAgB,WAAW,IAAI,WAAW,CASzC;AAcD,MAAM,WAAW,WAAW;IAC1B;;;;iEAI6D;IAC7D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAUD;;;YAGY;AACZ,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAE3D;AAED,mBAAmB;AACnB,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED;;;;;gBAKgB;AAYhB,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,WAAW,qBAAqB;IACpC;;4DAEwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD,wBAAgB,yBAAyB,CACvC,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,qBAAqB,CAAC,GAC5C,IAAI,CAEN;AAED,wBAAgB,8BAA8B,IAAI,IAAI,CAErD;AAED;;iEAEiE;AACjE,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,qBAAqB,CAKrE,CAAC;AAEJ,wBAAgB,WAAW,IAAI,WAAW,CAAC,MAAM,CAAC,CAejD;AAwBD,MAAM,WAAW,UAAU;IACzB;;iBAEa;IACb,MAAM,EAAE,OAAO,CAAC;IAChB;;oEAEgE;IAChE,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB;+DAC2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;gEAI4D;IAC5D,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,uDAAuD;IACvD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;8CAE0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;qCAGiC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;2DAGuD;IACvD,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC;;;;6CAIyC;IACzC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC;;sBAEkB;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;gDAC4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;kEAG8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;8DAE0D;IAC1D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;2BACuB;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;mCAC+B;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;0CACsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;wCAIoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;sEAGkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACvC,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;IACzD,aAAa,EAAE,KAAK,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;CACxD;AAUD;4CAC4C;AAC5C,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAE7D;AAED,mBAAmB;AACnB,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAED;;;kDAGkD;AAClD,wBAAgB,eAAe,IAAI,YAAY,CAS9C;AAoCD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AACpD,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC;AAE7C,MAAM,WAAW,QAAQ;IACvB;;sBAEkB;IAClB,QAAQ,EAAE,aAAa,CAAC;IACxB;8DAC0D;IAC1D,IAAI,EAAE,SAAS,CAAC;IAChB,+DAA+D;IAC/D,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;CACpC;AAUD;;;0CAG0C;AAC1C,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,QAAQ,GAAG,IAAI,CAE1D;AAED,mBAAmB;AACnB,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED;+CAC+C;AAC/C,wBAAgB,QAAQ,IAAI,QAAQ,CAanC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -147,4 +147,43 @@ export function useTheme() {
147
147
  }
148
148
  return fn();
149
149
  }
150
+ function chatNavSlot() {
151
+ return globalThis;
152
+ }
153
+ export function __installChatNav(fn) {
154
+ chatNavSlot().__tianshuPluginSdkChatNavHook__ = fn;
155
+ }
156
+ export function __resetChatNavForTest() {
157
+ delete chatNavSlot().__tianshuPluginSdkChatNavHook__;
158
+ }
159
+ /** Hook returning the host's current chat-navigation state. */
160
+ export function useChatNav() {
161
+ const fn = chatNavSlot().__tianshuPluginSdkChatNavHook__;
162
+ if (!fn) {
163
+ return {
164
+ viewingSessionId: null,
165
+ setViewingSession: () => { },
166
+ };
167
+ }
168
+ return fn();
169
+ }
170
+ function wsEventSlot() {
171
+ return globalThis;
172
+ }
173
+ export function __installWsEventApi(api) {
174
+ wsEventSlot().__tianshuPluginSdkWsEventApi__ = api;
175
+ }
176
+ export function __resetWsEventApiForTest() {
177
+ delete wsEventSlot().__tianshuPluginSdkWsEventApi__;
178
+ }
179
+ /** Programmatic subscribe — plugins call this from their own
180
+ * useEffect to receive WebSocket events from the host. Returns the
181
+ * unsubscribe function (or a no-op when the host hasn't installed
182
+ * an API yet, e.g. unit tests or pre-mount probing). */
183
+ export function subscribeToWsEvent(type, handler) {
184
+ const api = wsEventSlot().__tianshuPluginSdkWsEventApi__;
185
+ if (!api)
186
+ return () => { };
187
+ return api.subscribe(type, handler);
188
+ }
150
189
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -5,5 +5,6 @@ export * from "./agent-loop.js";
5
5
  export * from "./session-inbox.js";
6
6
  export * from "./catalog.js";
7
7
  export * from "./lsp.js";
8
+ export * from "./channel-bindings.js";
8
9
  export { McpToolset, textOfMcpContent, type McpEndpointResolver, type McpToolDescriptor, type McpToolFilter, type McpToolsetEntry, type McpToolsetOptions, type McpToolsetSnapshot, type ToolsetProvider, } from "./mcp-toolset.js";
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC"}
@@ -15,5 +15,6 @@ export * from "./agent-loop.js";
15
15
  export * from "./session-inbox.js";
16
16
  export * from "./catalog.js";
17
17
  export * from "./lsp.js";
18
+ export * from "./channel-bindings.js";
18
19
  export { McpToolset, textOfMcpContent, } from "./mcp-toolset.js";
19
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,EAAE;AACF,mEAAmE;AACnE,oEAAoE;AACpE,qEAAqE;AACrE,iCAAiC;AACjC,EAAE;AACF,wEAAwE;AACxE,iEAAiE;AACjE,0BAA0B;AAE1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,OAAO,EACL,UAAU,EACV,gBAAgB,GAQjB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,EAAE;AACF,mEAAmE;AACnE,oEAAoE;AACpE,qEAAqE;AACrE,iCAAiC;AACjC,EAAE;AACF,wEAAwE;AACxE,iEAAiE;AACjE,0BAA0B;AAE1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,OAAO,EACL,UAAU,EACV,gBAAgB,GAQjB,MAAM,kBAAkB,CAAC"}
@@ -64,6 +64,11 @@ export const KNOWN_CAPABILITIES = {
64
64
  description:
65
65
  "Diagnose a file via the host's LSP manager after a write/edit. Plugins (notably `files`) call `diagnoseAfterEdit({ filePath, contents })` and append the formatted diagnostic block to their tool result so the model sees compile errors in the same turn that introduced them. Tenant-scoped: the manager refuses files outside the calling tenant's workspace. See ADR-0005.",
66
66
  },
67
+ "host.channelBindings": {
68
+ exclusive: true,
69
+ description:
70
+ "Manage channel adapter bindings (chat-platform integrations). Plugins contributing a channel (Feishu / Telegram / WeChat / ...) call create/start/stop/delete here so the host's adapter manager actually wires the inbound stream to the agent. The DB row + adapter lifecycle live together behind this capability.",
71
+ },
67
72
  } as const satisfies Record<string, CapabilitySpec>;
68
73
 
69
74
  export type CapabilityName = keyof typeof KNOWN_CAPABILITIES;
@@ -0,0 +1,75 @@
1
+ // Capability-side type for `host.channelBindings`.
2
+ //
3
+ // Channel plugins (wechat / telegram / discord / ...) call into
4
+ // this through `ctx.capabilities.get<ChannelBindingsCapability>(
5
+ // "host.channelBindings")` after a successful login flow to:
6
+ //
7
+ // - persist the binding row (token, account metadata, ...) on
8
+ // `channel_bindings`
9
+ // - kick the adapter manager to actually start the adapter so
10
+ // the long-poll begins immediately, no server restart
11
+ // - list / delete previously-created bindings for the admin UI
12
+ //
13
+ // We keep the wire shape in plugin-sdk (not @tianshu/server) so
14
+ // plugins don't pull a host dep just to register a binding. The
15
+ // host registers a matching impl in index.ts; the registry hooks
16
+ // it under the capability name.
17
+
18
+ /** Subset of the channel_bindings row plugins can see. The full row
19
+ * (status, status_detail, timestamps) is host-internal; the plugin
20
+ * cares about creating / updating identity + config. */
21
+ export interface ChannelBindingView {
22
+ /** Stable id, prefixed `cb_`. */
23
+ id: string;
24
+ /** Tenant this binding belongs to. */
25
+ tenantId: string;
26
+ /** The user this binding belongs to. Channel accounts (a wechat
27
+ * login, a telegram bot token, ...) are personal credentials —
28
+ * one user binding their phone shouldn't surface that account
29
+ * to other users on the same tenant. The host scopes list /
30
+ * delete to this id. */
31
+ ownerUserId: string;
32
+ /** Channel id ("wechat" / "telegram" / ...). */
33
+ channelId: string;
34
+ /** Plugin id that contributes the channel. */
35
+ pluginId: string;
36
+ /** Human-readable label admins set / the login flow inferred. */
37
+ displayName: string | null;
38
+ /** Whether the host's adapter manager should keep it active. */
39
+ enabled: boolean;
40
+ /** Last lifecycle state the adapter reached. */
41
+ status: "idle" | "starting" | "running" | "error" | "stopped";
42
+ /** Free-text last status detail (auth failure, last reconnect, etc.). */
43
+ statusDetail: string | null;
44
+ /** Per-binding adapter config (token + identity, plugin-defined). */
45
+ config: Record<string, unknown>;
46
+ createdAt: number;
47
+ updatedAt: number;
48
+ }
49
+
50
+ export interface CreateChannelBindingInput {
51
+ /** Per-user scope. Channel credentials are personal — the host
52
+ * refuses any operation where the caller-supplied userId doesn't
53
+ * own the targeted binding. Plugin admin routes get this from
54
+ * `req.ctx.userId` (set by the host's tenant middleware). */
55
+ ownerUserId: string;
56
+ channelId: string;
57
+ pluginId: string;
58
+ displayName?: string;
59
+ config: Record<string, unknown>;
60
+ /** Default true. Set false to create a binding without starting
61
+ * the adapter (admin can flip later). */
62
+ enabled?: boolean;
63
+ }
64
+
65
+ export interface ChannelBindingsCapability {
66
+ /** Create + start a binding in one call. Returns the row the
67
+ * host persisted. */
68
+ create(input: CreateChannelBindingInput): Promise<ChannelBindingView>;
69
+ /** Enumerate the calling user's bindings. */
70
+ list(opts: { ownerUserId: string; channelId?: string }): ChannelBindingView[];
71
+ /** Stop the adapter, delete the row. Refuses the operation when
72
+ * the binding doesn't belong to the supplied user. Returns true
73
+ * if anything was removed. */
74
+ delete(bindingId: string, ownerUserId: string): Promise<boolean>;
75
+ }
@@ -558,3 +558,109 @@ export function useTheme(): ThemeApi {
558
558
  }
559
559
  return fn();
560
560
  }
561
+
562
+ // ─── ChatNav — host-managed selection of which session the chat
563
+ // area is currently viewing.
564
+ //
565
+ // Channel plugins call `setViewingSession(sessionId)` from their
566
+ // sidebar sections so clicking a row pins the chat area to that
567
+ // session. `viewingSessionId === null` means the user's webchat
568
+ // thread.
569
+ //
570
+ // Same install-once + globalSlot pattern as useTheme / useComposer.
571
+ // Host installs a real implementation at boot via
572
+ // `__installChatNav`; tests can install a stub through the same
573
+ // hook.
574
+
575
+ export interface ChatNavApi {
576
+ /** What the chat area is currently showing. null = webchat. */
577
+ viewingSessionId: string | null;
578
+ /** Pin the chat area to a given session. Pass null to return
579
+ * to the user's webchat thread. */
580
+ setViewingSession: (sessionId: string | null) => void;
581
+ }
582
+
583
+ interface ChatNavGlobalSlot {
584
+ __tianshuPluginSdkChatNavHook__?: () => ChatNavApi;
585
+ }
586
+
587
+ function chatNavSlot(): ChatNavGlobalSlot {
588
+ return globalThis as unknown as ChatNavGlobalSlot;
589
+ }
590
+
591
+ export function __installChatNav(fn: () => ChatNavApi): void {
592
+ chatNavSlot().__tianshuPluginSdkChatNavHook__ = fn;
593
+ }
594
+
595
+ export function __resetChatNavForTest(): void {
596
+ delete chatNavSlot().__tianshuPluginSdkChatNavHook__;
597
+ }
598
+
599
+ /** Hook returning the host's current chat-navigation state. */
600
+ export function useChatNav(): ChatNavApi {
601
+ const fn = chatNavSlot().__tianshuPluginSdkChatNavHook__;
602
+ if (!fn) {
603
+ return {
604
+ viewingSessionId: null,
605
+ setViewingSession: () => {},
606
+ };
607
+ }
608
+ return fn();
609
+ }
610
+
611
+ // ─── WebSocket event hook ─────────────────────────────────────────────
612
+ //
613
+ // Plugins occasionally want to react to push-broadcasted events
614
+ // the host server emits — e.g. a wechat sidebar section refreshing
615
+ // its session list when a new inbound message lands. Subscribing
616
+ // from a plugin's own React component without reaching into host
617
+ // internals is what this hook provides.
618
+ //
619
+ // The host installs a singleton subscribe function at boot via
620
+ // __installUseWsEvent; plugins call useWsEvent(type, handler) from
621
+ // any component. Effect cleanup unsubscribes on unmount.
622
+ //
623
+ // We deliberately keep this generic over wire-message type so the
624
+ // SDK doesn't need to know every event the server emits.
625
+
626
+ export interface WsEventApi {
627
+ /** Subscribe to a typed server event. Returns the cleanup
628
+ * function the React effect needs to unsubscribe. Caller
629
+ * is responsible for stable handler identity (React-shaped). */
630
+ subscribe: (
631
+ type: string,
632
+ handler: (event: { type: string } & Record<string, unknown>) => void,
633
+ ) => () => void;
634
+ }
635
+
636
+ interface WsEventGlobalSlot {
637
+ __tianshuPluginSdkWsEventApi__?: WsEventApi;
638
+ }
639
+
640
+ function wsEventSlot(): WsEventGlobalSlot {
641
+ return globalThis as unknown as WsEventGlobalSlot;
642
+ }
643
+
644
+ export function __installWsEventApi(api: WsEventApi): void {
645
+ wsEventSlot().__tianshuPluginSdkWsEventApi__ = api;
646
+ }
647
+
648
+ export function __resetWsEventApiForTest(): void {
649
+ delete wsEventSlot().__tianshuPluginSdkWsEventApi__;
650
+ }
651
+
652
+ /** Programmatic subscribe — plugins call this from their own
653
+ * useEffect to receive WebSocket events from the host. Returns the
654
+ * unsubscribe function (or a no-op when the host hasn't installed
655
+ * an API yet, e.g. unit tests or pre-mount probing). */
656
+ export function subscribeToWsEvent<TEvent extends { type: string }>(
657
+ type: TEvent["type"],
658
+ handler: (event: TEvent) => void,
659
+ ): () => void {
660
+ const api = wsEventSlot().__tianshuPluginSdkWsEventApi__;
661
+ if (!api) return () => {};
662
+ return api.subscribe(
663
+ type,
664
+ handler as (e: { type: string } & Record<string, unknown>) => void,
665
+ );
666
+ }
@@ -16,6 +16,7 @@ export * from "./agent-loop.js";
16
16
  export * from "./session-inbox.js";
17
17
  export * from "./catalog.js";
18
18
  export * from "./lsp.js";
19
+ export * from "./channel-bindings.js";
19
20
  export {
20
21
  McpToolset,
21
22
  textOfMcpContent,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tianshu-ai/tianshu",
3
- "version": "0.3.36",
3
+ "version": "0.3.38",
4
4
  "description": "An open AI agent platform with a sidecar browser. Built in public.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/tianshu-ai/tianshu",
@@ -39,6 +39,10 @@ export declare const KNOWN_CAPABILITIES: {
39
39
  readonly exclusive: true;
40
40
  readonly description: "Diagnose a file via the host's LSP manager after a write/edit. Plugins (notably `files`) call `diagnoseAfterEdit({ filePath, contents })` and append the formatted diagnostic block to their tool result so the model sees compile errors in the same turn that introduced them. Tenant-scoped: the manager refuses files outside the calling tenant's workspace. See ADR-0005.";
41
41
  };
42
+ readonly "host.channelBindings": {
43
+ readonly exclusive: true;
44
+ readonly description: "Manage channel adapter bindings (chat-platform integrations). Plugins contributing a channel (Feishu / Telegram / WeChat / ...) call create/start/stop/delete here so the host's adapter manager actually wires the inbound stream to the agent. The DB row + adapter lifecycle live together behind this capability.";
45
+ };
42
46
  };
43
47
  export type CapabilityName = keyof typeof KNOWN_CAPABILITIES;
44
48
  /** True iff the given string is a registered capability name. */
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8CoB,CAAC;AAEpD,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,kBAAkB,CAAC;AAE7D,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,cAAc,CAE/D;AAED,2DAA2D;AAC3D,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEvE"}
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmDoB,CAAC;AAEpD,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,kBAAkB,CAAC;AAE7D,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,cAAc,CAE/D;AAED,2DAA2D;AAC3D,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEvE"}
@@ -49,6 +49,10 @@ export const KNOWN_CAPABILITIES = {
49
49
  exclusive: true,
50
50
  description: "Diagnose a file via the host's LSP manager after a write/edit. Plugins (notably `files`) call `diagnoseAfterEdit({ filePath, contents })` and append the formatted diagnostic block to their tool result so the model sees compile errors in the same turn that introduced them. Tenant-scoped: the manager refuses files outside the calling tenant's workspace. See ADR-0005.",
51
51
  },
52
+ "host.channelBindings": {
53
+ exclusive: true,
54
+ description: "Manage channel adapter bindings (chat-platform integrations). Plugins contributing a channel (Feishu / Telegram / WeChat / ...) call create/start/stop/delete here so the host's adapter manager actually wires the inbound stream to the agent. The DB row + adapter lifecycle live together behind this capability.",
55
+ },
52
56
  };
53
57
  /** True iff the given string is a registered capability name. */
54
58
  export function isCapabilityName(s) {
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,EAAE;AACF,iEAAiE;AACjE,iEAAiE;AACjE,sEAAsE;AACtE,oEAAoE;AACpE,0DAA0D;AAC1D,EAAE;AACF,mBAAmB;AACnB,kEAAkE;AAClE,+DAA+D;AAC/D,mCAAmC;AACnC,kEAAkE;AAClE,2DAA2D;AAO3D,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,eAAe,EAAE;QACf,SAAS,EAAE,IAAI;QACf,WAAW,EACT,8EAA8E;KACjF;IACD,kBAAkB,EAAE;QAClB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,0SAA0S;KAC7S;IACD,aAAa,EAAE;QACb,SAAS,EAAE,IAAI;QACf,WAAW,EACT,0HAA0H;KAC7H;IACD,gBAAgB,EAAE;QAChB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,uTAAuT;KAC1T;IACD,mBAAmB,EAAE;QACnB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,sWAAsW;KACzW;IACD,kBAAkB,EAAE;QAClB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,qTAAqT;KACxT;IACD,mBAAmB,EAAE;QACnB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,oNAAoN;KACvN;IACD,mBAAmB,EAAE;QACnB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,sRAAsR;KACzR;IACD,UAAU,EAAE;QACV,SAAS,EAAE,IAAI;QACf,WAAW,EACT,iXAAiX;KACpX;CACgD,CAAC;AAIpD,iEAAiE;AACjE,MAAM,UAAU,gBAAgB,CAAC,CAAS;IACxC,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC"}
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,EAAE;AACF,iEAAiE;AACjE,iEAAiE;AACjE,sEAAsE;AACtE,oEAAoE;AACpE,0DAA0D;AAC1D,EAAE;AACF,mBAAmB;AACnB,kEAAkE;AAClE,+DAA+D;AAC/D,mCAAmC;AACnC,kEAAkE;AAClE,2DAA2D;AAO3D,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,eAAe,EAAE;QACf,SAAS,EAAE,IAAI;QACf,WAAW,EACT,8EAA8E;KACjF;IACD,kBAAkB,EAAE;QAClB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,0SAA0S;KAC7S;IACD,aAAa,EAAE;QACb,SAAS,EAAE,IAAI;QACf,WAAW,EACT,0HAA0H;KAC7H;IACD,gBAAgB,EAAE;QAChB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,uTAAuT;KAC1T;IACD,mBAAmB,EAAE;QACnB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,sWAAsW;KACzW;IACD,kBAAkB,EAAE;QAClB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,qTAAqT;KACxT;IACD,mBAAmB,EAAE;QACnB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,oNAAoN;KACvN;IACD,mBAAmB,EAAE;QACnB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,sRAAsR;KACzR;IACD,UAAU,EAAE;QACV,SAAS,EAAE,IAAI;QACf,WAAW,EACT,iXAAiX;KACpX;IACD,sBAAsB,EAAE;QACtB,SAAS,EAAE,IAAI;QACf,WAAW,EACT,uTAAuT;KAC1T;CACgD,CAAC;AAIpD,iEAAiE;AACjE,MAAM,UAAU,gBAAgB,CAAC,CAAS;IACxC,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC"}