@fastagent-sh/fastagent 0.24.4 → 0.26.0

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 (487) hide show
  1. package/README.md +54 -82
  2. package/dist/agent-api.d.ts +460 -0
  3. package/dist/agent-api.js +209 -0
  4. package/dist/answer-text.d.ts +8 -0
  5. package/dist/answer-text.js +18 -0
  6. package/dist/atomic-write.d.ts +2 -2
  7. package/dist/atomic-write.js +2 -2
  8. package/dist/authoring.d.ts +81 -0
  9. package/dist/authoring.js +245 -0
  10. package/dist/channel.d.ts +29 -15
  11. package/dist/channel.js +4 -1
  12. package/dist/channels/agentcore-protocol.d.ts +36 -50
  13. package/dist/channels/agentcore-protocol.js +3 -3
  14. package/dist/channels/agentcore-service.d.ts +8 -18
  15. package/dist/channels/agentcore-service.js +108 -127
  16. package/dist/channels/agentcore.d.ts +8 -24
  17. package/dist/channels/agentcore.js +32 -65
  18. package/dist/channels/body.d.ts +0 -16
  19. package/dist/channels/body.js +0 -25
  20. package/dist/channels/busy.js +6 -1
  21. package/dist/channels/context.d.ts +4 -0
  22. package/dist/channels/context.js +35 -0
  23. package/dist/channels/discover.d.ts +18 -20
  24. package/dist/channels/discover.js +41 -99
  25. package/dist/channels/feishu/feishu-api.d.ts +54 -4
  26. package/dist/channels/feishu/feishu-api.js +192 -149
  27. package/dist/channels/feishu/feishu.d.ts +3 -0
  28. package/dist/channels/feishu/feishu.js +117 -106
  29. package/dist/channels/feishu/history.d.ts +55 -0
  30. package/dist/channels/feishu/history.js +199 -0
  31. package/dist/channels/feishu/invoke-turn.d.ts +13 -11
  32. package/dist/channels/feishu/invoke-turn.js +9 -10
  33. package/dist/channels/feishu/model.d.ts +2 -1
  34. package/dist/channels/feishu/normalize.js +100 -0
  35. package/dist/channels/feishu/preview.d.ts +2 -2
  36. package/dist/channels/feishu/register-webhook.d.ts +1 -0
  37. package/dist/channels/feishu/register-webhook.js +3 -2
  38. package/dist/channels/feishu/scaffold/channel.ts +65 -46
  39. package/dist/channels/feishu/scaffold/feishu-send.ts +38 -33
  40. package/dist/channels/feishu/scaffold/feishu-threads.ts +25 -0
  41. package/dist/channels/feishu/setup-mode.d.ts +45 -25
  42. package/dist/channels/feishu/setup-mode.js +74 -23
  43. package/dist/channels/feishu/shared-api.d.ts +24 -6
  44. package/dist/channels/feishu/shared-api.js +30 -24
  45. package/dist/channels/kit/context-buffer.d.ts +11 -2
  46. package/dist/channels/kit/context-buffer.js +7 -4
  47. package/dist/channels/kit/delivery.d.ts +19 -3
  48. package/dist/channels/kit/delivery.js +74 -15
  49. package/dist/channels/kit/event-stream.js +2 -1
  50. package/dist/channels/kit/invoke-turn-kit.d.ts +41 -41
  51. package/dist/channels/kit/invoke-turn-kit.js +62 -71
  52. package/dist/channels/kit/place-history.d.ts +107 -0
  53. package/dist/channels/kit/place-history.js +182 -0
  54. package/dist/channels/kit/preview-kit.d.ts +9 -5
  55. package/dist/channels/kit/preview-kit.js +36 -15
  56. package/dist/channels/kit/room-threads.d.ts +46 -0
  57. package/dist/channels/kit/room-threads.js +81 -0
  58. package/dist/channels/kit/seen.js +1 -1
  59. package/dist/channels/kit/stop-command.d.ts +6 -3
  60. package/dist/channels/kit/stop-command.js +20 -18
  61. package/dist/channels/kit/thread-fork.d.ts +17 -0
  62. package/dist/channels/kit/thread-fork.js +43 -0
  63. package/dist/channels/kit/thread-participants.js +1 -1
  64. package/dist/channels/kit/transport.d.ts +5 -0
  65. package/dist/channels/kit/transport.js +5 -0
  66. package/dist/channels/kit/turn-runner.d.ts +10 -9
  67. package/dist/channels/kit/turn-runner.js +17 -19
  68. package/dist/channels/kit/turn-store.d.ts +5 -4
  69. package/dist/channels/kit/turn-store.js +5 -5
  70. package/dist/channels/lark/lark.d.ts +3 -0
  71. package/dist/channels/lark/lark.js +5 -0
  72. package/dist/channels/lark/onboard.d.ts +5 -3
  73. package/dist/channels/lark/onboard.js +14 -14
  74. package/dist/channels/lark/scaffold/channel.ts +67 -44
  75. package/dist/channels/lark/scaffold/lark-send.ts +38 -33
  76. package/dist/channels/lark/scaffold/lark-threads.ts +25 -0
  77. package/dist/channels/respond.d.ts +0 -4
  78. package/dist/channels/respond.js +1 -1
  79. package/dist/channels/router.d.ts +18 -0
  80. package/dist/channels/router.js +68 -0
  81. package/dist/channels/serve.d.ts +5 -70
  82. package/dist/channels/serve.js +105 -287
  83. package/dist/channels/slack/history.d.ts +42 -0
  84. package/dist/channels/slack/history.js +282 -0
  85. package/dist/channels/slack/invoke-turn.d.ts +12 -5
  86. package/dist/channels/slack/invoke-turn.js +7 -5
  87. package/dist/channels/slack/manifest.d.ts +1 -4
  88. package/dist/channels/slack/manifest.js +22 -10
  89. package/dist/channels/slack/model.d.ts +2 -1
  90. package/dist/channels/slack/onboard.d.ts +0 -2
  91. package/dist/channels/slack/onboard.js +2 -4
  92. package/dist/channels/slack/onboarding-state.d.ts +0 -2
  93. package/dist/channels/slack/onboarding-state.js +0 -1
  94. package/dist/channels/slack/parse.d.ts +0 -5
  95. package/dist/channels/slack/parse.js +1 -16
  96. package/dist/channels/slack/preview.d.ts +2 -3
  97. package/dist/channels/slack/preview.js +78 -52
  98. package/dist/channels/slack/register-webhook.d.ts +1 -0
  99. package/dist/channels/slack/register-webhook.js +6 -5
  100. package/dist/channels/slack/scaffold/channel.ts +23 -24
  101. package/dist/channels/slack/scaffold/slack-send.ts +50 -43
  102. package/dist/channels/slack/scaffold/slack-threads.ts +29 -0
  103. package/dist/channels/slack/setup-server.d.ts +19 -0
  104. package/dist/channels/slack/setup-server.js +113 -11
  105. package/dist/channels/slack/shared-api.d.ts +15 -4
  106. package/dist/channels/slack/shared-api.js +19 -14
  107. package/dist/channels/slack/slack-api.d.ts +61 -2
  108. package/dist/channels/slack/slack-api.js +28 -5
  109. package/dist/channels/slack/slack.js +97 -52
  110. package/dist/channels/slack/welcomed.js +1 -1
  111. package/dist/channels/telegram/context-buffer.d.ts +6 -1
  112. package/dist/channels/telegram/context-buffer.js +19 -0
  113. package/dist/channels/telegram/invoke-turn.d.ts +8 -4
  114. package/dist/channels/telegram/invoke-turn.js +7 -7
  115. package/dist/channels/telegram/parse.d.ts +7 -2
  116. package/dist/channels/telegram/parse.js +7 -0
  117. package/dist/channels/telegram/preview.d.ts +2 -2
  118. package/dist/channels/telegram/register-webhook.d.ts +1 -0
  119. package/dist/channels/telegram/register-webhook.js +3 -2
  120. package/dist/channels/telegram/scaffold/channel.ts +27 -28
  121. package/dist/channels/telegram/scaffold/telegram-send.ts +61 -108
  122. package/dist/channels/telegram/shared-api.d.ts +34 -0
  123. package/dist/channels/telegram/shared-api.js +79 -0
  124. package/dist/channels/telegram/telegram-api.d.ts +15 -5
  125. package/dist/channels/telegram/telegram-api.js +10 -6
  126. package/dist/channels/telegram/telegram.js +27 -21
  127. package/dist/channels/telegram/turn-store.js +1 -1
  128. package/dist/channels/{kit/turn-queue.d.ts → turn-queue.d.ts} +2 -2
  129. package/dist/channels/{kit/turn-queue.js → turn-queue.js} +10 -10
  130. package/dist/cli/add-feishu.d.ts +42 -12
  131. package/dist/cli/add-feishu.js +177 -124
  132. package/dist/cli/add-slack.d.ts +8 -3
  133. package/dist/cli/add-slack.js +116 -64
  134. package/dist/cli/auth-view.d.ts +10 -3
  135. package/dist/cli/auth-view.js +8 -6
  136. package/dist/cli/box-login.d.ts +18 -7
  137. package/dist/cli/box-login.js +46 -12
  138. package/dist/cli/commands/add.d.ts +15 -4
  139. package/dist/cli/commands/add.js +253 -143
  140. package/dist/cli/commands/auth.d.ts +6 -0
  141. package/dist/cli/commands/auth.js +50 -0
  142. package/dist/cli/commands/content.d.ts +6 -0
  143. package/dist/cli/commands/content.js +45 -0
  144. package/dist/cli/commands/deploy/agentcore.js +50 -77
  145. package/dist/cli/commands/deploy/docker.js +38 -39
  146. package/dist/cli/commands/deploy/fly.js +21 -18
  147. package/dist/cli/commands/deploy/host-login.d.ts +26 -0
  148. package/dist/cli/commands/deploy/host-login.js +90 -0
  149. package/dist/cli/commands/deploy/railway.js +21 -26
  150. package/dist/cli/commands/deploy/shared.d.ts +45 -17
  151. package/dist/cli/commands/deploy/shared.js +34 -15
  152. package/dist/cli/commands/deploy.d.ts +0 -4
  153. package/dist/cli/commands/deploy.js +237 -50
  154. package/dist/cli/commands/destroy.js +8 -6
  155. package/dist/cli/commands/dev.d.ts +0 -2
  156. package/dist/cli/commands/dev.js +20 -19
  157. package/dist/cli/commands/env.d.ts +12 -0
  158. package/dist/cli/commands/env.js +191 -0
  159. package/dist/cli/commands/info.js +95 -156
  160. package/dist/cli/commands/init.d.ts +2 -2
  161. package/dist/cli/commands/init.js +35 -33
  162. package/dist/cli/commands/invoke.d.ts +6 -0
  163. package/dist/cli/commands/invoke.js +132 -16
  164. package/dist/cli/commands/login.d.ts +31 -2
  165. package/dist/cli/commands/login.js +416 -65
  166. package/dist/cli/commands/logout.d.ts +4 -0
  167. package/dist/cli/commands/logout.js +53 -0
  168. package/dist/cli/commands/logs.js +8 -6
  169. package/dist/cli/commands/models.d.ts +2 -1
  170. package/dist/cli/commands/models.js +39 -37
  171. package/dist/cli/commands/schedules.d.ts +21 -0
  172. package/dist/cli/commands/schedules.js +143 -0
  173. package/dist/cli/commands/start.d.ts +11 -10
  174. package/dist/cli/commands/start.js +35 -62
  175. package/dist/cli/content-view.d.ts +9 -0
  176. package/dist/cli/content-view.js +26 -0
  177. package/dist/cli/fail.d.ts +9 -12
  178. package/dist/cli/fail.js +17 -14
  179. package/dist/cli/invoke-stream.d.ts +12 -3
  180. package/dist/cli/invoke-stream.js +85 -23
  181. package/dist/cli/kernel.d.ts +9 -2
  182. package/dist/cli/kernel.js +15 -6
  183. package/dist/cli/login-relay.d.ts +6 -4
  184. package/dist/cli/login-relay.js +19 -7
  185. package/dist/cli/models-view.d.ts +5 -1
  186. package/dist/cli/models-view.js +1 -1
  187. package/dist/cli/person.d.ts +10 -0
  188. package/dist/cli/person.js +23 -0
  189. package/dist/cli/program.js +421 -203
  190. package/dist/cli/serve.d.ts +13 -63
  191. package/dist/cli/serve.js +31 -121
  192. package/dist/cli/shared.d.ts +21 -48
  193. package/dist/cli/shared.js +70 -89
  194. package/dist/cli/ticket.d.ts +136 -0
  195. package/dist/cli/ticket.js +476 -0
  196. package/dist/client.d.ts +7 -0
  197. package/dist/client.js +2 -0
  198. package/dist/content/declare.d.ts +70 -0
  199. package/dist/content/declare.js +163 -0
  200. package/dist/content/file.d.ts +32 -0
  201. package/dist/content/file.js +119 -0
  202. package/dist/content/git.d.ts +41 -0
  203. package/dist/content/git.js +220 -0
  204. package/dist/content/mount.d.ts +2 -0
  205. package/dist/content/mount.js +15 -0
  206. package/dist/content/resolve.d.ts +52 -0
  207. package/dist/content/resolve.js +151 -0
  208. package/dist/content/source.d.ts +27 -0
  209. package/dist/content/source.js +53 -0
  210. package/dist/conversation-sessions.d.ts +26 -0
  211. package/dist/conversation-sessions.js +99 -0
  212. package/dist/declared-secrets.d.ts +19 -37
  213. package/dist/declared-secrets.js +16 -58
  214. package/dist/deploy/agentcore/destroy.d.ts +3 -3
  215. package/dist/deploy/agentcore/destroy.js +46 -28
  216. package/dist/deploy/agentcore/forwarder.js +105 -22
  217. package/dist/deploy/agentcore/logs.js +1 -1
  218. package/dist/deploy/agentcore/plan.d.ts +10 -24
  219. package/dist/deploy/agentcore/plan.js +31 -135
  220. package/dist/deploy/agentcore/run.d.ts +1 -1
  221. package/dist/deploy/agentcore/run.js +8 -5
  222. package/dist/deploy/agentcore/shell.d.ts +1 -1
  223. package/dist/deploy/agentcore/shell.js +5 -5
  224. package/dist/deploy/api.d.ts +34 -0
  225. package/dist/deploy/api.js +50 -0
  226. package/dist/deploy/box-shell.d.ts +6 -0
  227. package/dist/deploy/box-shell.js +7 -0
  228. package/dist/deploy/build-context.d.ts +7 -5
  229. package/dist/deploy/build-context.js +41 -35
  230. package/dist/deploy/channel-ingress.d.ts +6 -1
  231. package/dist/deploy/channel-ingress.js +18 -5
  232. package/dist/deploy/container.d.ts +22 -9
  233. package/dist/deploy/container.js +96 -55
  234. package/dist/deploy/docker/plan.d.ts +3 -2
  235. package/dist/deploy/docker/plan.js +13 -14
  236. package/dist/deploy/docker/run.d.ts +2 -2
  237. package/dist/deploy/docker/run.js +8 -4
  238. package/dist/deploy/fly/plan.d.ts +1 -1
  239. package/dist/deploy/fly/plan.js +12 -21
  240. package/dist/deploy/fly/run.d.ts +10 -6
  241. package/dist/deploy/fly/run.js +11 -6
  242. package/dist/deploy/hosts.d.ts +2 -1
  243. package/dist/deploy/hosts.js +2 -1
  244. package/dist/deploy/preflight.d.ts +21 -23
  245. package/dist/deploy/preflight.js +223 -202
  246. package/dist/deploy/railway/plan.d.ts +8 -6
  247. package/dist/deploy/railway/plan.js +15 -58
  248. package/dist/deploy/railway/run.d.ts +8 -3
  249. package/dist/deploy/railway/run.js +12 -8
  250. package/dist/deploy/residency.d.ts +5 -11
  251. package/dist/deploy/residency.js +0 -6
  252. package/dist/deploy/runner.d.ts +1 -1
  253. package/dist/deploy/runner.js +1 -1
  254. package/dist/deploy/secrets.d.ts +16 -2
  255. package/dist/deploy/secrets.js +33 -6
  256. package/dist/deploy/workspace.d.ts +11 -6
  257. package/dist/deploy/workspace.js +55 -38
  258. package/dist/dev-supervisor.d.ts +11 -2
  259. package/dist/dev-supervisor.js +52 -27
  260. package/dist/effect-port.d.ts +4 -4
  261. package/dist/effect-port.js +4 -4
  262. package/dist/env.d.ts +0 -13
  263. package/dist/env.js +1 -44
  264. package/dist/environment/apt.d.ts +4 -0
  265. package/dist/environment/apt.js +32 -0
  266. package/dist/environment/declare.d.ts +59 -0
  267. package/dist/environment/declare.js +210 -0
  268. package/dist/environment/mise.d.ts +51 -0
  269. package/dist/environment/mise.js +272 -0
  270. package/dist/feishu.d.ts +2 -2
  271. package/dist/feishu.js +2 -2
  272. package/dist/git.d.ts +13 -0
  273. package/dist/git.js +55 -0
  274. package/dist/harnesses/models/catalog.d.ts +20 -0
  275. package/dist/harnesses/models/catalog.js +254 -0
  276. package/dist/{engines/pi/auth.d.ts → harnesses/models/credentials.d.ts} +3 -3
  277. package/dist/{engines/pi/auth.js → harnesses/models/credentials.js} +3 -3
  278. package/dist/harnesses/models/environment.d.ts +48 -0
  279. package/dist/harnesses/models/environment.js +88 -0
  280. package/dist/harnesses/models/host.d.ts +30 -0
  281. package/dist/harnesses/models/host.js +97 -0
  282. package/dist/{engines/pi → harnesses/models}/login.d.ts +66 -70
  283. package/dist/harnesses/models/login.js +439 -0
  284. package/dist/harnesses/models/models.d.ts +84 -0
  285. package/dist/harnesses/models/models.js +197 -0
  286. package/dist/harnesses/pi-durable/agent.d.ts +42 -0
  287. package/dist/harnesses/pi-durable/agent.js +581 -0
  288. package/dist/harnesses/pi-durable/defaults.d.ts +28 -0
  289. package/dist/harnesses/pi-durable/defaults.js +26 -0
  290. package/dist/harnesses/pi-durable/define.d.ts +77 -0
  291. package/dist/harnesses/pi-durable/define.js +28 -0
  292. package/dist/harnesses/pi-durable/entries.d.ts +32 -0
  293. package/dist/harnesses/pi-durable/entries.js +126 -0
  294. package/dist/harnesses/pi-durable/events.d.ts +25 -0
  295. package/dist/harnesses/pi-durable/events.js +238 -0
  296. package/dist/harnesses/pi-durable/ids.d.ts +16 -0
  297. package/dist/harnesses/pi-durable/ids.js +55 -0
  298. package/dist/harnesses/pi-durable/messages.d.ts +41 -0
  299. package/dist/harnesses/pi-durable/messages.js +116 -0
  300. package/dist/harnesses/pi-durable/open.d.ts +95 -0
  301. package/dist/harnesses/pi-durable/open.js +330 -0
  302. package/dist/harnesses/pi-durable/reads.d.ts +30 -0
  303. package/dist/harnesses/pi-durable/reads.js +94 -0
  304. package/dist/harnesses/pi-durable/registry.d.ts +18 -0
  305. package/dist/harnesses/pi-durable/registry.js +56 -0
  306. package/dist/harnesses/pi-durable/release.d.ts +13 -0
  307. package/dist/harnesses/pi-durable/release.js +40 -0
  308. package/dist/harnesses/pi-durable/serve.d.ts +90 -0
  309. package/dist/harnesses/pi-durable/serve.js +186 -0
  310. package/dist/harnesses/pi-durable/sessions.d.ts +27 -0
  311. package/dist/harnesses/pi-durable/sessions.js +47 -0
  312. package/dist/harnesses/pi-durable/storage.d.ts +4 -0
  313. package/dist/harnesses/pi-durable/storage.js +49 -0
  314. package/dist/harnesses/pi-durable/stream.d.ts +20 -0
  315. package/dist/harnesses/pi-durable/stream.js +221 -0
  316. package/dist/harnesses/pi-durable/text.d.ts +30 -0
  317. package/dist/harnesses/pi-durable/text.js +292 -0
  318. package/dist/harnesses/pi-durable/wake.d.ts +11 -0
  319. package/dist/harnesses/pi-durable/wake.js +90 -0
  320. package/dist/http/client.d.ts +6 -0
  321. package/dist/http/client.js +256 -0
  322. package/dist/http/contract.d.ts +541 -0
  323. package/dist/http/contract.js +179 -0
  324. package/dist/http/server.d.ts +34 -0
  325. package/dist/http/server.js +194 -0
  326. package/dist/index.d.ts +19 -4
  327. package/dist/index.js +13 -5
  328. package/dist/lark.d.ts +2 -2
  329. package/dist/lark.js +2 -2
  330. package/dist/locked-file.d.ts +17 -0
  331. package/dist/{engines/pi/locked-file.js → locked-file.js} +16 -10
  332. package/dist/once.d.ts +6 -0
  333. package/dist/once.js +23 -0
  334. package/dist/paths.d.ts +36 -52
  335. package/dist/paths.js +66 -182
  336. package/dist/runtime.d.ts +25 -2
  337. package/dist/runtime.js +27 -0
  338. package/dist/scaffold/add-channel.d.ts +14 -27
  339. package/dist/scaffold/add-channel.js +82 -180
  340. package/dist/scaffold/init.d.ts +17 -18
  341. package/dist/scaffold/init.js +87 -99
  342. package/dist/scaffold/templates/SYSTEM.md +12 -0
  343. package/dist/scaffold/templates/env.example +4 -10
  344. package/dist/scaffold/templates/fastagent.config.ts +21 -33
  345. package/dist/scaffold/templates/gitignore +8 -1
  346. package/dist/scaffold/templates/skills/writing-great-skills/SKILL.md +1 -2
  347. package/dist/scaffold/templates.d.ts +9 -4
  348. package/dist/scaffold/templates.js +7 -5
  349. package/dist/scaffold/vendor-skill.d.ts +1 -4
  350. package/dist/scaffold/vendor-skill.js +5 -6
  351. package/dist/schedule/cron.d.ts +13 -0
  352. package/dist/schedule/cron.js +52 -0
  353. package/dist/schedule/eventbridge-cron.d.ts +17 -0
  354. package/dist/schedule/eventbridge-cron.js +88 -0
  355. package/dist/schedule/schedule.d.ts +23 -0
  356. package/dist/schedule/schedule.js +34 -0
  357. package/dist/schedule/scheduler.d.ts +34 -33
  358. package/dist/schedule/scheduler.js +251 -137
  359. package/dist/schedule/state.d.ts +4 -14
  360. package/dist/schedule/state.js +7 -7
  361. package/dist/schedule/wake-alarm.d.ts +22 -2
  362. package/dist/schedule/wake-alarm.js +66 -20
  363. package/dist/schedule/wakeups.d.ts +16 -15
  364. package/dist/schedule/wakeups.js +47 -45
  365. package/dist/service.d.ts +56 -169
  366. package/dist/service.js +91 -187
  367. package/dist/serving-command.d.ts +10 -0
  368. package/dist/serving-command.js +16 -0
  369. package/dist/sign-in-api.d.ts +147 -0
  370. package/dist/sign-in-api.js +9 -0
  371. package/dist/slack.d.ts +1 -1
  372. package/dist/slack.js +1 -1
  373. package/dist/{channels/kit/state.js → state-file.js} +6 -6
  374. package/dist/telegram.d.ts +1 -0
  375. package/dist/telegram.js +1 -0
  376. package/dist/tunnel.d.ts +3 -0
  377. package/dist/tunnel.js +14 -5
  378. package/dist/value-file.d.ts +40 -0
  379. package/dist/value-file.js +164 -0
  380. package/dist/version.d.ts +5 -0
  381. package/dist/version.js +14 -1
  382. package/package.json +18 -28
  383. package/dist/agent.d.ts +0 -106
  384. package/dist/agent.js +0 -21
  385. package/dist/channels/control.d.ts +0 -31
  386. package/dist/channels/control.js +0 -329
  387. package/dist/channels/define-channel.d.ts +0 -39
  388. package/dist/channels/define-channel.js +0 -9
  389. package/dist/channels/feishu/context-buffer.d.ts +0 -35
  390. package/dist/channels/feishu/context-buffer.js +0 -65
  391. package/dist/channels/feishu/scaffold/channel.websocket.ts +0 -31
  392. package/dist/channels/http.d.ts +0 -23
  393. package/dist/channels/http.js +0 -57
  394. package/dist/channels/lark/scaffold/channel.websocket.ts +0 -31
  395. package/dist/channels/slack/context-buffer.d.ts +0 -23
  396. package/dist/channels/slack/context-buffer.js +0 -37
  397. package/dist/channels/sse.d.ts +0 -4
  398. package/dist/channels/sse.js +0 -66
  399. package/dist/cli/commands/chat.d.ts +0 -3
  400. package/dist/cli/commands/chat.js +0 -14
  401. package/dist/cli/commands/routine-run.d.ts +0 -6
  402. package/dist/cli/commands/routine-run.js +0 -46
  403. package/dist/cli/commands/routine.d.ts +0 -25
  404. package/dist/cli/commands/routine.js +0 -122
  405. package/dist/cli/commands/tool.d.ts +0 -1
  406. package/dist/cli/commands/tool.js +0 -57
  407. package/dist/collect.d.ts +0 -63
  408. package/dist/collect.js +0 -90
  409. package/dist/core.d.ts +0 -13
  410. package/dist/core.js +0 -15
  411. package/dist/engines/pi/agent-models.d.ts +0 -83
  412. package/dist/engines/pi/agent-models.js +0 -120
  413. package/dist/engines/pi/agent-session-factory.d.ts +0 -121
  414. package/dist/engines/pi/agent-session-factory.js +0 -535
  415. package/dist/engines/pi/chat.d.ts +0 -3
  416. package/dist/engines/pi/chat.js +0 -8
  417. package/dist/engines/pi/config.d.ts +0 -71
  418. package/dist/engines/pi/config.js +0 -199
  419. package/dist/engines/pi/create.d.ts +0 -170
  420. package/dist/engines/pi/create.js +0 -343
  421. package/dist/engines/pi/definition.d.ts +0 -74
  422. package/dist/engines/pi/definition.js +0 -236
  423. package/dist/engines/pi/entry-images.d.ts +0 -14
  424. package/dist/engines/pi/entry-images.js +0 -23
  425. package/dist/engines/pi/invoke-session.d.ts +0 -18
  426. package/dist/engines/pi/invoke-session.js +0 -403
  427. package/dist/engines/pi/locked-file.d.ts +0 -9
  428. package/dist/engines/pi/login.js +0 -331
  429. package/dist/engines/pi/machine.d.ts +0 -53
  430. package/dist/engines/pi/machine.js +0 -137
  431. package/dist/engines/pi/models.d.ts +0 -200
  432. package/dist/engines/pi/models.js +0 -533
  433. package/dist/engines/pi/open.d.ts +0 -180
  434. package/dist/engines/pi/open.js +0 -270
  435. package/dist/engines/pi/openai-account-models.d.ts +0 -35
  436. package/dist/engines/pi/openai-account-models.js +0 -116
  437. package/dist/engines/pi/report.d.ts +0 -18
  438. package/dist/engines/pi/report.js +0 -59
  439. package/dist/engines/pi/retry-event.d.ts +0 -6
  440. package/dist/engines/pi/retry-event.js +0 -15
  441. package/dist/engines/pi/service.d.ts +0 -9
  442. package/dist/engines/pi/service.js +0 -14
  443. package/dist/engines/pi/session-builder.d.ts +0 -13
  444. package/dist/engines/pi/session-builder.js +0 -117
  445. package/dist/engines/pi/session-control.d.ts +0 -77
  446. package/dist/engines/pi/session-control.js +0 -908
  447. package/dist/engines/pi/session-effects.d.ts +0 -14
  448. package/dist/engines/pi/session-effects.js +0 -30
  449. package/dist/engines/pi/session-inheritance.d.ts +0 -21
  450. package/dist/engines/pi/session-inheritance.js +0 -204
  451. package/dist/engines/pi/session-markers.d.ts +0 -49
  452. package/dist/engines/pi/session-markers.js +0 -60
  453. package/dist/engines/pi/session-settings.d.ts +0 -67
  454. package/dist/engines/pi/session-settings.js +0 -119
  455. package/dist/engines/pi/session-store.d.ts +0 -69
  456. package/dist/engines/pi/session-store.js +0 -430
  457. package/dist/engines/pi/tool-context.d.ts +0 -45
  458. package/dist/engines/pi/tool-context.js +0 -31
  459. package/dist/engines/pi/tool.d.ts +0 -99
  460. package/dist/engines/pi/tool.js +0 -118
  461. package/dist/engines/pi/turn-kit.d.ts +0 -92
  462. package/dist/engines/pi/turn-kit.js +0 -288
  463. package/dist/engines/pi/wake-tool.d.ts +0 -9
  464. package/dist/engines/pi/wake-tool.js +0 -92
  465. package/dist/loader.d.ts +0 -41
  466. package/dist/loader.js +0 -116
  467. package/dist/node.d.ts +0 -3
  468. package/dist/node.js +0 -4
  469. package/dist/observe.d.ts +0 -6
  470. package/dist/observe.js +0 -47
  471. package/dist/pi.d.ts +0 -25
  472. package/dist/pi.js +0 -15
  473. package/dist/scaffold/templates/APPEND_SYSTEM.md +0 -12
  474. package/dist/scaffold/templates/tools/fetch-url.ts +0 -25
  475. package/dist/schedule/discover.d.ts +0 -17
  476. package/dist/schedule/discover.js +0 -61
  477. package/dist/schedule/routine.d.ts +0 -43
  478. package/dist/schedule/routine.js +0 -32
  479. package/dist/schedule/run.d.ts +0 -55
  480. package/dist/schedule/run.js +0 -146
  481. package/dist/secrets-gate.d.ts +0 -32
  482. package/dist/secrets-gate.js +0 -33
  483. package/dist/session-remote.d.ts +0 -47
  484. package/dist/session-remote.js +0 -460
  485. package/dist/session.d.ts +0 -466
  486. package/dist/session.js +0 -57
  487. /package/dist/{channels/kit/state.d.ts → state-file.d.ts} +0 -0
