dsh-plugin-dev-kb 1.8.0 → 1.8.1

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 (229) hide show
  1. package/CHANGELOG.md +186 -178
  2. package/README.en.md +172 -172
  3. package/README.md +183 -183
  4. package/kb/INDEX.md +236 -234
  5. package/kb/README.md +88 -88
  6. package/kb/extra/AGENTS.md +77 -77
  7. package/kb/extra/deepseek-llm-api-wire-extensions.md +162 -162
  8. package/kb/extra/deepseek-llm-api-wire-extensions.zh.md +162 -162
  9. package/kb/extra/defensive-patterns/package-surface.md +233 -232
  10. package/kb/extra/defensive-patterns/package-surface.zh.md +233 -232
  11. package/kb/extra/defensive-patterns/remote-and-api.md +117 -117
  12. package/kb/extra/defensive-patterns/remote-and-api.zh.md +117 -117
  13. package/kb/extra/development.md +221 -221
  14. package/kb/extra/development.zh.md +228 -228
  15. package/kb/extra/event-producer-consumer.md +133 -123
  16. package/kb/extra/event-producer-consumer.zh.md +135 -125
  17. package/kb/extra/module-graph.md +1961 -1888
  18. package/kb/extra/module-graph.zh.md +1963 -1890
  19. package/kb/extra/persistence-changes/2026-11-05-timeline-priority-notice.md +60 -0
  20. package/kb/extra/persistence-changes/2026-11-05-timeline-priority-notice.zh.md +60 -0
  21. package/kb/extra/persistence-changes/README.md +92 -92
  22. package/kb/extra/persistence-changes/README.zh.md +92 -92
  23. package/kb/extra/persistence-changes/historical-formats/README.md +75 -75
  24. package/kb/extra/persistence-changes/historical-formats/README.zh.md +75 -75
  25. package/kb/extra/persistence-changes/releases/README.md +103 -103
  26. package/kb/extra/persistence-changes/releases/README.zh.md +103 -103
  27. package/kb/extra/rescope.md +55 -55
  28. package/kb/extra/rescope.zh.md +55 -55
  29. package/kb/extra/subsystems/boot.md +631 -621
  30. package/kb/extra/subsystems/boot.zh.md +631 -621
  31. package/kb/extra/subsystems/computer-use.md +179 -137
  32. package/kb/extra/subsystems/computer-use.zh.md +179 -137
  33. package/kb/extra/subsystems/extensions.md +387 -384
  34. package/kb/extra/subsystems/extensions.zh.md +387 -384
  35. package/kb/extra/subsystems/feedback.md +418 -400
  36. package/kb/extra/subsystems/feedback.zh.md +418 -400
  37. package/kb/extra/subsystems/forge.md +2169 -1226
  38. package/kb/extra/subsystems/forge.zh.md +2171 -1226
  39. package/kb/extra/subsystems/liveshare.md +167 -158
  40. package/kb/extra/subsystems/liveshare.zh.md +167 -158
  41. package/kb/extra/subsystems/mcp.md +237 -234
  42. package/kb/extra/subsystems/mcp.zh.md +237 -234
  43. package/kb/extra/subsystems/office-kit.md +122 -0
  44. package/kb/extra/subsystems/office-kit.zh.md +122 -0
  45. package/kb/extra/subsystems/working-directory.md +95 -64
  46. package/kb/extra/subsystems/working-directory.zh.md +95 -64
  47. package/kb/extra/subsystems/worktrees.md +187 -127
  48. package/kb/extra/subsystems/worktrees.zh.md +187 -127
  49. package/kb/extra/upgrade-guide/v0.2.1-alpha.1/python-ptc-sandbox/guide.md +21 -21
  50. package/kb/extra/upgrade-guide/v0.2.1-alpha.1/python-ptc-sandbox/guide.zh.md +21 -21
  51. package/kb/extra/upgrade-guide/v0.2.1-rc.4/sandbox-unsupported-policy-error/guide.md +18 -0
  52. package/kb/extra/upgrade-guide/v0.2.1-rc.4/sandbox-unsupported-policy-error/guide.zh.md +18 -0
  53. package/kb/extra/upgrade-guide/v0.2.2-alpha.2/llm-error-builtin-codes/guide.md +18 -0
  54. package/kb/extra/upgrade-guide/v0.2.2-alpha.2/llm-error-builtin-codes/guide.zh.md +18 -0
  55. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-kit-package/guide.md +34 -0
  56. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-kit-package/guide.zh.md +34 -0
  57. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-operation-tools/guide.md +49 -0
  58. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-operation-tools/guide.zh.md +49 -0
  59. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-skill-resources/guide.md +36 -0
  60. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-skill-resources/guide.zh.md +36 -0
  61. package/kb/extra/upgrade-guide/v0.2.2-rc.1/account-notification-fields/guide.md +26 -0
  62. package/kb/extra/upgrade-guide/v0.2.2-rc.1/account-notification-fields/guide.zh.md +26 -0
  63. package/kb/extra/upgrade-guide/v0.2.2-rc.1/account-remote-provider/guide.md +22 -0
  64. package/kb/extra/upgrade-guide/v0.2.2-rc.1/account-remote-provider/guide.zh.md +22 -0
  65. package/kb/extra/upgrade-guide/v0.2.2-rc.1/archive-worktrees/guide.md +21 -0
  66. package/kb/extra/upgrade-guide/v0.2.2-rc.1/archive-worktrees/guide.zh.md +21 -0
  67. package/kb/extra/upgrade-guide/v0.2.2-rc.1/attachment-error-codes/guide.md +23 -0
  68. package/kb/extra/upgrade-guide/v0.2.2-rc.1/attachment-error-codes/guide.zh.md +23 -0
  69. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-ax-read-limits/guide.md +20 -0
  70. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-ax-read-limits/guide.zh.md +20 -0
  71. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-hover-ax-only/guide.md +18 -0
  72. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-hover-ax-only/guide.zh.md +18 -0
  73. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-native-platform/guide.md +23 -0
  74. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-native-platform/guide.zh.md +23 -0
  75. package/kb/extra/upgrade-guide/v0.2.2-rc.1/dsh-doc-skill/guide.md +35 -0
  76. package/kb/extra/upgrade-guide/v0.2.2-rc.1/dsh-doc-skill/guide.zh.md +35 -0
  77. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-change-request-overview/guide.md +26 -0
  78. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-change-request-overview/guide.zh.md +26 -0
  79. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-pinned-diff/guide.md +26 -0
  80. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-pinned-diff/guide.zh.md +26 -0
  81. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-review-reads/guide.md +19 -0
  82. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-review-reads/guide.zh.md +19 -0
  83. package/kb/extra/upgrade-guide/v0.2.2-rc.1/package-export-cleanup/guide.md +26 -0
  84. package/kb/extra/upgrade-guide/v0.2.2-rc.1/package-export-cleanup/guide.zh.md +26 -0
  85. package/kb/extra/upgrade-guide/v0.2.2-rc.1/plugin-update-method/guide.md +22 -0
  86. package/kb/extra/upgrade-guide/v0.2.2-rc.1/plugin-update-method/guide.zh.md +22 -0
  87. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-bootstrap-protocol/guide.md +25 -0
  88. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-bootstrap-protocol/guide.zh.md +25 -0
  89. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-inspect-output/guide.md +48 -0
  90. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-inspect-output/guide.zh.md +48 -0
  91. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-scoped-repl-default/guide.md +45 -0
  92. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-scoped-repl-default/guide.zh.md +45 -0
  93. package/kb/extra/upgrade-guide/v0.2.2-rc.1/runtime-context-reminders/guide.md +19 -0
  94. package/kb/extra/upgrade-guide/v0.2.2-rc.1/runtime-context-reminders/guide.zh.md +19 -0
  95. package/kb/extra/upgrade-guide/v0.2.2-rc.1/session-append-overloads/guide.md +17 -0
  96. package/kb/extra/upgrade-guide/v0.2.2-rc.1/session-append-overloads/guide.zh.md +17 -0
  97. package/kb/extra/upgrade-guide/v0.2.2-rc.1/subagent-interrupt-default/guide.md +27 -0
  98. package/kb/extra/upgrade-guide/v0.2.2-rc.1/subagent-interrupt-default/guide.zh.md +27 -0
  99. package/kb/extra/upgrade-guide/v0.2.2-rc.1/terminal-backend-cleanup-error/guide.md +20 -0
  100. package/kb/extra/upgrade-guide/v0.2.2-rc.1/terminal-backend-cleanup-error/guide.zh.md +20 -0
  101. package/kb/extra/upgrade-guide/v0.2.2-rc.1/terminal-bundle-sidebar-backend/guide.md +19 -0
  102. package/kb/extra/upgrade-guide/v0.2.2-rc.1/terminal-bundle-sidebar-backend/guide.zh.md +19 -0
  103. package/kb/extra/upgrade-guide/v0.2.2-rc.1/web-fetch-transport-error-codes/guide.md +18 -0
  104. package/kb/extra/upgrade-guide/v0.2.2-rc.1/web-fetch-transport-error-codes/guide.zh.md +18 -0
  105. package/kb/extra/upgrade-guide/v0.2.2-rc.1/web-search-billing/guide.md +41 -0
  106. package/kb/extra/upgrade-guide/v0.2.2-rc.1/web-search-billing/guide.zh.md +41 -0
  107. package/kb/extra/upgrade-guide/v0.2.2-rc.1/window-drag-regions/guide.md +21 -0
  108. package/kb/extra/upgrade-guide/v0.2.2-rc.1/window-drag-regions/guide.zh.md +21 -0
  109. package/kb/extra/upgrade-guide/v0.2.2-rc.2/client-module-metadata/guide.md +29 -0
  110. package/kb/extra/upgrade-guide/v0.2.2-rc.2/client-module-metadata/guide.zh.md +29 -0
  111. package/kb/extra/upgrade-guide/v0.2.2-rc.2/connection-page-peer/guide.md +25 -0
  112. package/kb/extra/upgrade-guide/v0.2.2-rc.2/connection-page-peer/guide.zh.md +25 -0
  113. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cordis-root-and-intercept-metadata/guide.md +31 -0
  114. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cordis-root-and-intercept-metadata/guide.zh.md +31 -0
  115. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-agents-without-preset/guide.md +24 -0
  116. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-agents-without-preset/guide.zh.md +24 -0
  117. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-macos-provider/guide.md +24 -0
  118. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-macos-provider/guide.zh.md +24 -0
  119. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-partial-observations/guide.md +19 -0
  120. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-partial-observations/guide.zh.md +19 -0
  121. package/kb/extra/upgrade-guide/v0.2.2-rc.2/deepseek-files-timeout/guide.md +15 -0
  122. package/kb/extra/upgrade-guide/v0.2.2-rc.2/deepseek-files-timeout/guide.zh.md +15 -0
  123. package/kb/extra/upgrade-guide/v0.2.2-rc.2/experimental-tool-error-codes/guide.md +28 -0
  124. package/kb/extra/upgrade-guide/v0.2.2-rc.2/experimental-tool-error-codes/guide.zh.md +28 -0
  125. package/kb/extra/upgrade-guide/v0.2.2-rc.2/package-export-cleanup/guide.md +36 -0
  126. package/kb/extra/upgrade-guide/v0.2.2-rc.2/package-export-cleanup/guide.zh.md +36 -0
  127. package/kb/extra/upgrade-guide/v0.2.2-rc.2/python-ptc-removal/guide.md +22 -0
  128. package/kb/extra/upgrade-guide/v0.2.2-rc.2/python-ptc-removal/guide.zh.md +22 -0
  129. package/kb/extra/upgrade-guide/v0.2.2-rc.2/session-status-package/guide.md +31 -0
  130. package/kb/extra/upgrade-guide/v0.2.2-rc.2/session-status-package/guide.zh.md +31 -0
  131. package/kb/extra/upgrade-guide/v0.2.2-rc.2/shared-search-filter/guide.md +18 -0
  132. package/kb/extra/upgrade-guide/v0.2.2-rc.2/shared-search-filter/guide.zh.md +18 -0
  133. package/kb/extra/upgrade-guide/v0.2.2-rc.2/shell-fs-tool-error-codes/guide.md +30 -0
  134. package/kb/extra/upgrade-guide/v0.2.2-rc.2/shell-fs-tool-error-codes/guide.zh.md +30 -0
  135. package/kb/extra/web-styling.md +57 -57
  136. package/kb/extra/web-styling.zh.md +57 -57
  137. package/kb/meta/search-index.json +4508 -3980
  138. package/kb/meta/source.json +18 -18
  139. package/kb/site/develop/practice/llm-adapter.md +192 -192
  140. package/kb/site/en/develop/practice/llm-adapter.md +192 -192
  141. package/kb/site/en/guide/desktop-uninstall-cleanup.md +63 -0
  142. package/kb/site/en/guide/plugin-market.md +153 -151
  143. package/kb/site/en/guide/providers.md +234 -234
  144. package/kb/site/en/guide/quickstart.md +35 -34
  145. package/kb/site/en/reference/capability-seams.md +789 -767
  146. package/kb/site/en/reference/config-catalog.md +5432 -5128
  147. package/kb/site/en/reference/cookbook/adding-a-package.md +175 -175
  148. package/kb/site/en/reference/cookbook/adding-a-tool.md +105 -104
  149. package/kb/site/en/reference/cookbook/extension-cookbook.md +178 -135
  150. package/kb/site/en/reference/cordis-api/context.md +373 -369
  151. package/kb/site/en/reference/cordis-api/fiber.md +457 -433
  152. package/kb/site/en/reference/cordis-api/inherited.md +44 -44
  153. package/kb/site/en/reference/cordis-api/service.md +118 -107
  154. package/kb/site/en/reference/experimental-persistence-catalog.md +36 -23
  155. package/kb/site/en/reference/index.md +174 -174
  156. package/kb/site/en/reference/persistence-catalog.md +9453 -9432
  157. package/kb/site/en/reference/subsystems/compaction.md +288 -288
  158. package/kb/site/en/reference/subsystems/core.md +1172 -1171
  159. package/kb/site/en/reference/subsystems/credentials.md +526 -497
  160. package/kb/site/en/reference/subsystems/filesystem.md +708 -708
  161. package/kb/site/en/reference/subsystems/index.md +82 -82
  162. package/kb/site/en/reference/subsystems/llm-streaming.md +1290 -1288
  163. package/kb/site/en/reference/subsystems/lsp.md +230 -206
  164. package/kb/site/en/reference/subsystems/persistence.md +451 -432
  165. package/kb/site/en/reference/subsystems/plan.md +91 -91
  166. package/kb/site/en/reference/subsystems/ptc-runtime.md +295 -261
  167. package/kb/site/en/reference/subsystems/sandbox.md +250 -232
  168. package/kb/site/en/reference/subsystems/session-query.md +525 -515
  169. package/kb/site/en/reference/subsystems/session-reference.md +231 -229
  170. package/kb/site/en/reference/subsystems/session.md +1478 -1431
  171. package/kb/site/en/reference/subsystems/sidebar-right.md +165 -165
  172. package/kb/site/en/reference/subsystems/skills.md +356 -356
  173. package/kb/site/en/reference/subsystems/slots.md +235 -231
  174. package/kb/site/en/reference/subsystems/terminal.md +188 -188
  175. package/kb/site/en/reference/subsystems/tools.md +902 -891
  176. package/kb/site/en/reference/subsystems/user-questions.md +330 -327
  177. package/kb/site/en/reference/subsystems/web-client.md +161 -104
  178. package/kb/site/en/reference/subsystems/web-server.md +434 -351
  179. package/kb/site/en/reference/subsystems/web.md +268 -268
  180. package/kb/site/en/reference/subsystems/workflow.md +287 -282
  181. package/kb/site/en/reference/subsystems/workspace.md +743 -651
  182. package/kb/site/en/reference/tool-catalog.md +2867 -2704
  183. package/kb/site/guide/desktop-uninstall-cleanup.md +63 -0
  184. package/kb/site/guide/plugin-market.md +153 -151
  185. package/kb/site/guide/providers.md +234 -234
  186. package/kb/site/guide/quickstart.md +35 -34
  187. package/kb/site/reference/capability-seams.md +789 -767
  188. package/kb/site/reference/config-catalog.md +5432 -5128
  189. package/kb/site/reference/cookbook/adding-a-package.md +175 -175
  190. package/kb/site/reference/cookbook/adding-a-tool.md +107 -106
  191. package/kb/site/reference/cookbook/extension-cookbook.md +182 -139
  192. package/kb/site/reference/cordis-api/context.md +373 -369
  193. package/kb/site/reference/cordis-api/fiber.md +459 -435
  194. package/kb/site/reference/cordis-api/inherited.md +44 -44
  195. package/kb/site/reference/cordis-api/service.md +118 -107
  196. package/kb/site/reference/experimental-persistence-catalog.md +36 -23
  197. package/kb/site/reference/index.md +178 -178
  198. package/kb/site/reference/persistence-catalog.md +9453 -9432
  199. package/kb/site/reference/subsystems/compaction.md +288 -288
  200. package/kb/site/reference/subsystems/core.md +1184 -1183
  201. package/kb/site/reference/subsystems/credentials.md +526 -497
  202. package/kb/site/reference/subsystems/filesystem.md +708 -708
  203. package/kb/site/reference/subsystems/index.md +82 -82
  204. package/kb/site/reference/subsystems/llm-streaming.md +1296 -1294
  205. package/kb/site/reference/subsystems/lsp.md +230 -206
  206. package/kb/site/reference/subsystems/persistence.md +451 -432
  207. package/kb/site/reference/subsystems/plan.md +91 -91
  208. package/kb/site/reference/subsystems/ptc-runtime.md +295 -261
  209. package/kb/site/reference/subsystems/sandbox.md +250 -232
  210. package/kb/site/reference/subsystems/session-query.md +525 -515
  211. package/kb/site/reference/subsystems/session-reference.md +231 -229
  212. package/kb/site/reference/subsystems/session.md +1482 -1435
  213. package/kb/site/reference/subsystems/sidebar-right.md +165 -165
  214. package/kb/site/reference/subsystems/skills.md +356 -356
  215. package/kb/site/reference/subsystems/slots.md +239 -235
  216. package/kb/site/reference/subsystems/terminal.md +188 -188
  217. package/kb/site/reference/subsystems/tools.md +902 -891
  218. package/kb/site/reference/subsystems/user-questions.md +330 -327
  219. package/kb/site/reference/subsystems/web-client.md +161 -104
  220. package/kb/site/reference/subsystems/web-server.md +434 -351
  221. package/kb/site/reference/subsystems/web.md +268 -268
  222. package/kb/site/reference/subsystems/workflow.md +287 -282
  223. package/kb/site/reference/subsystems/workspace.md +743 -651
  224. package/kb/site/reference/tool-catalog.md +2872 -2709
  225. package/lib/index.js +359 -359
  226. package/package.json +68 -68
  227. package/skills/dsh-plugin-dev-kb.md +71 -70
  228. package/kb/extra/subsystems/office-to-pdf.md +0 -87
  229. package/kb/extra/subsystems/office-to-pdf.zh.md +0 -87
