@threadbase-sh/streamer 1.63.0 → 1.65.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 (300) hide show
  1. package/dist/agent/agent-client.d.ts +14 -0
  2. package/dist/agent/agent-client.d.ts.map +1 -0
  3. package/dist/agent/agent-config.d.ts +24 -0
  4. package/dist/agent/agent-config.d.ts.map +1 -0
  5. package/dist/agent/conversation-writer.d.ts +13 -0
  6. package/dist/agent/conversation-writer.d.ts.map +1 -0
  7. package/dist/agent/dedupe.d.ts +6 -0
  8. package/dist/agent/dedupe.d.ts.map +1 -0
  9. package/dist/agent/errors.d.ts +23 -0
  10. package/dist/agent/errors.d.ts.map +1 -0
  11. package/dist/agent/handle-send-agent-input.d.ts +21 -0
  12. package/dist/agent/handle-send-agent-input.d.ts.map +1 -0
  13. package/dist/agent/handle-start-agent-session.d.ts +21 -0
  14. package/dist/agent/handle-start-agent-session.d.ts.map +1 -0
  15. package/dist/agent/history-mapper.d.ts +4 -0
  16. package/dist/agent/history-mapper.d.ts.map +1 -0
  17. package/dist/agent/payload-guard.d.ts +29 -0
  18. package/dist/agent/payload-guard.d.ts.map +1 -0
  19. package/dist/api/app.d.ts +28 -0
  20. package/dist/api/app.d.ts.map +1 -0
  21. package/dist/api/handlers/conversations.handlers.d.ts +69 -0
  22. package/dist/api/handlers/conversations.handlers.d.ts.map +1 -0
  23. package/dist/api/handlers/http-helpers.d.ts +50 -0
  24. package/dist/api/handlers/http-helpers.d.ts.map +1 -0
  25. package/dist/api/handlers/sessions.handlers.d.ts +236 -0
  26. package/dist/api/handlers/sessions.handlers.d.ts.map +1 -0
  27. package/dist/api/middleware/auth.middleware.d.ts +5 -0
  28. package/dist/api/middleware/auth.middleware.d.ts.map +1 -0
  29. package/dist/api/middleware/cors.middleware.d.ts +5 -0
  30. package/dist/api/middleware/cors.middleware.d.ts.map +1 -0
  31. package/dist/api/middleware/error.middleware.d.ts +4 -0
  32. package/dist/api/middleware/error.middleware.d.ts.map +1 -0
  33. package/dist/api/routes/backup.routes.d.ts +5 -0
  34. package/dist/api/routes/backup.routes.d.ts.map +1 -0
  35. package/dist/api/routes/browse.routes.d.ts +5 -0
  36. package/dist/api/routes/browse.routes.d.ts.map +1 -0
  37. package/dist/api/routes/cacheAlert.routes.d.ts +5 -0
  38. package/dist/api/routes/cacheAlert.routes.d.ts.map +1 -0
  39. package/dist/api/routes/config.routes.d.ts +5 -0
  40. package/dist/api/routes/config.routes.d.ts.map +1 -0
  41. package/dist/api/routes/conversations.routes.d.ts +5 -0
  42. package/dist/api/routes/conversations.routes.d.ts.map +1 -0
  43. package/dist/api/routes/devices.routes.d.ts +17 -0
  44. package/dist/api/routes/devices.routes.d.ts.map +1 -0
  45. package/dist/api/routes/diagnostics.routes.d.ts +5 -0
  46. package/dist/api/routes/diagnostics.routes.d.ts.map +1 -0
  47. package/dist/api/routes/health.routes.d.ts +5 -0
  48. package/dist/api/routes/health.routes.d.ts.map +1 -0
  49. package/dist/api/routes/logs.routes.d.ts +3 -0
  50. package/dist/api/routes/logs.routes.d.ts.map +1 -0
  51. package/dist/api/routes/misc.routes.d.ts +77 -0
  52. package/dist/api/routes/misc.routes.d.ts.map +1 -0
  53. package/dist/api/routes/pair.routes.d.ts +5 -0
  54. package/dist/api/routes/pair.routes.d.ts.map +1 -0
  55. package/dist/api/routes/progress.routes.d.ts +39 -0
  56. package/dist/api/routes/progress.routes.d.ts.map +1 -0
  57. package/dist/api/routes/projects.routes.d.ts +5 -0
  58. package/dist/api/routes/projects.routes.d.ts.map +1 -0
  59. package/dist/api/routes/providers.routes.d.ts +19 -0
  60. package/dist/api/routes/providers.routes.d.ts.map +1 -0
  61. package/dist/api/routes/scanner.routes.d.ts +5 -0
  62. package/dist/api/routes/scanner.routes.d.ts.map +1 -0
  63. package/dist/api/routes/sessions.routes.d.ts +6 -0
  64. package/dist/api/routes/sessions.routes.d.ts.map +1 -0
  65. package/dist/api/routes/ws.routes.d.ts +7 -0
  66. package/dist/api/routes/ws.routes.d.ts.map +1 -0
  67. package/dist/api/types/api-deps.d.ts +114 -0
  68. package/dist/api/types/api-deps.d.ts.map +1 -0
  69. package/dist/auth.d.ts +81 -0
  70. package/dist/auth.d.ts.map +1 -0
  71. package/dist/browse.d.ts +17 -0
  72. package/dist/browse.d.ts.map +1 -0
  73. package/dist/claude-flags.d.ts +76 -0
  74. package/dist/claude-flags.d.ts.map +1 -0
  75. package/dist/cli.cjs +121 -7
  76. package/dist/cli.cjs.map +1 -1
  77. package/dist/codex-pty-runner.d.ts +90 -0
  78. package/dist/codex-pty-runner.d.ts.map +1 -0
  79. package/dist/config/update-config.d.ts +13 -0
  80. package/dist/config/update-config.d.ts.map +1 -0
  81. package/dist/conversation-cache.d.ts +336 -0
  82. package/dist/conversation-cache.d.ts.map +1 -0
  83. package/dist/db/config.d.ts +11 -0
  84. package/dist/db/config.d.ts.map +1 -0
  85. package/dist/db/index.d.ts +5 -0
  86. package/dist/db/index.d.ts.map +1 -0
  87. package/dist/db/migrations.d.ts +3 -0
  88. package/dist/db/migrations.d.ts.map +1 -0
  89. package/dist/db/pool.d.ts +5 -0
  90. package/dist/db/pool.d.ts.map +1 -0
  91. package/dist/db/query-timing.d.ts +52 -0
  92. package/dist/db/query-timing.d.ts.map +1 -0
  93. package/dist/db/repositories/cacheMetadata.repository.d.ts +12 -0
  94. package/dist/db/repositories/cacheMetadata.repository.d.ts.map +1 -0
  95. package/dist/db/repositories/conversations.repository.d.ts +27 -0
  96. package/dist/db/repositories/conversations.repository.d.ts.map +1 -0
  97. package/dist/db/repositories/devices.repository.d.ts +137 -0
  98. package/dist/db/repositories/devices.repository.d.ts.map +1 -0
  99. package/dist/db/repositories/managed-sessions.repository.d.ts +127 -0
  100. package/dist/db/repositories/managed-sessions.repository.d.ts.map +1 -0
  101. package/dist/db/repositories/projects.repository.d.ts +28 -0
  102. package/dist/db/repositories/projects.repository.d.ts.map +1 -0
  103. package/dist/db/repositories/push.repository.d.ts +186 -0
  104. package/dist/db/repositories/push.repository.d.ts.map +1 -0
  105. package/dist/db/repositories/sessions.repository.d.ts +16 -0
  106. package/dist/db/repositories/sessions.repository.d.ts.map +1 -0
  107. package/dist/db/runtime-store.d.ts +80 -0
  108. package/dist/db/runtime-store.d.ts.map +1 -0
  109. package/dist/db/sqlite-migrate.d.ts +13 -0
  110. package/dist/db/sqlite-migrate.d.ts.map +1 -0
  111. package/dist/db/upload-records.d.ts +11 -0
  112. package/dist/db/upload-records.d.ts.map +1 -0
  113. package/dist/e2ee/noise.d.ts +261 -0
  114. package/dist/e2ee/noise.d.ts.map +1 -0
  115. package/dist/e2ee/pair-payload.d.ts +60 -0
  116. package/dist/e2ee/pair-payload.d.ts.map +1 -0
  117. package/dist/e2ee/pair-request.d.ts +24 -0
  118. package/dist/e2ee/pair-request.d.ts.map +1 -0
  119. package/dist/external-tails.d.ts +91 -0
  120. package/dist/external-tails.d.ts.map +1 -0
  121. package/dist/feature-flags.d.ts +212 -0
  122. package/dist/feature-flags.d.ts.map +1 -0
  123. package/dist/handlers/handleListProjects.d.ts +3 -0
  124. package/dist/handlers/handleListProjects.d.ts.map +1 -0
  125. package/dist/index.cjs +101 -2
  126. package/dist/index.cjs.map +1 -1
  127. package/dist/index.d.ts +18 -2571
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +101 -2
  130. package/dist/index.js.map +1 -1
  131. package/dist/lifecycle/constants.d.ts +21 -0
  132. package/dist/lifecycle/constants.d.ts.map +1 -0
  133. package/dist/lifecycle/process-liveness.d.ts +7 -0
  134. package/dist/lifecycle/process-liveness.d.ts.map +1 -0
  135. package/dist/live-session-manager.d.ts +59 -0
  136. package/dist/live-session-manager.d.ts.map +1 -0
  137. package/dist/logger.d.ts +14 -0
  138. package/dist/logger.d.ts.map +1 -0
  139. package/dist/pair-store.d.ts +60 -0
  140. package/dist/pair-store.d.ts.map +1 -0
  141. package/dist/platform.d.ts +25 -0
  142. package/dist/platform.d.ts.map +1 -0
  143. package/dist/process-discovery.d.ts +35 -0
  144. package/dist/process-discovery.d.ts.map +1 -0
  145. package/dist/providers.d.ts +7 -0
  146. package/dist/providers.d.ts.map +1 -0
  147. package/dist/pty-host/protocol.d.ts +270 -0
  148. package/dist/pty-host/protocol.d.ts.map +1 -0
  149. package/dist/pty-host/remote-session-runner.d.ts +133 -0
  150. package/dist/pty-host/remote-session-runner.d.ts.map +1 -0
  151. package/dist/pty-host/socket.d.ts +54 -0
  152. package/dist/pty-host/socket.d.ts.map +1 -0
  153. package/dist/pty-host/spawn-host.d.ts +30 -0
  154. package/dist/pty-host/spawn-host.d.ts.map +1 -0
  155. package/dist/pty-manager.d.ts +65 -0
  156. package/dist/pty-manager.d.ts.map +1 -0
  157. package/dist/pty-shared.d.ts +27 -0
  158. package/dist/pty-shared.d.ts.map +1 -0
  159. package/dist/scanner-manager.d.ts +126 -0
  160. package/dist/scanner-manager.d.ts.map +1 -0
  161. package/dist/schemas/cacheAlert.schema.d.ts +14 -0
  162. package/dist/schemas/cacheAlert.schema.d.ts.map +1 -0
  163. package/dist/schemas/claudeFlags.schema.d.ts +7 -0
  164. package/dist/schemas/claudeFlags.schema.d.ts.map +1 -0
  165. package/dist/schemas/project.schema.d.ts +18 -0
  166. package/dist/schemas/project.schema.d.ts.map +1 -0
  167. package/dist/schemas/updateConfig.schema.d.ts +19 -0
  168. package/dist/schemas/updateConfig.schema.d.ts.map +1 -0
  169. package/dist/seal.d.ts +14 -0
  170. package/dist/seal.d.ts.map +1 -0
  171. package/dist/server-identity.d.ts +43 -0
  172. package/dist/server-identity.d.ts.map +1 -0
  173. package/dist/server-wiring.d.ts +189 -0
  174. package/dist/server-wiring.d.ts.map +1 -0
  175. package/dist/server.d.ts +404 -0
  176. package/dist/server.d.ts.map +1 -0
  177. package/dist/services/backup/backup.d.ts +103 -0
  178. package/dist/services/backup/backup.d.ts.map +1 -0
  179. package/dist/services/cache/cacheMetadata.d.ts +8 -0
  180. package/dist/services/cache/cacheMetadata.d.ts.map +1 -0
  181. package/dist/services/cache-integrity/alertStore.d.ts +24 -0
  182. package/dist/services/cache-integrity/alertStore.d.ts.map +1 -0
  183. package/dist/services/cache-integrity/backup.d.ts +8 -0
  184. package/dist/services/cache-integrity/backup.d.ts.map +1 -0
  185. package/dist/services/cache-integrity/cacheIntegrityMonitor.d.ts +71 -0
  186. package/dist/services/cache-integrity/cacheIntegrityMonitor.d.ts.map +1 -0
  187. package/dist/services/conversations/conversationWatcher.d.ts +99 -0
  188. package/dist/services/conversations/conversationWatcher.d.ts.map +1 -0
  189. package/dist/services/conversations/findSearchTarget.d.ts +30 -0
  190. package/dist/services/conversations/findSearchTarget.d.ts.map +1 -0
  191. package/dist/services/conversations/isAgentConversation.d.ts +8 -0
  192. package/dist/services/conversations/isAgentConversation.d.ts.map +1 -0
  193. package/dist/services/conversations/pruneAgentConversations.d.ts +8 -0
  194. package/dist/services/conversations/pruneAgentConversations.d.ts.map +1 -0
  195. package/dist/services/conversations/refreshConversationCache.d.ts +27 -0
  196. package/dist/services/conversations/refreshConversationCache.d.ts.map +1 -0
  197. package/dist/services/conversations/shouldRefreshProjectsFromHdd.d.ts +33 -0
  198. package/dist/services/conversations/shouldRefreshProjectsFromHdd.d.ts.map +1 -0
  199. package/dist/services/diagnostics/diagnostics.d.ts +66 -0
  200. package/dist/services/diagnostics/diagnostics.d.ts.map +1 -0
  201. package/dist/services/projectChats/deriveProjectChatTitle.d.ts +15 -0
  202. package/dist/services/projectChats/deriveProjectChatTitle.d.ts.map +1 -0
  203. package/dist/services/projects/ensureProjectsForConversations.d.ts +15 -0
  204. package/dist/services/projects/ensureProjectsForConversations.d.ts.map +1 -0
  205. package/dist/services/providers/capabilities.d.ts +105 -0
  206. package/dist/services/providers/capabilities.d.ts.map +1 -0
  207. package/dist/services/providers/providerHealth.d.ts +72 -0
  208. package/dist/services/providers/providerHealth.d.ts.map +1 -0
  209. package/dist/services/push/apnsClient.d.ts +105 -0
  210. package/dist/services/push/apnsClient.d.ts.map +1 -0
  211. package/dist/services/push/expoPushSender.d.ts +37 -0
  212. package/dist/services/push/expoPushSender.d.ts.map +1 -0
  213. package/dist/services/push/liveActivityContentState.d.ts +60 -0
  214. package/dist/services/push/liveActivityContentState.d.ts.map +1 -0
  215. package/dist/services/push/liveActivityNotifier.d.ts +49 -0
  216. package/dist/services/push/liveActivityNotifier.d.ts.map +1 -0
  217. package/dist/services/push/liveActivityRenewal.d.ts +63 -0
  218. package/dist/services/push/liveActivityRenewal.d.ts.map +1 -0
  219. package/dist/services/push/liveActivitySender.d.ts +88 -0
  220. package/dist/services/push/liveActivitySender.d.ts.map +1 -0
  221. package/dist/services/push/waitingInputNotifier.d.ts +41 -0
  222. package/dist/services/push/waitingInputNotifier.d.ts.map +1 -0
  223. package/dist/services/questions/answersToKeystrokes.d.ts +8 -0
  224. package/dist/services/questions/answersToKeystrokes.d.ts.map +1 -0
  225. package/dist/services/questions/codexGateAnswers.d.ts +14 -0
  226. package/dist/services/questions/codexGateAnswers.d.ts.map +1 -0
  227. package/dist/services/questions/codexScreen.d.ts +74 -0
  228. package/dist/services/questions/codexScreen.d.ts.map +1 -0
  229. package/dist/services/questions/detectAskUserQuestion.d.ts +6 -0
  230. package/dist/services/questions/detectAskUserQuestion.d.ts.map +1 -0
  231. package/dist/services/questions/detectPermissionGate.d.ts +62 -0
  232. package/dist/services/questions/detectPermissionGate.d.ts.map +1 -0
  233. package/dist/services/questions/detectQuestionFromScreen.d.ts +30 -0
  234. package/dist/services/questions/detectQuestionFromScreen.d.ts.map +1 -0
  235. package/dist/services/questions/detectShellPrompt.d.ts +18 -0
  236. package/dist/services/questions/detectShellPrompt.d.ts.map +1 -0
  237. package/dist/services/questions/parseAgentPhase.d.ts +12 -0
  238. package/dist/services/questions/parseAgentPhase.d.ts.map +1 -0
  239. package/dist/services/questions/parseStatusLine.d.ts +19 -0
  240. package/dist/services/questions/parseStatusLine.d.ts.map +1 -0
  241. package/dist/services/questions/questionBroadcast.d.ts +18 -0
  242. package/dist/services/questions/questionBroadcast.d.ts.map +1 -0
  243. package/dist/services/questions/resolveAnswer.d.ts +16 -0
  244. package/dist/services/questions/resolveAnswer.d.ts.map +1 -0
  245. package/dist/services/search/searchQuery.d.ts +78 -0
  246. package/dist/services/search/searchQuery.d.ts.map +1 -0
  247. package/dist/services/security/capabilities.d.ts +50 -0
  248. package/dist/services/security/capabilities.d.ts.map +1 -0
  249. package/dist/services/sessions/autoResumeOnBoot.d.ts +28 -0
  250. package/dist/services/sessions/autoResumeOnBoot.d.ts.map +1 -0
  251. package/dist/services/sessions/codexRolloutOwner.d.ts +55 -0
  252. package/dist/services/sessions/codexRolloutOwner.d.ts.map +1 -0
  253. package/dist/services/sessions/conversationBusy.d.ts +32 -0
  254. package/dist/services/sessions/conversationBusy.d.ts.map +1 -0
  255. package/dist/services/sessions/idempotency.d.ts +67 -0
  256. package/dist/services/sessions/idempotency.d.ts.map +1 -0
  257. package/dist/services/sessions/reconcileSessions.d.ts +63 -0
  258. package/dist/services/sessions/reconcileSessions.d.ts.map +1 -0
  259. package/dist/services/sessions/rehydrateSessions.d.ts +68 -0
  260. package/dist/services/sessions/rehydrateSessions.d.ts.map +1 -0
  261. package/dist/services/sessions/resumeIdentity.d.ts +16 -0
  262. package/dist/services/sessions/resumeIdentity.d.ts.map +1 -0
  263. package/dist/session-registry-boot.d.ts +142 -0
  264. package/dist/session-registry-boot.d.ts.map +1 -0
  265. package/dist/session-store.d.ts +32 -0
  266. package/dist/session-store.d.ts.map +1 -0
  267. package/dist/session-watchers.d.ts +60 -0
  268. package/dist/session-watchers.d.ts.map +1 -0
  269. package/dist/types.d.ts +616 -0
  270. package/dist/types.d.ts.map +1 -0
  271. package/dist/uploads.d.ts +16 -0
  272. package/dist/uploads.d.ts.map +1 -0
  273. package/dist/utils/bootToken.d.ts +3 -0
  274. package/dist/utils/bootToken.d.ts.map +1 -0
  275. package/dist/utils/canonicalizeFilePath.d.ts +75 -0
  276. package/dist/utils/canonicalizeFilePath.d.ts.map +1 -0
  277. package/dist/utils/canonicalizeProjectPath.d.ts +13 -0
  278. package/dist/utils/canonicalizeProjectPath.d.ts.map +1 -0
  279. package/dist/utils/codexConversationLine.d.ts +38 -0
  280. package/dist/utils/codexConversationLine.d.ts.map +1 -0
  281. package/dist/utils/conversationEtag.d.ts +19 -0
  282. package/dist/utils/conversationEtag.d.ts.map +1 -0
  283. package/dist/utils/dates.d.ts +12 -0
  284. package/dist/utils/dates.d.ts.map +1 -0
  285. package/dist/utils/debounce.d.ts +15 -0
  286. package/dist/utils/debounce.d.ts.map +1 -0
  287. package/dist/utils/deriveSessionName.d.ts +10 -0
  288. package/dist/utils/deriveSessionName.d.ts.map +1 -0
  289. package/dist/utils/fileIdentity.d.ts +36 -0
  290. package/dist/utils/fileIdentity.d.ts.map +1 -0
  291. package/dist/utils/isScannedSnapshotStale.d.ts +16 -0
  292. package/dist/utils/isScannedSnapshotStale.d.ts.map +1 -0
  293. package/dist/utils/scanProgressThrottle.d.ts +12 -0
  294. package/dist/utils/scanProgressThrottle.d.ts.map +1 -0
  295. package/dist/version.d.ts +3 -0
  296. package/dist/version.d.ts.map +1 -0
  297. package/dist/ws-hub.d.ts +15 -0
  298. package/dist/ws-hub.d.ts.map +1 -0
  299. package/package.json +3 -4
  300. package/dist/index.d.cts +0 -2571