@@ -26,7 +26,7 @@ const API_TIMEOUT_MS = 30_000;
26
26
  const DOWNLOAD_TIMEOUT_MS = 120_000;
27
27
  /** How many rate-limit rejects one call absorbs before giving up. */
28
28
  const RETRIES = 3;
29
- /** Download sanity cap; a larger resource is rejected visibly (the engine resizes vision images
29
+ /** Download sanity cap; a larger resource is rejected visibly (the harness resizes vision images
30
30
  * anyway, so this is a transport guard, not a model limit). */
31
31
  const MAX_DOWNLOAD_BYTES = 20 * 1024 * 1024;
32
32
  /** Refresh the cached tenant token this long before its stated expiry. */
@@ -75,6 +75,11 @@ export function isTransientFeishuRegistrationError(e) {
75
75
  }
76
76
  /** Sleep on the GLOBAL timer (not `node:timers/promises`) so tests can drive it with fake timers. */
77
77
  const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
78
+ /**
79
+ * How many pages of 100 a member-name read walks before giving up: each page is a serial round trip on a turn's path,
80
+ * so a chat of thousands is named up to here and the rest is said, not waited for.
81
+ */
82
+ const MEMBER_PAGES = 10;
78
83
  /** The platform caps a text-message request body at 150 KB; stay well under it (the content is a JSON
79
84
  * envelope around the text, and multi-byte characters inflate the byte count). */