@@ -1,188 +1,188 @@
1
- ---
2
- editSource: "docs/subsystems/terminal.md"
3
- rawMarkdownPath: "en/reference/subsystems/terminal.md"
4
- outline: [2,3]
5
- ---
6
-
7
- # Persistent PTY Sessions
8
-
9
- Types shared by PTY backends, `ctx.terminals`, and the model-facing consumer. The [persistent PTY Agent Note](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/feature/2026-07-16-persistent-pty-sessions.md) owns the rationale; this page records the cross-package vocabulary from [`packages/terminal/terminal/src/types.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/terminal/terminal/src/types.ts).
10
-
11
- ## Identity and readiness
12
-
13
- `TerminalSessionId` is a service-minted branded id. Optional names are owner-local display metadata; authorization compares the exact owning `Agent`, not a name or guessed id.
14
-
15
- `TerminalWaitReason` says why one send returned. It is independent from `TerminalSessionStatus`: silence or timeout may return while the top-level shell remains alive, while `session_exit` means that shell exited rather than an arbitrary foreground child.
16
-
17
- ```ts type-equiv
18
- /** Why one interactive send returned control to its caller. */
19
- type TerminalWaitReason = 'stdin_read' | 'inferred_idle' | 'timeout' | 'session_exit'
20
- ```
21
-
22
- ```ts type-equiv
23
- /** Top-level PTY process status, independent of a send's wait reason. */
24
- type TerminalSessionStatus =
25
- | { kind: 'running' }
26
- | { kind: 'exited'; exitCode: number | null; signal: NodeJS.Signals | null }
27
- ```
28
-
29
- ## Backend and live session
30
-
31
- A backend owns how one registered type starts and detects readiness. `TerminalSessionService` publishes the returned session only after setup succeeds, then owns id authorization and cleanup. A backend that cannot clean partial startup resources rejects with `TerminalBackendCleanupError`, allowing disposal to retain the cleanup failure without replacing the caller's cancellation reason. A backend session owns terminal state and captured-resource quiescence.
32
-
33
- ```ts type-equiv
34
- /** Replaceable provider for one PTY session type. */
35
- interface TerminalBackend {
36
- /** Stable type selected by {@link TerminalSpawnRequest.type}. */
37
- readonly type: string
38
- /** Create an unpublished session or reject after cleaning partial resources; cleanup failure uses {@link TerminalBackendCleanupError}. */
39
- spawn(spec: TerminalBackendSpawnSpec): Promise<TerminalBackendSession>
40
- }
41
- ```
42
-
43
- ```ts type-equiv
44
- /** Backend-owned live session retained by {@link TerminalSessionService}. */
45
- interface TerminalBackendSession {
46
- /** Initial bounded terminal output returned from `terminal_open`. */
47
- readonly motd: string
48
- /** Top-level process id when one exists. */
49
- readonly pid?: number
50
- /** Start one exclusive send operation. */
51
- startSend(request: TerminalSendRequest): TerminalSendOperation
52
- /** Read one bounded page from retained scrollback. */
53
- read(request: TerminalReadRequest): TerminalReadResult
54
- /** Signal the verified foreground process group. */
55
- signal(signal: TerminalSignal): Promise<TerminalSignalResult>
56
- /** Observe top-level process status. */
57
- status(): TerminalSessionStatus
58
- /** Idempotently close the captured owned process tree and await quiescence. */
59
- close(reason: string): Promise<void>
60
- }
61
- ```
62
-
63
- ## Send and retained output
64
-
65
- One live session accepts one active send. Its operation exposes a consuming output cursor for generic background jobs and one terminal result for a foreground caller. `TerminalReadResult` separately pages the bounded session scrollback.
66
-
67
- ```ts type-equiv
68
- /** Live backend-owned send; exactly one may be active per PTY session. */
69
- interface TerminalSendOperation {
70
- /** Resolves after readiness, timeout, cancellation, or top-level process exit. */
71
- done: Promise<TerminalSendResult>
72
- /** Consume output produced since the prior call. */
73
- readOutput(): TerminalSendRead
74
- /** Request `SIGINT`; returns false after the operation settled. */
75
- cancel(): boolean
76
- }
77
- ```
78
-
79
- ```ts type-equiv
80
- /** Settled result for one foreground or background send. */
81
- interface TerminalSendResult {
82
- /** Bounded rendered terminal delta remaining at settlement. */
83
- viewport: string
84
- /** Why the wait returned; this does not imply arbitrary child-process exit. */
85
- waitReason: TerminalWaitReason
86
- /** Top-level session status observed at settlement. */
87
- sessionStatus: TerminalSessionStatus
88
- /** Whether output was dropped from the operation or retained scrollback. */
89
- truncated: boolean
90
- }
91
- ```
92
-
93
- ## Ownership and durability
94
-
95
- `TerminalSessionService` attaches one awaited cleanup to the exact owner scope, rejects foreign operations, and keeps sessions alive across backend or tool-plugin reload. PTY state and raw bytes remain process-local. Model input and bounded returned output are durable through the existing `tool/call`, `tool/result`, and task-result paths rather than duplicate PTY session events.
96
-
97
- <!-- BEGIN GENERATED cordis-surface (gen-cordis-catalog.ts) — do not edit between markers -->
98
-
99
- <a id="cordis-surface"></a>
100
-
101
- ## Cordis API
102
-
103
- Generated from source by `scripts/gen-cordis-catalog.ts` (verified fresh by `pnpm run verify-cordis-catalog` in doc-sync; regenerate with `pnpm run gen-cordis-catalog`) — the language sides differ only in locale-specific paired document paths. Signature blocks use a `ts cordis-catalog` fence and keep the original source JSDoc; dispatch modes are defined in the [primer](../cordis-primer.md#dispatch-modes), and the framework-inherited `ctx` API lives in [cordis-api/inherited.md](../cordis-api/inherited.md).
104
-
105
- <a id="ctxterminals--terminalsessionservice"></a>
106
-
107
- ### `ctx.terminals` — `TerminalSessionService`
108
-
109
- In-process registry for replaceable PTY backends and exact-Agent sessions.
110
-
111
- ```ts cordis-catalog
112
- /**
113
- * Register one backend type for this effect scope.
114
- * @param backend - provider with a non-empty unique type.
115
- * @returns disposer that removes exactly this contribution.
116
- */
117
- registerBackend(backend: TerminalBackend): () => void
118
-
119
- /**
120
- * List registered backend types in registration order.
121
- * @returns fresh backend type names.
122
- */
123
- listBackends(): string[]
124
-
125
- /**
126
- * Create and publish one owner-scoped session after backend setup succeeds.
127
- * @param owner - exact registered Agent that owns access and cleanup.
128
- * @param request - backend type plus optional owner-local name and cwd.
129
- * @param signal - cancellation of unpublished setup.
130
- * @returns published identity, metadata, status, and MOTD.
131
- */
132
- async spawn(owner: Agent, request: TerminalSpawnRequest, signal?: AbortSignal): Promise<TerminalSpawnResult>
133
-
134
- /**
135
- * Test whether an exact owner has a published session or unpublished spawn.
136
- * @param owner - exact live owner to inspect.
137
- * @returns true across the entire spawn-to-close interval, with no publication gap.
138
- */
139
- hasOwnerActivity(owner: Agent): boolean
140
-
141
- /**
142
- * Start one exclusive interactive send.
143
- * @param owner - exact session owner.
144
- * @param id - target PTY identity.
145
- * @param request - explicit text, submit behavior, and cancellation.
146
- * @returns live operation handle for foreground await or task registration.
147
- */
148
- startSend(owner: Agent, id: TerminalSessionId, request: TerminalSendRequest): TerminalSendOperation
149
-
150
- /**
151
- * Read one bounded scrollback page from an owned session.
152
- * @param owner - exact session owner.
153
- * @param id - target PTY identity.
154
- * @param request - optional newest-relative offset and line count.
155
- * @returns bounded retained text and pagination metadata.
156
- */
157
- read(owner: Agent, id: TerminalSessionId, request: TerminalReadRequest = {}): TerminalReadResult
158
-
159
- /**
160
- * Deliver an allowed signal through an owned backend session.
161
- * @param owner - exact session owner.
162
- * @param id - target PTY identity.
163
- * @param signal - allowed POSIX signal name.
164
- * @returns delivered foreground process-group identity.
165
- */
166
- signal(owner: Agent, id: TerminalSessionId, signal: TerminalSignal): Promise<TerminalSignalResult>
167
-
168
- /**
169
- * Close one owned session and remove it only after quiescent backend cleanup.
170
- * @param owner - exact session owner.
171
- * @param id - target PTY identity.
172
- * @param reason - diagnostic cleanup reason.
173
- * @returns true for a newly closed session, false when the same close is already in flight.
174
- */
175
- async kill(owner: Agent, id: TerminalSessionId, reason: string = 'model request'): Promise<boolean>
176
-
177
- /**
178
- * List fresh snapshots for exactly one owner.
179
- * @param owner - exact owner whose sessions are visible.
180
- * @returns owner-visible snapshots in publication order.
181
- */
182
- list(owner: Agent): TerminalSessionSnapshot[]
183
- ```
184
-
185
- Types: [Agent](./core.md)
186
-
187
- Source: [`packages/terminal/terminal/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/terminal/terminal/src/index.ts)
188
- <!-- END GENERATED cordis-surface -->
1
+ ---
2
+ editSource: "docs/subsystems/terminal.md"
3
+ rawMarkdownPath: "en/reference/subsystems/terminal.md"
4
+ outline: [2,3]
5
+ ---
6
+
7
+ # Persistent PTY Sessions
8
+
9
+ Types shared by PTY backends, `ctx.terminals`, and the model-facing consumer. The [persistent PTY Agent Note](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/feature/2026-07-16-persistent-pty-sessions.md) owns the rationale; this page records the cross-package vocabulary from [`packages/terminal/terminal/src/types.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/terminal/terminal/src/types.ts).
10
+
11
+ ## Identity and readiness
12
+
13
+ `TerminalSessionId` is a service-minted branded id. Optional names are owner-local display metadata; authorization compares the exact owning `Agent`, not a name or guessed id.
14
+
15
+ `TerminalWaitReason` says why one send returned. It is independent from `TerminalSessionStatus`: silence or timeout may return while the top-level shell remains alive, while `session_exit` means that shell exited rather than an arbitrary foreground child.
16
+
17
+ ```ts type-equiv
18
+ /** Why one interactive send returned control to its caller. */
19
+ type TerminalWaitReason = 'stdin_read' | 'inferred_idle' | 'timeout' | 'session_exit'
20
+ ```
21
+
22
+ ```ts type-equiv
23
+ /** Top-level PTY process status, independent of a send's wait reason. */
24
+ type TerminalSessionStatus =
25
+ | { kind: 'running' }
26
+ | { kind: 'exited'; exitCode: number | null; signal: NodeJS.Signals | null }
27
+ ```
28
+
29
+ ## Backend and live session
30
+
31
+ A backend owns how one registered type starts and detects readiness. `TerminalSessionService` publishes the returned session only after setup succeeds, then owns id authorization and cleanup. A backend that cannot clean partial startup resources rejects with `TerminalBackendCleanupError`, allowing disposal to retain the cleanup failure without replacing the caller's cancellation reason. A backend session owns terminal state and captured-resource quiescence.
32
+
33
+ ```ts type-equiv
34
+ /** Replaceable provider for one PTY session type. */
35
+ interface TerminalBackend {
36
+ /** Stable type selected by {@link TerminalSpawnRequest.type}. */
37
+ readonly type: string
38
+ /** Create an unpublished session or reject after cleaning partial resources; cleanup failure uses `TerminalBackendCleanupError`. */
39
+ spawn(spec: TerminalBackendSpawnSpec): Promise<TerminalBackendSession>
40
+ }
41
+ ```
42
+
43
+ ```ts type-equiv
44
+ /** Backend-owned live session retained by {@link TerminalSessionService}. */
45
+ interface TerminalBackendSession {
46
+ /** Initial bounded terminal output returned from `terminal_open`. */
47
+ readonly motd: string
48
+ /** Top-level process id when one exists. */
49
+ readonly pid?: number
50
+ /** Start one exclusive send operation. */
51
+ startSend(request: TerminalSendRequest): TerminalSendOperation
52
+ /** Read one bounded page from retained scrollback. */
53
+ read(request: TerminalReadRequest): TerminalReadResult
54
+ /** Signal the verified foreground process group. */
55
+ signal(signal: TerminalSignal): Promise<TerminalSignalResult>
56
+ /** Observe top-level process status. */
57
+ status(): TerminalSessionStatus
58
+ /** Idempotently close the captured owned process tree and await quiescence. */
59
+ close(reason: string): Promise<void>
60
+ }
61
+ ```
62
+
63
+ ## Send and retained output
64
+
65
+ One live session accepts one active send. Its operation exposes a consuming output cursor for generic background jobs and one terminal result for a foreground caller. `TerminalReadResult` separately pages the bounded session scrollback.
66
+
67
+ ```ts type-equiv
68
+ /** Live backend-owned send; exactly one may be active per PTY session. */
69
+ interface TerminalSendOperation {
70
+ /** Resolves after readiness, timeout, cancellation, or top-level process exit. */
71
+ done: Promise<TerminalSendResult>
72
+ /** Consume output produced since the prior call. */
73
+ readOutput(): TerminalSendRead
74
+ /** Request `SIGINT`; returns false after the operation settled. */
75
+ cancel(): boolean
76
+ }
77
+ ```
78
+
79
+ ```ts type-equiv
80
+ /** Settled result for one foreground or background send. */
81
+ interface TerminalSendResult {
82
+ /** Bounded rendered terminal delta remaining at settlement. */
83
+ viewport: string
84
+ /** Why the wait returned; this does not imply arbitrary child-process exit. */
85
+ waitReason: TerminalWaitReason
86
+ /** Top-level session status observed at settlement. */
87
+ sessionStatus: TerminalSessionStatus
88
+ /** Whether output was dropped from the operation or retained scrollback. */
89
+ truncated: boolean
90
+ }
91
+ ```
92
+
93
+ ## Ownership and durability
94
+
95
+ `TerminalSessionService` attaches one awaited cleanup to the exact owner scope, rejects foreign operations, and keeps sessions alive across backend or tool-plugin reload. PTY state and raw bytes remain process-local. Model input and bounded returned output are durable through the existing `tool/call`, `tool/result`, and task-result paths rather than duplicate PTY session events.
96
+
97
+ <!-- BEGIN GENERATED cordis-surface (gen-cordis-catalog.ts) — do not edit between markers -->
98
+
99
+ <a id="cordis-surface"></a>
100
+
101
+ ## Cordis API
102
+
103
+ Generated from source by `scripts/gen-cordis-catalog.ts` (verified fresh by `pnpm run verify-cordis-catalog` in doc-sync; regenerate with `pnpm run gen-cordis-catalog`) — the language sides differ only in locale-specific paired document paths. Signature blocks use a `ts cordis-catalog` fence and keep the original source JSDoc; dispatch modes are defined in the [primer](../cordis-primer.md#dispatch-modes), and the framework-inherited `ctx` API lives in [cordis-api/inherited.md](../cordis-api/inherited.md).
104
+
105
+ <a id="ctxterminals--terminalsessionservice"></a>
106
+
107
+ ### `ctx.terminals` — `TerminalSessionService`
108
+
109
+ In-process registry for replaceable PTY backends and exact-Agent sessions.
110
+
111
+ ```ts cordis-catalog
112
+ /**
113
+ * Register one backend type for this effect scope.
114
+ * @param backend - provider with a non-empty unique type.
115
+ * @returns disposer that removes exactly this contribution.
116
+ */
117
+ registerBackend(backend: TerminalBackend): () => void
118
+
119
+ /**
120
+ * List registered backend types in registration order.
121
+ * @returns fresh backend type names.
122
+ */
123
+ listBackends(): string[]
124
+
125
+ /**
126
+ * Create and publish one owner-scoped session after backend setup succeeds.
127
+ * @param owner - exact registered Agent that owns access and cleanup.
128
+ * @param request - backend type plus optional owner-local name and cwd.
129
+ * @param signal - cancellation of unpublished setup.
130
+ * @returns published identity, metadata, status, and MOTD.
131
+ */
132
+ async spawn(owner: Agent, request: TerminalSpawnRequest, signal?: AbortSignal): Promise<TerminalSpawnResult>
133
+
134
+ /**
135
+ * Test whether an exact owner has a published session or unpublished spawn.
136
+ * @param owner - exact live owner to inspect.
137
+ * @returns true across the entire spawn-to-close interval, with no publication gap.
138
+ */
139
+ hasOwnerActivity(owner: Agent): boolean
140
+
141
+ /**
142
+ * Start one exclusive interactive send.
143
+ * @param owner - exact session owner.
144
+ * @param id - target PTY identity.
145
+ * @param request - explicit text, submit behavior, and cancellation.
146
+ * @returns live operation handle for foreground await or task registration.
147
+ */
148
+ startSend(owner: Agent, id: TerminalSessionId, request: TerminalSendRequest): TerminalSendOperation
149
+
150
+ /**
151
+ * Read one bounded scrollback page from an owned session.
152
+ * @param owner - exact session owner.
153
+ * @param id - target PTY identity.
154
+ * @param request - optional newest-relative offset and line count.
155
+ * @returns bounded retained text and pagination metadata.
156
+ */
157
+ read(owner: Agent, id: TerminalSessionId, request: TerminalReadRequest = {}): TerminalReadResult
158
+
159
+ /**
160
+ * Deliver an allowed signal through an owned backend session.
161
+ * @param owner - exact session owner.
162
+ * @param id - target PTY identity.
163
+ * @param signal - allowed POSIX signal name.
164
+ * @returns delivered foreground process-group identity.
165
+ */
166
+ signal(owner: Agent, id: TerminalSessionId, signal: TerminalSignal): Promise<TerminalSignalResult>
167
+
168
+ /**
169
+ * Close one owned session and remove it only after quiescent backend cleanup.
170
+ * @param owner - exact session owner.
171
+ * @param id - target PTY identity.
172
+ * @param reason - diagnostic cleanup reason.
173
+ * @returns true for a newly closed session, false when the same close is already in flight.
174
+ */
175
+ async kill(owner: Agent, id: TerminalSessionId, reason: string = 'model request'): Promise<boolean>
176
+
177
+ /**
178
+ * List fresh snapshots for exactly one owner.
179
+ * @param owner - exact owner whose sessions are visible.
180
+ * @returns owner-visible snapshots in publication order.
181
+ */
182
+ list(owner: Agent): TerminalSessionSnapshot[]
183
+ ```
184
+
185
+ Types: [Agent](./core.md)
186
+
187
+ Source: [`packages/terminal/terminal/src/index.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/terminal/terminal/src/index.ts)
188
+ <!-- END GENERATED cordis-surface -->