@@ -0,0 +1,76 @@
1
+ /** Claude Code `--permission-mode` values, as accepted by CLI v2.1.x. */
2
+ export declare const PERMISSION_MODES: readonly ["acceptEdits", "auto", "bypassPermissions", "manual", "dontAsk", "plan"];
3
+ export type PermissionMode = (typeof PERMISSION_MODES)[number];
4
+ export declare function isPermissionMode(value: unknown): value is PermissionMode;
5
+ export declare const DANGEROUS_PERMISSION_MODES: readonly PermissionMode[];
6
+ export declare function isDangerousPermissionMode(mode: PermissionMode): boolean;
7
+ /**
8
+ * The mode sessions will actually spawn with, for callers that need to know
9
+ * before any spawn happens (the boot warning). Mirrors the precedence
10
+ * `StreamerServer.spawnFlagOverrides()` applies — `claudeFlags.permissionMode`
11
+ * wins over the `--default-permission-mode` fallback — so the two must not
12
+ * drift: a warning that reads the fallback would stay silent while a
13
+ * `claude_flags:` bypass is what actually reaches argv.
14
+ */
15
+ export declare function effectivePermissionMode(flags: ClaudeFlagValues | undefined, fallback: string | undefined): PermissionMode | undefined;
16
+ /** Claude Code `--effort` levels, as accepted by CLI v2.1.x. */
17
+ export declare const EFFORT_LEVELS: readonly ["low", "medium", "high", "xhigh", "max"];
18
+ export type EffortLevel = (typeof EFFORT_LEVELS)[number];
19
+ export declare function isEffortLevel(value: unknown): value is EffortLevel;
20
+ export type FlagValueType = "boolean" | "string" | "enum" | "list";
21
+ /** How risky enabling a flag is. Drives the client's confirmation UX. */
22
+ export type FlagRisk = "low" | "elevated" | "dangerous";
23
+ export interface FlagDefinition {
24
+ /** Stable config/wire key. Never the CLI spelling. */
25
+ id: string;
26
+ /** The literal CLI token, e.g. "--add-dir". */
27
+ flag: string;
28
+ valueType: FlagValueType;
29
+ /** Allowed values when valueType === "enum". */
30
+ enumValues?: readonly string[];
31
+ /**
32
+ * Baseline risk. `permissionMode` is the exception: it is only dangerous for
33
+ * the values in DANGEROUS_PERMISSION_MODES, so clients must call
34
+ * `flagValueRisk()` rather than reading this field directly.
35
+ */
36
+ risk: FlagRisk;
37
+ }
38
+ export type ClaudeFlagValue = string | string[] | boolean;
39
+ export type ClaudeFlagValues = Record<string, ClaudeFlagValue>;
40
+ export declare const CLAUDE_FLAGS: readonly FlagDefinition[];
41
+ export declare function findFlag(id: string): FlagDefinition | undefined;
42
+ /**
43
+ * Effective risk of a specific value. Only `permissionMode` is value-dependent
44
+ * (`acceptEdits` is routine; `bypassPermissions` is not).
45
+ */
46
+ export declare function flagValueRisk(id: string, value: ClaudeFlagValue): FlagRisk;
47
+ /**
48
+ * Drop everything that isn't a known id carrying a well-typed value.
49
+ *
50
+ * This is a TRUST BOUNDARY, not a convenience: values arrive from a
51
+ * user-editable server.yaml and from HTTP, and they become process argv. Never
52
+ * skip it. Unknown/invalid entries are dropped rather than throwing so one bad
53
+ * key can't prevent the server from booting.
54
+ */
55
+ export declare function validateFlagValues(raw: unknown): ClaudeFlagValues;
56
+ /**
57
+ * Split a free-text extra-args string into argv tokens, honouring single and
58
+ * double quotes so a path with spaces survives. Deliberately not a full shell
59
+ * parser — no variable expansion, no globbing, no escapes beyond the quotes.
60
+ */
61
+ export declare function tokenizeExtraArgs(input: string | undefined): string[];
62
+ /**
63
+ * Turn validated flag values + extra args into argv tokens.
64
+ *
65
+ * The SPAWN_POSITIONAL_FLAG_IDS are intentionally NOT emitted here: both PTY
66
+ * spawn paths already pass them as explicit positionals, and emitting them
67
+ * twice would put a duplicate flag on the command line. They flow through
68
+ * `options.permissionMode` / `options.model` / `options.effort` instead, which
69
+ * StreamerServer.spawnFlagOverrides() sources from these same flag values.
70
+ *
71
+ * Extra args land LAST so the escape hatch can override anything the allowlist
72
+ * set.
73
+ */
74
+ export declare function buildFlagArgs(values: ClaudeFlagValues | undefined, extraArgs?: string): string[];
75
+ export declare function buildSettingsJson(permissionMode: PermissionMode): string;
76
+ //# sourceMappingURL=claude-flags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-flags.d.ts","sourceRoot":"","sources":["../src/claude-flags.ts"],"names":[],"mappings":"AAcA,yEAAyE;AACzE,eAAO,MAAM,gBAAgB,YAC3B,aAAa,EACb,MAAM,EACN,mBAAmB,EACnB,QAAQ,EACR,SAAS,EACT,MAAM,CACE,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAExE;AAOD,eAAO,MAAM,0BAA0B,EAAE,SAAS,cAAc,EAG/D,CAAC;AAEF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAEvE;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,gBAAgB,GAAG,SAAS,EACnC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,cAAc,GAAG,SAAS,CAG5B;AAED,gEAAgE;AAChE,eAAO,MAAM,aAAa,YAAI,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAU,CAAC;AAEhF,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAElE;AAED,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnE,yEAAyE;AACzE,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,UAAU,GAAG,WAAW,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,sDAAsD;IACtD,EAAE,EAAE,MAAM,CAAC;IACX,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,aAAa,CAAC;IACzB,gDAAgD;IAChD,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B;;;;OAIG;IACH,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC;AAC1D,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAyB/D,eAAO,MAAM,YAAY,EAAE,SAAS,cAAc,EAajD,CAAC;AAQF,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE/D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,QAAQ,CAO1E;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,CA2BjE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CA+BrE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,SAAS,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAsBhG;AAUD,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,cAAc,GAAG,MAAM,CAMxE"}
package/dist/cli.cjs CHANGED
@@ -28235,7 +28235,7 @@ var require_permessage_deflate = __commonJS({
28235
28235
  acceptAsServer(offers) {
28236
28236
  const opts = this._options;
28237
28237
  const accepted = offers.find((params) => {
28238
- if (opts.serverNoContextTakeover === false && params.server_no_context_takeover || params.server_max_window_bits && (opts.serverMaxWindowBits === false || typeof opts.serverMaxWindowBits === "number" && opts.serverMaxWindowBits > params.server_max_window_bits) || typeof opts.clientMaxWindowBits === "number" && !params.client_max_window_bits) {
28238
+ if (opts.serverNoContextTakeover === false && params.server_no_context_takeover || params.server_max_window_bits && (opts.serverMaxWindowBits === false || typeof opts.serverMaxWindowBits === "number" && opts.serverMaxWindowBits > params.server_max_window_bits) || typeof opts.clientMaxWindowBits === "number" && (typeof params.client_max_window_bits === "number" ? opts.clientMaxWindowBits > params.client_max_window_bits : !params.client_max_window_bits)) {
28239
28239
  return false;
28240
28240
  }
28241
28241
  return true;
@@ -128383,7 +128383,7 @@ function formatIdentityBanner(fingerprint2, keyPath) {
128383
128383
  "",
128384
128384
  ` ${fingerprint2}`,
128385
128385
  "",
128386
- "Compare this with the fingerprint your phone shows when you add this server."
128386
+ "Compare this with the identity code your phone shows when you add this server."
128387
128387
  ].join("\n");
128388
128388
  }
128389
128389
  var init_identity = __esm({
@@ -148735,6 +148735,19 @@ var SessionHandlers = class {
148735
148735
  sessions: this.sessionStore.list(this.deps.ptyAttachedIds())
148736
148736
  });
148737
148737
  }
148738
+ /**
148739
+ * Same empty-unused check stop uses (promptCount === 0 and no cache row,
148740
+ * including boundConversationId / resumedFromConversationId). Safe after
148741
+ * putOnHold: the runner may already have dropped the live session.
148742
+ */
148743
+ forgetIfEmptyUnused(sessionId) {
148744
+ const live = this.ptyManager.getSession(sessionId);
148745
+ const stored = this.sessionStore.getManaged(sessionId);
148746
+ const session = live ?? stored;
148747
+ if (!session) return;
148748
+ if (!this.shouldForgetEmptySession(session)) return;
148749
+ this.forgetEmptyStoppedSession(sessionId);
148750
+ }
148738
148751
  async handleAdopt(sessionId, res) {
148739
148752
  const discovered = await discoverClaudeProcesses();
148740
148753
  this.sessionStore.setDiscovered(discovered);
@@ -151118,6 +151131,7 @@ function createLiveSessionOptions(deps) {
151118
151131
  void deps.liveActivityNotifier()?.onStatusChange(session, previousStatus);
151119
151132
  void deps.waitingInputNotifier()?.onStatusChange(session, previousStatus);
151120
151133
  deps.sessionStatusBus.emit(`status:${session.id}`, session.status, session);
151134
+ deps.maybeFireHoldWhenIdle?.(session);
151121
151135
  }
151122
151136
  };
151123
151137
  }
@@ -151266,7 +151280,20 @@ function createApiDeps(deps) {
151266
151280
  deny(msg.type, "session:control");
151267
151281
  return;
151268
151282
  }
151269
- deps.startGraceTimer(msg.sessionId, deps.ptyGracePeriodMs);
151283
+ const when = msg.when;
151284
+ if (when === void 0 || when === "grace") {
151285
+ deps.startGraceTimer(msg.sessionId, deps.ptyGracePeriodMs);
151286
+ return;
151287
+ }
151288
+ if (when === "waiting_input") {
151289
+ deps.armHoldWhenIdle(msg.sessionId);
151290
+ return;
151291
+ }
151292
+ deps.log().warn(`[pty.hold_when_unknown] hold_session when=${String(when)}`, {
151293
+ event: "pty.hold_when_unknown",
151294
+ sessionId: msg.sessionId,
151295
+ when
151296
+ });
151270
151297
  }
151271
151298
  } catch {
151272
151299
  }
@@ -153866,6 +153893,10 @@ var StreamerServer = class {
153866
153893
  // Consecutive grace-timer defers for a still-`running` session (see
153867
153894
  // GRACE_MAX_DEFERS). Reset when a subscriber reconnects or the PTY settles.
153868
153895
  ptyGraceDeferCounts = /* @__PURE__ */ new Map();
153896
+ // Session ids that should be putOnHold at the next waiting_input/idle.
153897
+ // Same lifetime as ptyGraceTimers: in-memory, dropped on close/restart.
153898
+ // Last writer wins against the grace timer — never both armed.
153899
+ holdWhenIdle = /* @__PURE__ */ new Set();
153869
153900
  // Map of sessionId → set of subscribed WS clients
153870
153901
  sessionSubscribers = /* @__PURE__ */ new Map();
153871
153902
  // sessionId → wall-clock ms of the last PTY chunk. Written from onOutput for
@@ -154093,7 +154124,8 @@ var StreamerServer = class {
154093
154124
  waitingInputNotifier: () => this.waitingInputNotifier,
154094
154125
  ptyAttachedIds: () => this.ptyAttachedIds(),
154095
154126
  cancelPendingQuestion: (sessionId) => this.cancelPendingQuestion(sessionId),
154096
- rememberSelfPtyEnded: (conversationId) => this.rememberSelfPtyEnded(conversationId)
154127
+ rememberSelfPtyEnded: (conversationId) => this.rememberSelfPtyEnded(conversationId),
154128
+ maybeFireHoldWhenIdle: (session) => this.maybeFireHoldWhenIdle(session)
154097
154129
  })
154098
154130
  );
154099
154131
  this.sessionWatchers = new SessionWatchers({
@@ -154256,6 +154288,7 @@ var StreamerServer = class {
154256
154288
  currentWarmupState: () => this.currentWarmupState(),
154257
154289
  addSessionSubscriber: (sessionId, ws2) => this.addSessionSubscriber(sessionId, ws2),
154258
154290
  startGraceTimer: (sessionId, delayMs) => this.startGraceTimer(sessionId, delayMs),
154291
+ armHoldWhenIdle: (sessionId) => this.armHoldWhenIdle(sessionId),
154259
154292
  handleSessionsCount: (res) => this.handleSessionsCount(res),
154260
154293
  applyLiveSessionSetting: (id, req, res, setting) => this.applyLiveSessionSetting(id, req, res, setting),
154261
154294
  handlePairStart: (res) => this.handlePairStart(res),
@@ -154375,6 +154408,13 @@ var StreamerServer = class {
154375
154408
  this.ptyGraceTimers.delete(sessionId);
154376
154409
  }
154377
154410
  this.ptyGraceDeferCounts.delete(sessionId);
154411
+ if (this.holdWhenIdle.delete(sessionId)) {
154412
+ this.log.info(
154413
+ `[hold-when-idle] cancelled ${sessionId} (subscribe)`,
154414
+ { sessionId, event: "pty.hold_when_idle_cancel", reason: "subscribe" },
154415
+ "pino"
154416
+ );
154417
+ }
154378
154418
  }
154379
154419
  /**
154380
154420
  * Bring up Live Activity push, if credentials are present (Feature 12).
@@ -154482,6 +154522,7 @@ var StreamerServer = class {
154482
154522
  return reaped;
154483
154523
  }
154484
154524
  startGraceTimer(sessionId, delayMs) {
154525
+ this.holdWhenIdle.delete(sessionId);
154485
154526
  const existing = this.ptyGraceTimers.get(sessionId);
154486
154527
  if (existing) clearTimeout(existing);
154487
154528
  const timer = setTimeout(() => {
@@ -154523,6 +154564,63 @@ var StreamerServer = class {
154523
154564
  }, delayMs);
154524
154565
  this.ptyGraceTimers.set(sessionId, timer);
154525
154566
  }
154567
+ clearGrace(sessionId) {
154568
+ const existing = this.ptyGraceTimers.get(sessionId);
154569
+ if (existing) {
154570
+ clearTimeout(existing);
154571
+ this.ptyGraceTimers.delete(sessionId);
154572
+ }
154573
+ this.ptyGraceDeferCounts.delete(sessionId);
154574
+ }
154575
+ /**
154576
+ * Arm the in-app "Kill on idle" latch: hold now if already settled, otherwise
154577
+ * on the next running → waiting_input (or idle). No grace delay, no defer cap.
154578
+ * A subscribed leaving socket must not block an immediate hold.
154579
+ */
154580
+ armHoldWhenIdle(sessionId) {
154581
+ if (!this.ptyManager.hasSession(sessionId)) return;
154582
+ this.clearGrace(sessionId);
154583
+ const status = this.ptyManager.getSession(sessionId)?.status ?? this.sessionStore.getManaged(sessionId)?.status;
154584
+ if (status === "waiting_input" || status === "idle") {
154585
+ this.holdWhenIdle.delete(sessionId);
154586
+ this.ptyManager.putOnHold(sessionId);
154587
+ this.forgetIfEmptyUnused(sessionId);
154588
+ return;
154589
+ }
154590
+ this.holdWhenIdle.add(sessionId);
154591
+ this.log.info(
154592
+ `[hold-when-idle] armed ${sessionId}`,
154593
+ { sessionId, event: "pty.hold_when_idle_armed" },
154594
+ "pino"
154595
+ );
154596
+ }
154597
+ /**
154598
+ * Fire the Kill-on-idle latch from the shared onStatusChange funnel.
154599
+ * Delete first so the ensuing idle transition cannot re-enter.
154600
+ */
154601
+ maybeFireHoldWhenIdle(session) {
154602
+ if (session.status !== "waiting_input" && session.status !== "idle") return;
154603
+ if (!this.holdWhenIdle.has(session.id)) return;
154604
+ this.holdWhenIdle.delete(session.id);
154605
+ if (this.hasSessionSubscriber(session.id)) {
154606
+ this.log.info(
154607
+ `[hold-when-idle] cancelled ${session.id} (subscriber)`,
154608
+ { sessionId: session.id, event: "pty.hold_when_idle_cancel", reason: "subscriber" },
154609
+ "pino"
154610
+ );
154611
+ return;
154612
+ }
154613
+ this.log.info(
154614
+ `[hold-when-idle] holding ${session.id}`,
154615
+ { sessionId: session.id, event: "pty.hold_when_idle_fire" },
154616
+ "pino"
154617
+ );
154618
+ this.ptyManager.putOnHold(session.id);
154619
+ this.forgetIfEmptyUnused(session.id);
154620
+ }
154621
+ forgetIfEmptyUnused(sessionId) {
154622
+ this.sessionHandlers.forgetIfEmptyUnused(sessionId);
154623
+ }
154526
154624
  get port() {
154527
154625
  const addr = this.httpServer.address();
154528
154626
  return typeof addr === "object" && addr ? addr.port : 0;
@@ -154955,6 +155053,7 @@ var StreamerServer = class {
154955
155053
  async close() {
154956
155054
  for (const timer of this.ptyGraceTimers.values()) clearTimeout(timer);
154957
155055
  this.ptyGraceTimers.clear();
155056
+ this.holdWhenIdle.clear();
154958
155057
  if (this.idleReaperTimer) {
154959
155058
  clearInterval(this.idleReaperTimer);
154960
155059
  this.idleReaperTimer = null;
@@ -159375,7 +159474,8 @@ function generateQr(payload) {
159375
159474
  function printUrlBanner({
159376
159475
  url: url2,
159377
159476
  qr: qr2,
159378
- expiresAt
159477
+ expiresAt,
159478
+ fingerprint: fingerprint2
159379
159479
  }) {
159380
159480
  const contentLines = ["Threadbase Streamer \u2014 server address", "", url2];
159381
159481
  if (qr2) {
@@ -159389,6 +159489,14 @@ function printUrlBanner({
159389
159489
  contentLines.push("", "Scan to pair a mobile client");
159390
159490
  }
159391
159491
  }
159492
+ if (fingerprint2) {
159493
+ contentLines.push(
159494
+ "",
159495
+ "Identity code",
159496
+ fingerprint2,
159497
+ "This should match the code your phone shows after you scan."
159498
+ );
159499
+ }
159392
159500
  const width = Math.max(...contentLines.map((l) => l.length));
159393
159501
  const pad = (l) => `\u2551 ${l}${" ".repeat(width - l.length)} \u2551`;
159394
159502
  const top = `\u2554${"\u2550".repeat(width + 2)}\u2557`;
@@ -159452,9 +159560,15 @@ async function printServerBanner({
159452
159560
  }
159453
159561
  const { token, expiresAt, expiresInSeconds } = await res.json();
159454
159562
  const expSeconds = Math.floor(expiresAt / 1e3);
159455
- const payload = `threadbase://pair?url=${encodeURIComponent(url2)}&token=${token}&exp=${expSeconds}` + (e2eeOffered ? `&spk=${identityKey()}&v=1` : "");
159563
+ let fingerprint2;
159564
+ let payload = `threadbase://pair?url=${encodeURIComponent(url2)}&token=${token}&exp=${expSeconds}`;
159565
+ if (e2eeOffered) {
159566
+ const spk = identityKey();
159567
+ payload += `&spk=${spk}&v=1`;
159568
+ fingerprint2 = serverIdentityFingerprint(spk);
159569
+ }
159456
159570
  const qr2 = await generateQr(payload);
159457
- log15.info(printUrlBanner({ url: url2, qr: qr2, expiresAt }));
159571
+ log15.info(printUrlBanner({ url: url2, qr: qr2, expiresAt, fingerprint: fingerprint2 }));
159458
159572
  log15.info(`Pair URL: ${payload}`);
159459
159573
  log15.info(`Expires in ${expiresInSeconds}s`);
159460
159574
  }