80
85
  const FEISHU_MAX_TEXT_BYTES = 100 * 1024;
@@ -188,155 +193,193 @@ export function createFeishuApi(opts) {
188
193
  throw new FeishuApiError(kind, label, res.status, code, `${data.msg ?? "response was not the expected JSON"}${exhausted}`);
189
194
  }
190
195
  };
191
- const api = {
192
- async verifyCredentials() {
193
- await tenantToken();
194
- },
195
- async botInfo() {
196
- // bot/v3/info answers at the TOP LEVEL (`bot`), not under `data` — an older API family.
197
- const data = await call("botInfo", "GET", "/open-apis/bot/v3/info");
198
- return { openId: data.bot?.open_id, appName: data.bot?.app_name };
199
- },
200
- async sendMessage(chatId, msgType, content) {
201
- const data = await call("sendMessage", "POST", "/open-apis/im/v1/messages?receive_id_type=chat_id", { receive_id: chatId, msg_type: msgType, content });
202
- return data.data?.message_id;
203
- },
204
- async replyMessage(messageId, msgType, content, opts2) {
205
- const data = await call("replyMessage", "POST", `/open-apis/im/v1/messages/${encodeURIComponent(messageId)}/reply`, { msg_type: msgType, content, ...(opts2?.replyInThread ? { reply_in_thread: true } : {}) });
206
- return data.data?.message_id;
207
- },
208
- async sendText(target, text) {
209
- const chunks = chunkFeishuText(text);
210
- let firstId;
211
- let first = true;
212
- for (const chunk of chunks) {
213
- const content = JSON.stringify({ text: chunk });
214
- // A normal group quote-replies only the first chunk — N reply-quotes would be noise. A thread
215
- // must reply_in_thread on EVERY chunk; a plain chat send would leak continuations to main chat.
216
- const reply = target.replyTo !== undefined && (first || target.replyInThread === true);
217
- const id = reply
218
- ? await api.replyMessage(target.replyTo, "text", content, {
219
- replyInThread: target.replyInThread,
220
- })
221
- : await api.sendMessage(target.chatId, "text", content);
222
- if (first)
223
- firstId = id;
224
- first = false;
225
- }
226
- return firstId;
227
- },
228
- async editTextMessage(messageId, text) {
229
- await call("editTextMessage", "PUT", `/open-apis/im/v1/messages/${encodeURIComponent(messageId)}`, {
230
- msg_type: "text",
231
- content: JSON.stringify({ text }),
232
- });
233
- },
234
- async deleteMessage(messageId) {
235
- await call("deleteMessage", "DELETE", `/open-apis/im/v1/messages/${encodeURIComponent(messageId)}`);
236
- },
237
- async getMessage(messageId) {
238
- const data = await call("getMessage", "GET",
239
- // Pin the id type: callers match mentions/sender against open_ids, so the response's id shape
240
- // must not depend on the platform's default staying open_id.
241
- `/open-apis/im/v1/messages/${encodeURIComponent(messageId)}?user_id_type=open_id`);
242
- return data.data?.items?.[0];
243
- },
244
- async downloadResource(messageId, fileKey, type) {
245
- // The byte download is the one non-JSON call, so it cannot ride the pipeline — same token +
246
- // timeout + naming discipline, applied here once.
247
- const label = "downloadResource";
248
- const token = await tenantToken();
249
- let res;
250
- let buf;
251
- let errBody;
252
- try {
253
- res = await fetch(`${baseUrl}/open-apis/im/v1/messages/${encodeURIComponent(messageId)}/resources/${encodeURIComponent(fileKey)}?type=${type}`, { headers: { authorization: `Bearer ${token}` }, signal: AbortSignal.timeout(DOWNLOAD_TIMEOUT_MS) });
254
- buf = res.ok ? await res.arrayBuffer() : undefined;
255
- errBody = res.ok ? undefined : await res.text(); // the error body self-describes (expired key etc.)
256
- }
257
- catch (e) {
258
- throw new FeishuApiError(kind, label, 0, 0, String(e), { cause: e });
259
- }
260
- if (!res.ok || buf === undefined) {
261
- let description;
262
- let code = 0;
196
+ return client(undefined);
197
+ function client(onSent) {
198
+ /** Every created message passes here, so `onSent` cannot miss one (sendText's chunks ride send/reply). */
199
+ const sent = (messageId) => {
200
+ if (messageId !== undefined)
201
+ onSent?.(messageId);
202
+ return messageId;
203
+ };
204
+ const api = {
205
+ recordingSends: (record) => client(record),
206
+ async verifyCredentials() {
207
+ await tenantToken();
208
+ },
209
+ async botInfo() {
210
+ // bot/v3/info answers at the TOP LEVEL (`bot`), not under `data` — an older API family.
211
+ const data = await call("botInfo", "GET", "/open-apis/bot/v3/info");
212
+ return { openId: data.bot?.open_id, appName: data.bot?.app_name };
213
+ },
214
+ async sendMessage(chatId, msgType, content) {
215
+ const data = await call("sendMessage", "POST", "/open-apis/im/v1/messages?receive_id_type=chat_id", { receive_id: chatId, msg_type: msgType, content });
216
+ return sent(data.data?.message_id);
217
+ },
218
+ async replyMessage(messageId, msgType, content, opts2) {
219
+ const data = await call("replyMessage", "POST", `/open-apis/im/v1/messages/${encodeURIComponent(messageId)}/reply`, { msg_type: msgType, content, ...(opts2?.replyInThread ? { reply_in_thread: true } : {}) });
220
+ return sent(data.data?.message_id);
221
+ },
222
+ async listMessages(container, pageSize, endTime, opts) {
223
+ const query = new URLSearchParams({
224
+ container_id_type: container.type,
225
+ container_id: container.id,
226
+ sort_type: "ByCreateTimeDesc",
227
+ page_size: String(pageSize),
228
+ user_id_type: "open_id",
229
+ // A Card 2.0 (every streamed answer, a feishu-send digest) otherwise reads as "please upgrade the client".
230
+ card_msg_content_type: "user_card_content",
231
+ });
232
+ if (endTime !== undefined)
233
+ query.set("end_time", String(endTime));
234
+ const data = await call("listMessages", "GET", `/open-apis/im/v1/messages?${query}`, undefined, opts);
235
+ return { items: data.data?.items ?? [], hasMore: data.data?.has_more === true };
236
+ },
237
+ async chatMemberNames(chatId, wanted, opts) {
238
+ const names = new Map();
239
+ let pageToken;
240
+ for (let page = 0; page < MEMBER_PAGES; page++) {
241
+ const query = new URLSearchParams({ member_id_type: "open_id", page_size: "100" });
242
+ if (pageToken)
243
+ query.set("page_token", pageToken);
244
+ const data = await call("chatMemberNames", "GET", `/open-apis/im/v1/chats/${encodeURIComponent(chatId)}/members?${query}`, undefined, opts);
245
+ for (const member of data.data?.items ?? []) {
246
+ if (member.member_id && member.name && wanted.has(member.member_id))
247
+ names.set(member.member_id, member.name);
248
+ }
249
+ if (data.data?.has_more !== true || !data.data.page_token)
250
+ return { names, complete: true };
251
+ if (names.size === wanted.size)
252
+ return { names, complete: false };
253
+ pageToken = data.data.page_token;
254
+ }
255
+ return { names, complete: false };
256
+ },
257
+ async sendText(target, text) {
258
+ const chunks = chunkFeishuText(text);
259
+ let firstId;
260
+ let first = true;
261
+ for (const chunk of chunks) {
262
+ const content = JSON.stringify({ text: chunk });
263
+ // A normal group quote-replies only the first chunk — N reply-quotes would be noise. A thread
264
+ // must reply_in_thread on EVERY chunk; a plain chat send would leak continuations to main chat.
265
+ const reply = target.replyTo !== undefined && (first || target.replyInThread === true);
266
+ const id = reply
267
+ ? await api.replyMessage(target.replyTo, "text", content, {
268
+ replyInThread: target.replyInThread,
269
+ })
270
+ : await api.sendMessage(target.chatId, "text", content);
271
+ if (first)
272
+ firstId = id;
273
+ first = false;
274
+ }
275
+ return firstId;
276
+ },
277
+ async editTextMessage(messageId, text) {
278
+ await call("editTextMessage", "PUT", `/open-apis/im/v1/messages/${encodeURIComponent(messageId)}`, {
279
+ msg_type: "text",
280
+ content: JSON.stringify({ text }),
281
+ });
282
+ },
283
+ async deleteMessage(messageId) {
284
+ await call("deleteMessage", "DELETE", `/open-apis/im/v1/messages/${encodeURIComponent(messageId)}`);
285
+ },
286
+ async getMessage(messageId) {
287
+ const data = await call("getMessage", "GET",
288
+ // Pin the id type: callers match mentions/sender against open_ids, so the response's id shape
289
+ // must not depend on the platform's default staying open_id. And ask for a card as it was SENT:
290
+ // by default a Card 2.0 message (every answer this channel streams) comes back as the
291
+ // placeholder "please upgrade the client to view this", so a quoted answer was unreadable.
292
+ `/open-apis/im/v1/messages/${encodeURIComponent(messageId)}?user_id_type=open_id&card_msg_content_type=user_card_content`);
293
+ return data.data?.items?.[0];
294
+ },
295
+ async downloadResource(messageId, fileKey, type) {
296
+ // The byte download is the one non-JSON call, so it cannot ride the pipeline — same token +
297
+ // timeout + naming discipline, applied here once.
298
+ const label = "downloadResource";
299
+ const token = await tenantToken();
300
+ let res;
301
+ let buf;
302
+ let errBody;
263
303
  try {
264
- const parsed = JSON.parse(errBody ?? "");
265
- description = parsed.msg;
266
- code = parsed.code ?? 0;
304
+ res = await fetch(`${baseUrl}/open-apis/im/v1/messages/${encodeURIComponent(messageId)}/resources/${encodeURIComponent(fileKey)}?type=${type}`, { headers: { authorization: `Bearer ${token}` }, signal: AbortSignal.timeout(DOWNLOAD_TIMEOUT_MS) });
305
+ buf = res.ok ? await res.arrayBuffer() : undefined;
306
+ errBody = res.ok ? undefined : await res.text(); // the error body self-describes (expired key etc.)
267
307
  }
268
- catch {
269
- /* non-JSON error body — fall through to the generic description */
308
+ catch (e) {
309
+ throw new FeishuApiError(kind, label, 0, 0, String(e), { cause: e });
270
310
  }
271
- throw new FeishuApiError(kind, label, res.status, code, description ?? "response was not the expected bytes");
272
- }
273
- const bytes = Buffer.from(buf);
274
- if (bytes.byteLength > MAX_DOWNLOAD_BYTES)
275
- throw new Error("resource is too large (max 20 MB)");
276
- return { bytes, contentType: res.headers.get("content-type") ?? undefined };
277
- },
278
- async fetchImage(messageId, fileKey) {
279
- const { bytes, contentType } = await api.downloadResource(messageId, fileKey, "image");
280
- const mime = contentType?.split(";")[0]?.trim();
281
- return { mimeType: mime?.startsWith("image/") ? mime : "image/jpeg", data: bytes.toString("base64") };
282
- },
283
- async fetchFile(messageId, fileKey, name, chatId, filesDir) {
284
- const { bytes } = await api.downloadResource(messageId, fileKey, "file");
285
- const dest = attachmentPath(filesDir, chatId, name);
286
- await mkdir(dest.dir, { recursive: true });
287
- await writeFile(dest.path, bytes);
288
- return { path: dest.path, name: dest.name, size: bytes.byteLength };
289
- },
290
- async getAppConfig(appId) {
291
- // v6 app detail — the one read surface that returns the event-security material (under data.app).
292
- const data = await call("getAppConfig", "GET", `/open-apis/application/v6/applications/${encodeURIComponent(appId)}?lang=zh_cn`);
293
- return {
294
- verificationToken: data.data?.app?.encryption?.verification_token,
295
- encryptionKey: data.data?.app?.encryption?.encryption_key,
296
- };
297
- },
298
- async listAppScopes() {
299
- const data = await call("listAppScopes", "GET", "/open-apis/application/v6/scopes");
300
- return (data.data?.scopes ?? []).flatMap((scope) => {
301
- if (typeof scope.scope_name !== "string" || typeof scope.grant_status !== "number")
302
- return [];
303
- const type = scope.scope_type === "user" || scope.scope_type === "tenant" ? scope.scope_type : undefined;
304
- return [{ name: scope.scope_name, grantStatus: scope.grant_status, type }];
305
- });
306
- },
307
- async addAppScopes(appId, scopeNames) {
308
- if (scopeNames.length === 0)
309
- return;
310
- await call("addAppScopes", "PATCH", `/open-apis/application/v7/applications/${encodeURIComponent(appId)}/config`, {
311
- scope: {
312
- add_scopes: scopeNames.map((scopeName) => ({ scope_name: scopeName, token_type: "tenant" })),
313
- },
314
- });
315
- },
316
- async updateEventSubscription(appId, cfg) {
317
- await call("updateEventSubscription", "PATCH", `/open-apis/application/v7/applications/${encodeURIComponent(appId)}/config`, {
318
- event: { subscription_type: cfg.subscriptionType, request_url: cfg.requestUrl },
319
- });
320
- },
321
- async createCard(cardJson) {
322
- const data = await call("createCard", "POST", "/open-apis/cardkit/v1/cards", {
323
- type: "card_json",
324
- data: cardJson,
325
- });
326
- const id = data.data?.card_id;
327
- if (!id)
328
- throw new FeishuApiError(kind, "createCard", 200, 0, "response carried no card_id");
329
- return id;
330
- },
331
- async updateCardElement(cardId, elementId, content, sequence, opts) {
332
- await call("updateCardElement", "PUT", `/open-apis/cardkit/v1/cards/${encodeURIComponent(cardId)}/elements/${encodeURIComponent(elementId)}/content`, { content, sequence }, opts);
333
- },
334
- async updateCard(cardId, cardJson, sequence) {
335
- await call("updateCard", "PUT", `/open-apis/cardkit/v1/cards/${encodeURIComponent(cardId)}`, {
336
- card: { type: "card_json", data: cardJson },
337
- sequence,
338
- });
339
- },
340
- };
341
- return api;
311
+ if (!res.ok || buf === undefined) {
312
+ let description;
313
+ let code = 0;
314
+ try {
315
+ const parsed = JSON.parse(errBody ?? "");
316
+ description = parsed.msg;
317
+ code = parsed.code ?? 0;
318
+ }
319
+ catch {
320
+ /* non-JSON error body — fall through to the generic description */
321
+ }
322
+ throw new FeishuApiError(kind, label, res.status, code, description ?? "response was not the expected bytes");
323
+ }
324
+ const bytes = Buffer.from(buf);
325
+ if (bytes.byteLength > MAX_DOWNLOAD_BYTES)
326
+ throw new Error("resource is too large (max 20 MB)");
327
+ return { bytes, contentType: res.headers.get("content-type") ?? undefined };
328
+ },
329
+ async fetchImage(messageId, fileKey) {
330
+ const { bytes, contentType } = await api.downloadResource(messageId, fileKey, "image");
331
+ const mime = contentType?.split(";")[0]?.trim();
332
+ return { mimeType: mime?.startsWith("image/") ? mime : "image/jpeg", data: bytes.toString("base64") };
333
+ },
334
+ async fetchFile(messageId, fileKey, name, chatId, filesDir) {
335
+ const { bytes } = await api.downloadResource(messageId, fileKey, "file");
336
+ const dest = attachmentPath(filesDir, chatId, name);
337
+ await mkdir(dest.dir, { recursive: true });
338
+ await writeFile(dest.path, bytes);
339
+ return { path: dest.path, name: dest.name, size: bytes.byteLength };
340
+ },
341
+ async getAppConfig(appId) {
342
+ // v6 app detail — the one read surface that returns the event-security material (under data.app).
343
+ const data = await call("getAppConfig", "GET", `/open-apis/application/v6/applications/${encodeURIComponent(appId)}?lang=zh_cn`);
344
+ return {
345
+ verificationToken: data.data?.app?.encryption?.verification_token,
346
+ encryptionKey: data.data?.app?.encryption?.encryption_key,
347
+ };
348
+ },
349
+ async listAppScopes() {
350
+ const data = await call("listAppScopes", "GET", "/open-apis/application/v6/scopes");
351
+ return (data.data?.scopes ?? []).flatMap((scope) => {
352
+ if (typeof scope.scope_name !== "string" || typeof scope.grant_status !== "number")
353
+ return [];
354
+ const type = scope.scope_type === "user" || scope.scope_type === "tenant" ? scope.scope_type : undefined;
355
+ return [{ name: scope.scope_name, grantStatus: scope.grant_status, type }];
356
+ });
357
+ },
358
+ async updateEventSubscription(appId, cfg) {
359
+ await call("updateEventSubscription", "PATCH", `/open-apis/application/v7/applications/${encodeURIComponent(appId)}/config`, {
360
+ event: { subscription_type: cfg.subscriptionType, request_url: cfg.requestUrl },
361
+ });
362
+ },
363
+ async createCard(cardJson) {
364
+ const data = await call("createCard", "POST", "/open-apis/cardkit/v1/cards", {
365
+ type: "card_json",
366
+ data: cardJson,
367
+ });
368
+ const id = data.data?.card_id;
369
+ if (!id)
370
+ throw new FeishuApiError(kind, "createCard", 200, 0, "response carried no card_id");
371
+ return id;
372
+ },
373
+ async updateCardElement(cardId, elementId, content, sequence, opts) {
374
+ await call("updateCardElement", "PUT", `/open-apis/cardkit/v1/cards/${encodeURIComponent(cardId)}/elements/${encodeURIComponent(elementId)}/content`, { content, sequence }, opts);
375
+ },
376
+ async updateCard(cardId, cardJson, sequence) {
377
+ await call("updateCard", "PUT", `/open-apis/cardkit/v1/cards/${encodeURIComponent(cardId)}`, {
378
+ card: { type: "card_json", data: cardJson },
379
+ sequence,
380
+ });
381
+ },
382
+ };
383
+ return api;
384
+ }
342
385
  }
@@ -1,5 +1,6 @@
1
1
  import type { ChannelModule, LongConnectionChannelModule } from "../../channel.ts";
2
2
  import { type FeishuCloudProfile } from "./cloud.ts";
3
+ import { type FeishuSubscriptionMode } from "./setup-mode.ts";
3
4
  import { type FeishuMessage, type FeishuMessageEvent, type FeishuRoute, defaultFeishuRoute, feishuEnvelope } from "./parse.ts";
4
5
  import { type FeishuFailure } from "./preview.ts";
5
6
  import { connectFeishuWs } from "./ws-ingress.ts";
@@ -30,6 +31,8 @@ export type FeishuWebSocketChannelOptions = FeishuChannelBaseOptions & {
30
31
  };
31
32
  /** Build the canonical Feishu Request-URL webhook channel. */
32
33
  export declare function feishuChannel(opts: FeishuChannelOptions): ChannelModule;
34
+ /** How this process receives the Feishu channel: `FEISHU_INGRESS`, else WebSocket under `dev` and webhook otherwise. */
35
+ export declare function feishuIngress(): FeishuSubscriptionMode;
33
36
  /** Build the canonical Feishu WebSocket long-connection channel. */
34
37
  export declare function feishuWebSocketChannel(opts: FeishuWebSocketChannelOptions): LongConnectionChannelModule;
35
38
  /** Internal compatibility seams: protocol behavior comes from Feishu; the profile binds cloud edges. */