@vibefield/rosetta-protocol 0.0.0-stage → 0.1.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 (354) hide show
  1. package/README.md +73 -2
  2. package/dist/base64url.d.ts +4 -0
  3. package/dist/base64url.js +48 -0
  4. package/dist/client.d.ts +324 -0
  5. package/dist/client.js +981 -0
  6. package/dist/generated/ActivityResponse.d.ts +16 -0
  7. package/dist/generated/ActivityResponse.js +1 -0
  8. package/dist/generated/ActivitySession.d.ts +19 -0
  9. package/dist/generated/ActivitySession.js +1 -0
  10. package/dist/generated/ApiError.d.ts +5 -0
  11. package/dist/generated/ApiError.js +1 -0
  12. package/dist/generated/ArtifactKind.d.ts +1 -0
  13. package/dist/generated/ArtifactKind.js +2 -0
  14. package/dist/generated/ArtifactOp.d.ts +1 -0
  15. package/dist/generated/ArtifactOp.js +2 -0
  16. package/dist/generated/AssetRef.d.ts +14 -0
  17. package/dist/generated/AssetRef.js +1 -0
  18. package/dist/generated/AttachmentKind.d.ts +1 -0
  19. package/dist/generated/AttachmentKind.js +2 -0
  20. package/dist/generated/AttachmentRef.d.ts +21 -0
  21. package/dist/generated/AttachmentRef.js +1 -0
  22. package/dist/generated/AttachmentSource.d.ts +13 -0
  23. package/dist/generated/AttachmentSource.js +1 -0
  24. package/dist/generated/AttachmentUnavailableReason.d.ts +1 -0
  25. package/dist/generated/AttachmentUnavailableReason.js +2 -0
  26. package/dist/generated/BackfillState.d.ts +4 -0
  27. package/dist/generated/BackfillState.js +2 -0
  28. package/dist/generated/BoostRequest.d.ts +7 -0
  29. package/dist/generated/BoostRequest.js +2 -0
  30. package/dist/generated/BoostResponse.d.ts +6 -0
  31. package/dist/generated/BoostResponse.js +2 -0
  32. package/dist/generated/CanonicalDocument.d.ts +16 -0
  33. package/dist/generated/CanonicalDocument.js +1 -0
  34. package/dist/generated/CanonicalText.d.ts +10 -0
  35. package/dist/generated/CanonicalText.js +1 -0
  36. package/dist/generated/ChildTrace.d.ts +1 -0
  37. package/dist/generated/ChildTrace.js +2 -0
  38. package/dist/generated/CitationRef.d.ts +9 -0
  39. package/dist/generated/CitationRef.js +1 -0
  40. package/dist/generated/CodeLookupOp.d.ts +1 -0
  41. package/dist/generated/CodeLookupOp.js +2 -0
  42. package/dist/generated/CollaborationChannel.d.ts +1 -0
  43. package/dist/generated/CollaborationChannel.js +2 -0
  44. package/dist/generated/CollaborationEvent.d.ts +47 -0
  45. package/dist/generated/CollaborationEvent.js +1 -0
  46. package/dist/generated/CollaborationEventKind.d.ts +1 -0
  47. package/dist/generated/CollaborationEventKind.js +2 -0
  48. package/dist/generated/CollaborationOp.d.ts +1 -0
  49. package/dist/generated/CollaborationOp.js +2 -0
  50. package/dist/generated/CollaborationOutcome.d.ts +5 -0
  51. package/dist/generated/CollaborationOutcome.js +1 -0
  52. package/dist/generated/CollaborationStatus.d.ts +1 -0
  53. package/dist/generated/CollaborationStatus.js +2 -0
  54. package/dist/generated/CollaborationTimeline.d.ts +10 -0
  55. package/dist/generated/CollaborationTimeline.js +1 -0
  56. package/dist/generated/CollaboratorRef.d.ts +7 -0
  57. package/dist/generated/CollaboratorRef.js +1 -0
  58. package/dist/generated/CommandResponse.d.ts +7 -0
  59. package/dist/generated/CommandResponse.js +2 -0
  60. package/dist/generated/ContributionResponse.d.ts +4 -0
  61. package/dist/generated/ContributionResponse.js +1 -0
  62. package/dist/generated/ContributionRow.d.ts +22 -0
  63. package/dist/generated/ContributionRow.js +2 -0
  64. package/dist/generated/CorrelationDerivation.d.ts +1 -0
  65. package/dist/generated/CorrelationDerivation.js +2 -0
  66. package/dist/generated/DaemonStatus.d.ts +17 -0
  67. package/dist/generated/DaemonStatus.js +1 -0
  68. package/dist/generated/DayUsageResponse.d.ts +8 -0
  69. package/dist/generated/DayUsageResponse.js +1 -0
  70. package/dist/generated/Dimensions.d.ts +4 -0
  71. package/dist/generated/Dimensions.js +2 -0
  72. package/dist/generated/DiscoveriesResponse.d.ts +4 -0
  73. package/dist/generated/DiscoveriesResponse.js +1 -0
  74. package/dist/generated/DiscoveryRow.d.ts +23 -0
  75. package/dist/generated/DiscoveryRow.js +2 -0
  76. package/dist/generated/DisplayField.d.ts +7 -0
  77. package/dist/generated/DisplayField.js +1 -0
  78. package/dist/generated/DisplayScalar.d.ts +10 -0
  79. package/dist/generated/DisplayScalar.js +2 -0
  80. package/dist/generated/DisplayValue.d.ts +18 -0
  81. package/dist/generated/DisplayValue.js +1 -0
  82. package/dist/generated/DocumentBlock.d.ts +20 -0
  83. package/dist/generated/DocumentBlock.js +1 -0
  84. package/dist/generated/EnableRequest.d.ts +7 -0
  85. package/dist/generated/EnableRequest.js +2 -0
  86. package/dist/generated/EnableResponse.d.ts +3 -0
  87. package/dist/generated/EnableResponse.js +2 -0
  88. package/dist/generated/ErrorCode.d.ts +1 -0
  89. package/dist/generated/ErrorCode.js +2 -0
  90. package/dist/generated/ExecutionMode.d.ts +1 -0
  91. package/dist/generated/ExecutionMode.js +2 -0
  92. package/dist/generated/FailureKind.d.ts +1 -0
  93. package/dist/generated/FailureKind.js +2 -0
  94. package/dist/generated/FetchOutcome.d.ts +5 -0
  95. package/dist/generated/FetchOutcome.js +2 -0
  96. package/dist/generated/FieldRole.d.ts +1 -0
  97. package/dist/generated/FieldRole.js +2 -0
  98. package/dist/generated/FileChangeOp.d.ts +1 -0
  99. package/dist/generated/FileChangeOp.js +2 -0
  100. package/dist/generated/FileDelta.d.ts +11 -0
  101. package/dist/generated/FileDelta.js +1 -0
  102. package/dist/generated/FileSearchMode.d.ts +1 -0
  103. package/dist/generated/FileSearchMode.js +2 -0
  104. package/dist/generated/FindingItem.d.ts +9 -0
  105. package/dist/generated/FindingItem.js +1 -0
  106. package/dist/generated/FindingSeverity.d.ts +1 -0
  107. package/dist/generated/FindingSeverity.js +2 -0
  108. package/dist/generated/GroupDerivation.d.ts +1 -0
  109. package/dist/generated/GroupDerivation.js +2 -0
  110. package/dist/generated/GroupKind.d.ts +1 -0
  111. package/dist/generated/GroupKind.js +2 -0
  112. package/dist/generated/HeatmapDay.d.ts +16 -0
  113. package/dist/generated/HeatmapDay.js +2 -0
  114. package/dist/generated/HeatmapResponse.d.ts +4 -0
  115. package/dist/generated/HeatmapResponse.js +1 -0
  116. package/dist/generated/HourTotal.d.ts +16 -0
  117. package/dist/generated/HourTotal.js +2 -0
  118. package/dist/generated/HubStatus.d.ts +18 -0
  119. package/dist/generated/HubStatus.js +2 -0
  120. package/dist/generated/ImageVariant.d.ts +1 -0
  121. package/dist/generated/ImageVariant.js +2 -0
  122. package/dist/generated/IngestPhase.d.ts +9 -0
  123. package/dist/generated/IngestPhase.js +2 -0
  124. package/dist/generated/IngestProgress.d.ts +19 -0
  125. package/dist/generated/IngestProgress.js +1 -0
  126. package/dist/generated/ListOutcome.d.ts +3 -0
  127. package/dist/generated/ListOutcome.js +2 -0
  128. package/dist/generated/LocationOutcome.d.ts +5 -0
  129. package/dist/generated/LocationOutcome.js +1 -0
  130. package/dist/generated/MediaMetadata.d.ts +6 -0
  131. package/dist/generated/MediaMetadata.js +2 -0
  132. package/dist/generated/ModeOp.d.ts +1 -0
  133. package/dist/generated/ModeOp.js +2 -0
  134. package/dist/generated/ModelDay.d.ts +20 -0
  135. package/dist/generated/ModelDay.js +2 -0
  136. package/dist/generated/ModelHour.d.ts +8 -0
  137. package/dist/generated/ModelHour.js +2 -0
  138. package/dist/generated/Mutation.d.ts +45 -0
  139. package/dist/generated/Mutation.js +1 -0
  140. package/dist/generated/NativeToolRef.d.ts +6 -0
  141. package/dist/generated/NativeToolRef.js +2 -0
  142. package/dist/generated/Notice.d.ts +48 -0
  143. package/dist/generated/Notice.js +1 -0
  144. package/dist/generated/ParticipantColor.d.ts +1 -0
  145. package/dist/generated/ParticipantColor.js +2 -0
  146. package/dist/generated/ParticipantState.d.ts +1 -0
  147. package/dist/generated/ParticipantState.js +2 -0
  148. package/dist/generated/PermissionOutcome.d.ts +1 -0
  149. package/dist/generated/PermissionOutcome.js +2 -0
  150. package/dist/generated/PlanOp.d.ts +1 -0
  151. package/dist/generated/PlanOp.js +2 -0
  152. package/dist/generated/PricingResponse.d.ts +25 -0
  153. package/dist/generated/PricingResponse.js +1 -0
  154. package/dist/generated/PricingSource.d.ts +7 -0
  155. package/dist/generated/PricingSource.js +2 -0
  156. package/dist/generated/ProcessOp.d.ts +1 -0
  157. package/dist/generated/ProcessOp.js +2 -0
  158. package/dist/generated/ProcessOutcome.d.ts +4 -0
  159. package/dist/generated/ProcessOutcome.js +1 -0
  160. package/dist/generated/ProcessState.d.ts +1 -0
  161. package/dist/generated/ProcessState.js +2 -0
  162. package/dist/generated/ProjectBackfill.d.ts +27 -0
  163. package/dist/generated/ProjectBackfill.js +2 -0
  164. package/dist/generated/ProjectRow.d.ts +6 -0
  165. package/dist/generated/ProjectRow.js +2 -0
  166. package/dist/generated/ProjectsResponse.d.ts +4 -0
  167. package/dist/generated/ProjectsResponse.js +1 -0
  168. package/dist/generated/Provenance.d.ts +5 -0
  169. package/dist/generated/Provenance.js +2 -0
  170. package/dist/generated/QuestionOption.d.ts +5 -0
  171. package/dist/generated/QuestionOption.js +2 -0
  172. package/dist/generated/RangeUnit.d.ts +1 -0
  173. package/dist/generated/RangeUnit.js +2 -0
  174. package/dist/generated/ReadOutcome.d.ts +3 -0
  175. package/dist/generated/ReadOutcome.js +2 -0
  176. package/dist/generated/ReadTarget.d.ts +8 -0
  177. package/dist/generated/ReadTarget.js +1 -0
  178. package/dist/generated/ResourceRef.d.ts +25 -0
  179. package/dist/generated/ResourceRef.js +1 -0
  180. package/dist/generated/ResponseGroup.d.ts +5 -0
  181. package/dist/generated/ResponseGroup.js +1 -0
  182. package/dist/generated/ResponseRuntime.d.ts +9 -0
  183. package/dist/generated/ResponseRuntime.js +2 -0
  184. package/dist/generated/RuntimeBackfill.d.ts +50 -0
  185. package/dist/generated/RuntimeBackfill.js +1 -0
  186. package/dist/generated/RuntimeErrorKind.d.ts +1 -0
  187. package/dist/generated/RuntimeErrorKind.js +2 -0
  188. package/dist/generated/RuntimeIngestStatus.d.ts +30 -0
  189. package/dist/generated/RuntimeIngestStatus.js +2 -0
  190. package/dist/generated/RuntimeProvenance.d.ts +9 -0
  191. package/dist/generated/RuntimeProvenance.js +2 -0
  192. package/dist/generated/RuntimeRow.d.ts +25 -0
  193. package/dist/generated/RuntimeRow.js +1 -0
  194. package/dist/generated/RuntimesResponse.d.ts +4 -0
  195. package/dist/generated/RuntimesResponse.js +1 -0
  196. package/dist/generated/ScheduleOp.d.ts +1 -0
  197. package/dist/generated/ScheduleOp.js +2 -0
  198. package/dist/generated/SearchBuildProgress.d.ts +6 -0
  199. package/dist/generated/SearchBuildProgress.js +1 -0
  200. package/dist/generated/SearchBuildStage.d.ts +1 -0
  201. package/dist/generated/SearchBuildStage.js +2 -0
  202. package/dist/generated/SearchFilter.d.ts +5 -0
  203. package/dist/generated/SearchFilter.js +1 -0
  204. package/dist/generated/SearchFilterKind.d.ts +1 -0
  205. package/dist/generated/SearchFilterKind.js +2 -0
  206. package/dist/generated/SearchHit.d.ts +20 -0
  207. package/dist/generated/SearchHit.js +2 -0
  208. package/dist/generated/SearchOutcome.d.ts +7 -0
  209. package/dist/generated/SearchOutcome.js +1 -0
  210. package/dist/generated/SearchReadiness.d.ts +6 -0
  211. package/dist/generated/SearchReadiness.js +2 -0
  212. package/dist/generated/SearchRequest.d.ts +38 -0
  213. package/dist/generated/SearchRequest.js +2 -0
  214. package/dist/generated/SearchResponse.d.ts +6 -0
  215. package/dist/generated/SearchResponse.js +1 -0
  216. package/dist/generated/SearchState.d.ts +23 -0
  217. package/dist/generated/SearchState.js +1 -0
  218. package/dist/generated/ServerFrame.d.ts +56 -0
  219. package/dist/generated/ServerFrame.js +1 -0
  220. package/dist/generated/ServiceTier.d.ts +7 -0
  221. package/dist/generated/ServiceTier.js +2 -0
  222. package/dist/generated/SessionActivity.d.ts +9 -0
  223. package/dist/generated/SessionActivity.js +2 -0
  224. package/dist/generated/SessionDelegation.d.ts +30 -0
  225. package/dist/generated/SessionDelegation.js +1 -0
  226. package/dist/generated/SessionResponse.d.ts +4 -0
  227. package/dist/generated/SessionResponse.js +1 -0
  228. package/dist/generated/SessionRole.d.ts +1 -0
  229. package/dist/generated/SessionRole.js +2 -0
  230. package/dist/generated/SessionRow.d.ts +38 -0
  231. package/dist/generated/SessionRow.js +1 -0
  232. package/dist/generated/SessionsResponse.d.ts +4 -0
  233. package/dist/generated/SessionsResponse.js +1 -0
  234. package/dist/generated/ShellOutcome.d.ts +5 -0
  235. package/dist/generated/ShellOutcome.js +2 -0
  236. package/dist/generated/SourceLocation.d.ts +7 -0
  237. package/dist/generated/SourceLocation.js +1 -0
  238. package/dist/generated/SourceRange.d.ts +6 -0
  239. package/dist/generated/SourceRange.js +1 -0
  240. package/dist/generated/Stamp.d.ts +13 -0
  241. package/dist/generated/Stamp.js +2 -0
  242. package/dist/generated/StatusBasis.d.ts +1 -0
  243. package/dist/generated/StatusBasis.js +2 -0
  244. package/dist/generated/StatusResponse.d.ts +17 -0
  245. package/dist/generated/StatusResponse.js +1 -0
  246. package/dist/generated/StreamState.d.ts +1 -0
  247. package/dist/generated/StreamState.js +2 -0
  248. package/dist/generated/SummaryPurpose.d.ts +1 -0
  249. package/dist/generated/SummaryPurpose.js +2 -0
  250. package/dist/generated/TaskOp.d.ts +1 -0
  251. package/dist/generated/TaskOp.js +2 -0
  252. package/dist/generated/TaskSnapshot.d.ts +9 -0
  253. package/dist/generated/TaskSnapshot.js +1 -0
  254. package/dist/generated/TaskSnapshotItem.d.ts +13 -0
  255. package/dist/generated/TaskSnapshotItem.js +1 -0
  256. package/dist/generated/TaskStatus.d.ts +1 -0
  257. package/dist/generated/TaskStatus.js +2 -0
  258. package/dist/generated/TextRange.d.ts +4 -0
  259. package/dist/generated/TextRange.js +2 -0
  260. package/dist/generated/TimelineBody.d.ts +33 -0
  261. package/dist/generated/TimelineBody.js +1 -0
  262. package/dist/generated/TimelineEntry.d.ts +37 -0
  263. package/dist/generated/TimelineEntry.js +1 -0
  264. package/dist/generated/TimelineEntryResponse.d.ts +5 -0
  265. package/dist/generated/TimelineEntryResponse.js +1 -0
  266. package/dist/generated/TimelineGroup.d.ts +7 -0
  267. package/dist/generated/TimelineGroup.js +1 -0
  268. package/dist/generated/TimelineMeta.d.ts +10 -0
  269. package/dist/generated/TimelineMeta.js +1 -0
  270. package/dist/generated/TimelineMetaArtifact.d.ts +11 -0
  271. package/dist/generated/TimelineMetaArtifact.js +1 -0
  272. package/dist/generated/TimelineMetaArtifactSource.d.ts +10 -0
  273. package/dist/generated/TimelineMetaArtifactSource.js +1 -0
  274. package/dist/generated/TimelineMetaPlan.d.ts +8 -0
  275. package/dist/generated/TimelineMetaPlan.js +1 -0
  276. package/dist/generated/TimelineMetaPlanSource.d.ts +7 -0
  277. package/dist/generated/TimelineMetaPlanSource.js +2 -0
  278. package/dist/generated/TimelineMetaTask.d.ts +13 -0
  279. package/dist/generated/TimelineMetaTask.js +1 -0
  280. package/dist/generated/TimelineMetaWorkflow.d.ts +30 -0
  281. package/dist/generated/TimelineMetaWorkflow.js +1 -0
  282. package/dist/generated/TimelinePage.d.ts +17 -0
  283. package/dist/generated/TimelinePage.js +1 -0
  284. package/dist/generated/TokenSnapshot.d.ts +61 -0
  285. package/dist/generated/TokenSnapshot.js +1 -0
  286. package/dist/generated/ToolAction.d.ts +245 -0
  287. package/dist/generated/ToolAction.js +1 -0
  288. package/dist/generated/ToolCorrelation.d.ts +5 -0
  289. package/dist/generated/ToolCorrelation.js +1 -0
  290. package/dist/generated/ToolFailure.d.ts +6 -0
  291. package/dist/generated/ToolFailure.js +1 -0
  292. package/dist/generated/ToolInteraction.d.ts +19 -0
  293. package/dist/generated/ToolInteraction.js +1 -0
  294. package/dist/generated/ToolStatus.d.ts +1 -0
  295. package/dist/generated/ToolStatus.js +2 -0
  296. package/dist/generated/ToolStatusFact.d.ts +6 -0
  297. package/dist/generated/ToolStatusFact.js +1 -0
  298. package/dist/generated/ToolTiming.d.ts +5 -0
  299. package/dist/generated/ToolTiming.js +2 -0
  300. package/dist/generated/TruncationScope.d.ts +1 -0
  301. package/dist/generated/TruncationScope.js +2 -0
  302. package/dist/generated/TurnGap.d.ts +8 -0
  303. package/dist/generated/TurnGap.js +2 -0
  304. package/dist/generated/TurnSpan.d.ts +15 -0
  305. package/dist/generated/TurnSpan.js +1 -0
  306. package/dist/generated/UnpricedModel.d.ts +20 -0
  307. package/dist/generated/UnpricedModel.js +2 -0
  308. package/dist/generated/UsageCost.d.ts +18 -0
  309. package/dist/generated/UsageCost.js +2 -0
  310. package/dist/generated/UsageResponse.d.ts +11 -0
  311. package/dist/generated/UsageResponse.js +1 -0
  312. package/dist/generated/UsageScope.d.ts +6 -0
  313. package/dist/generated/UsageScope.js +2 -0
  314. package/dist/generated/UserAnswer.d.ts +5 -0
  315. package/dist/generated/UserAnswer.js +1 -0
  316. package/dist/generated/UserQuestion.d.ts +9 -0
  317. package/dist/generated/UserQuestion.js +1 -0
  318. package/dist/generated/WebNavigationOp.d.ts +1 -0
  319. package/dist/generated/WebNavigationOp.js +2 -0
  320. package/dist/generated/WebSearchOutcome.d.ts +5 -0
  321. package/dist/generated/WebSearchOutcome.js +1 -0
  322. package/dist/generated/WebSource.d.ts +4 -0
  323. package/dist/generated/WebSource.js +2 -0
  324. package/dist/generated/WorkflowAttempt.d.ts +16 -0
  325. package/dist/generated/WorkflowAttempt.js +1 -0
  326. package/dist/generated/WorkflowJournalKind.d.ts +1 -0
  327. package/dist/generated/WorkflowJournalKind.js +2 -0
  328. package/dist/generated/WorkflowJournalObservation.d.ts +21 -0
  329. package/dist/generated/WorkflowJournalObservation.js +1 -0
  330. package/dist/generated/WorkflowPhase.d.ts +5 -0
  331. package/dist/generated/WorkflowPhase.js +2 -0
  332. package/dist/generated/WorkflowResultKind.d.ts +1 -0
  333. package/dist/generated/WorkflowResultKind.js +2 -0
  334. package/dist/generated/WorkflowRun.d.ts +51 -0
  335. package/dist/generated/WorkflowRun.js +1 -0
  336. package/dist/generated/WorkflowRunStatus.d.ts +1 -0
  337. package/dist/generated/WorkflowRunStatus.js +2 -0
  338. package/dist/generated/WorkflowUsage.d.ts +10 -0
  339. package/dist/generated/WorkflowUsage.js +2 -0
  340. package/dist/generated/WorkflowWorker.d.ts +31 -0
  341. package/dist/generated/WorkflowWorker.js +1 -0
  342. package/dist/generated/WorkflowWorkerState.d.ts +1 -0
  343. package/dist/generated/WorkflowWorkerState.js +2 -0
  344. package/dist/generated/serde_json/JsonValue.d.ts +3 -0
  345. package/dist/generated/serde_json/JsonValue.js +2 -0
  346. package/dist/grants.d.ts +67 -0
  347. package/dist/grants.js +160 -0
  348. package/dist/index.d.ts +110 -0
  349. package/dist/index.js +1 -0
  350. package/dist/ordered-cache.d.ts +15 -0
  351. package/dist/ordered-cache.js +63 -0
  352. package/dist/protocol-version.d.mts +1 -0
  353. package/dist/protocol-version.mjs +2 -0
  354. package/package.json +47 -4
package/README.md CHANGED
@@ -1,3 +1,74 @@
1
- # Temporary Holding Version
1
+ # @vibefield/rosetta-protocol
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Install with `npm install @vibefield/rosetta-protocol`. The package ships ESM JavaScript and TypeScript declarations. Its npm version is independent of the wire protocol version.
4
+
5
+ The wire types are generated from `crates/protocol` (ts-rs). Do not edit by hand — regenerate with:
6
+
7
+ ```sh
8
+ TS_RS_EXPORT_DIR=$PWD/clients/ts/generated TS_RS_LARGE_INT=number \
9
+ cargo test -p rosetta-protocol --features ts
10
+ ```
11
+
12
+ `TS_RS_LARGE_INT=number` is deliberate: every 64-bit field on the wire is a
13
+ millisecond timestamp, ordinal, or token count — far below 2^53 — and the
14
+ transport is plain JSON, so `JSON.parse` hands consumers `number`s.
15
+
16
+ `client.ts` is the handwritten transport and subscription implementation.
17
+ Consumers use its cancellation, reconnect, and cache APIs instead of merging
18
+ REST pages with WebSocket state themselves. `SessionSubscription.fetchPage`
19
+ holds history; `reveal` exposes its latest patched values; `loadEntry` adds an
20
+ exact anchor. All three share the snapshot's generation and reset together.
21
+
22
+ The client and Electron supervisor import `protocol-version.mjs`. When changing
23
+ the wire incompatibly, bump it together with Rust's `PROTOCOL_VERSION`, regenerate
24
+ the bindings, and refresh the wire golden. The protocol tests check that both
25
+ languages agree. HTTP responses expose `x-rosetta-protocol-version`; WebSockets
26
+ announce the same version in `hello`. Mismatches fail with an actionable error.
27
+
28
+ ## Package shape
29
+
30
+ `exports` is exactly three entries, and they are the whole public surface:
31
+
32
+ - `.` — the client plus the generated types. `client.ts` uses `fetch`,
33
+ `WebSocket`, `AbortController`, and `URLSearchParams`, so a consumer of this
34
+ entry needs `DOM` in its `lib`.
35
+ - `./protocol-version` — the bare wire number and nothing else. It carries no
36
+ DOM dependency, so a supervisor that only checks a spawned daemon's version
37
+ imports it here instead of dragging the browser client into its typecheck.
38
+ TypeScript resolves the adjacent `protocol-version.d.mts` for the `.mjs`
39
+ under `moduleResolution` `Bundler` or `Node16`.
40
+ - `./grants` — minting and verifying per-session grants (`canonicalize`,
41
+ `mintGrant`, `verifyGrant`, `parseGrantHeader`). Node-only: it signs with
42
+ `node:crypto`, so a browser bundle never imports it. `node-crypto.d.ts`
43
+ declares the two functions it uses, so `tsc -p clients/ts` needs no
44
+ `@types/node`.
45
+
46
+ Everything else is encapsulated by `exports`: there are no deep
47
+ imports of `./client` or `./generated/*`, and adding one is a change to this
48
+ file, not to a consumer.
49
+
50
+ ## Credentials
51
+
52
+ A daemon started with `--token-file` answers 401 to any request without a
53
+ credential (docs/AUTH.md). Pass one as `new RosettaClient({ credential })`,
54
+ or swap it later with `setCredential`:
55
+
56
+ - `{ kind: "bearer", token }` opens every route.
57
+ - `{ kind: "grant", grant }` opens one session's recorded history until the
58
+ grant's `exp` — and that session's recorded-file read (`readFileTarget`)
59
+ when it was minted with `SCOPE_FILES` beside `SCOPE_READ`. The daemon's
60
+ supervisor mints it with `@vibefield/rosetta-protocol/grants`; the client carries it
61
+ as an opaque string.
62
+
63
+ REST requests send it as `Authorization`. WebSocket upgrades send it as the
64
+ subprotocol pair `rosetta` + `rosetta.bearer.<base64url(token)>` or
65
+ `rosetta.grant.<grant>`, because a browser's WebSocket cannot set headers;
66
+ the daemon selects `rosetta`. A 401 throws `UnauthorizedError`, whose
67
+ `reason` is the daemon's `x-rosetta-auth` header. An open socket is not
68
+ re-checked, so a subscription outlives its grant's expiry until it
69
+ reconnects.
70
+
71
+ `npm ci` at the repository root installs the workspaces. `npm test` in this
72
+ directory builds the SDK and runs `test/*.test.mjs` against its emitted JavaScript;
73
+ the grant tests read the shared vectors in
74
+ `crates/server/tests/fixtures/grants.json`.
@@ -0,0 +1,4 @@
1
+ export declare function base64UrlEncode(bytes: Uint8Array): string;
2
+ /** The bytes, or `null` for anything a strict decoder refuses. */
3
+ export declare function base64UrlDecode(text: string): Uint8Array | null;
4
+ export declare function utf8Base64UrlEncode(text: string): string;
@@ -0,0 +1,48 @@
1
+ // base64url without padding (RFC 4648 §5). Decoding is strict — the
2
+ // alphabet only, no padding, zero trailing bits — so every byte string has
3
+ // exactly one spelling, the rule the daemon's decoder applies to grants.
4
+ // Browser-safe: the client encodes a bearer with it, grants.ts both ways.
5
+ const ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
6
+ const VALUES = new Map([...ALPHABET].map((char, index) => [char, index]));
7
+ function digit(value) {
8
+ return ALPHABET.charAt(value & 63);
9
+ }
10
+ export function base64UrlEncode(bytes) {
11
+ let text = "";
12
+ for (let at = 0; at < bytes.length; at += 3) {
13
+ const chunk = ((bytes[at] ?? 0) << 16) | ((bytes[at + 1] ?? 0) << 8) | (bytes[at + 2] ?? 0);
14
+ const width = Math.min(3, bytes.length - at);
15
+ text += digit(chunk >> 18) + digit(chunk >> 12);
16
+ if (width > 1)
17
+ text += digit(chunk >> 6);
18
+ if (width > 2)
19
+ text += digit(chunk);
20
+ }
21
+ return text;
22
+ }
23
+ /** The bytes, or `null` for anything a strict decoder refuses. */
24
+ export function base64UrlDecode(text) {
25
+ if (text.length % 4 === 1)
26
+ return null;
27
+ const bytes = new Uint8Array(Math.floor((text.length * 3) / 4));
28
+ let buffer = 0;
29
+ let bits = 0;
30
+ let index = 0;
31
+ for (const char of text) {
32
+ const value = VALUES.get(char);
33
+ if (value === undefined)
34
+ return null;
35
+ buffer = (buffer << 6) | value;
36
+ bits += 6;
37
+ if (bits >= 8) {
38
+ bits -= 8;
39
+ bytes[index++] = (buffer >> bits) & 0xff;
40
+ buffer &= (1 << bits) - 1;
41
+ }
42
+ }
43
+ // Leftover bits of a canonical encoding are zero.
44
+ return buffer === 0 ? bytes : null;
45
+ }
46
+ export function utf8Base64UrlEncode(text) {
47
+ return base64UrlEncode(new TextEncoder().encode(text));
48
+ }
@@ -0,0 +1,324 @@
1
+ export { PROTOCOL_VERSION } from "./protocol-version.mjs";
2
+ import type { TimelineEntryResponse } from "./generated/TimelineEntryResponse.js";
3
+ import type { ApiError } from "./generated/ApiError.js";
4
+ import type { ImageVariant } from "./generated/ImageVariant.js";
5
+ import type { AssetRef } from "./generated/AssetRef.js";
6
+ import type { BoostResponse } from "./generated/BoostResponse.js";
7
+ import type { ContributionResponse } from "./generated/ContributionResponse.js";
8
+ import type { CommandResponse } from "./generated/CommandResponse.js";
9
+ import type { CollaborationTimeline } from "./generated/CollaborationTimeline.js";
10
+ import type { DiscoveriesResponse } from "./generated/DiscoveriesResponse.js";
11
+ import type { EnableResponse } from "./generated/EnableResponse.js";
12
+ import type { ErrorCode } from "./generated/ErrorCode.js";
13
+ import type { HeatmapResponse } from "./generated/HeatmapResponse.js";
14
+ import type { ProjectRow } from "./generated/ProjectRow.js";
15
+ import type { ProjectsResponse } from "./generated/ProjectsResponse.js";
16
+ import type { RuntimeRow } from "./generated/RuntimeRow.js";
17
+ import type { RuntimesResponse } from "./generated/RuntimesResponse.js";
18
+ import type { SearchRequest } from "./generated/SearchRequest.js";
19
+ import type { SearchResponse } from "./generated/SearchResponse.js";
20
+ import type { ServerFrame } from "./generated/ServerFrame.js";
21
+ import type { SessionResponse } from "./generated/SessionResponse.js";
22
+ import type { SessionRow } from "./generated/SessionRow.js";
23
+ import type { SessionsResponse } from "./generated/SessionsResponse.js";
24
+ import type { Stamp } from "./generated/Stamp.js";
25
+ import type { StatusResponse } from "./generated/StatusResponse.js";
26
+ import type { TimelinePage } from "./generated/TimelinePage.js";
27
+ import type { TimelineEntry } from "./generated/TimelineEntry.js";
28
+ import type { TimelineMeta } from "./generated/TimelineMeta.js";
29
+ import type { TimelineMetaPlanSource } from "./generated/TimelineMetaPlanSource.js";
30
+ import type { PricingResponse } from "./generated/PricingResponse.js";
31
+ import type { UsageResponse } from "./generated/UsageResponse.js";
32
+ import type { ActivityResponse } from "./generated/ActivityResponse.js";
33
+ import type { DayUsageResponse } from "./generated/DayUsageResponse.js";
34
+ export declare const DEFAULT_BASE_URL = "http://127.0.0.1:4640";
35
+ /**
36
+ * How a client proves itself to a daemon started with `--token-file`
37
+ * (docs/AUTH.md). A bearer opens every route; a grant opens one session's
38
+ * recorded history until its `exp`. The client only carries a grant, as an
39
+ * opaque string: minting needs the key (`@vibefield/rosetta-protocol/grants`).
40
+ */
41
+ export type RosettaCredential = {
42
+ readonly kind: "bearer";
43
+ readonly token: string;
44
+ } | {
45
+ readonly kind: "grant";
46
+ readonly grant: string;
47
+ };
48
+ /** Why a daemon refused a request: the `x-rosetta-auth` header of its 401. */
49
+ export type AuthRefusal = "missing" | "bad-token" | "malformed" | "bad-signature" | "expired" | "wrong-session" | "wrong-scope" | "wrong-route" | "grants-disabled";
50
+ export declare const AUTH_REFUSALS: readonly AuthRefusal[];
51
+ export declare const AUTH_REASON_HEADER = "x-rosetta-auth";
52
+ /** The subprotocol a daemon selects for a credentialed WebSocket upgrade. */
53
+ export declare const AUTH_WS_PROTOCOL = "rosetta";
54
+ /** The `Authorization` value that presents `credential`. */
55
+ export declare function authorizationHeader(credential: RosettaCredential): string;
56
+ /**
57
+ * A browser's WebSocket cannot set `Authorization`, so the credential rides
58
+ * the subprotocol list beside the marker the daemon selects. The daemon
59
+ * never echoes the credential entry.
60
+ */
61
+ export declare function webSocketProtocols(credential: RosettaCredential): string[];
62
+ export interface RosettaClientOptions {
63
+ baseUrl?: string;
64
+ /** Injectable for Node or test environments. */
65
+ fetchFn?: typeof fetch;
66
+ WebSocketImpl?: typeof WebSocket;
67
+ requestTimeoutMs?: number;
68
+ notificationIntervalMs?: number;
69
+ /** Presented on every request and upgrade; see {@link RosettaCredential}. */
70
+ credential?: RosettaCredential;
71
+ }
72
+ export declare class ApiRequestError extends Error {
73
+ readonly status: number;
74
+ readonly code: ErrorCode | null;
75
+ constructor(status: number, code: ErrorCode | null, message: string);
76
+ }
77
+ /** The bound watermark no longer matches: refetch from the head. */
78
+ export declare class CursorExpiredError extends ApiRequestError {
79
+ constructor(message: string);
80
+ }
81
+ /** A 401: the daemon wants a credential this client did not present, or
82
+ * refused the one it did. `reason` is null only from a daemon that named
83
+ * none. */
84
+ export declare class UnauthorizedError extends ApiRequestError {
85
+ readonly reason: AuthRefusal | null;
86
+ constructor(reason: AuthRefusal | null, message: string);
87
+ }
88
+ export type SubscriptionStatus = "connecting" | "syncing" | "live" | "resyncing" | "closed";
89
+ export interface SessionSubscriptionHandlers {
90
+ /** Every replacement invalidates all loaded history, anchors, and in-flight reads. */
91
+ onReset?: () => void;
92
+ onSnapshot?: (page: TimelinePage) => void;
93
+ /** The full ordered visible timeline after each coalesced change. */
94
+ onChange?: (entries: TimelineEntry[]) => void;
95
+ /** The complete light work index. Bodies remain behind lazy references. */
96
+ onTimelineMetaChange?: (timelineMeta: TimelineMeta) => void;
97
+ onStatus?: (status: SubscriptionStatus) => void;
98
+ onError?: (error: ApiError) => void;
99
+ }
100
+ export interface MetaState {
101
+ runtimes: RuntimeRow[];
102
+ projects: ProjectRow[];
103
+ sessions: SessionRow[];
104
+ }
105
+ export interface MetaSubscriptionHandlers {
106
+ /** Snapshots establish a baseline; only mutations describe subsequent changes. */
107
+ onChange?: (state: MetaState, source: "snapshot" | "mutation") => void;
108
+ onStatus?: (status: SubscriptionStatus) => void;
109
+ onError?: (error: ApiError) => void;
110
+ }
111
+ export declare class RosettaClient {
112
+ private origin;
113
+ get baseUrl(): string;
114
+ private connection;
115
+ private readonly connectionListeners;
116
+ private readonly subscriptions;
117
+ private readonly requestTimeoutMs;
118
+ private readonly notificationIntervalMs;
119
+ private readonly fetchFn;
120
+ private readonly WebSocketImpl;
121
+ private credential;
122
+ constructor(options?: RosettaClientOptions);
123
+ /**
124
+ * Replace the credential (a refreshed grant, a rotated bearer), or drop
125
+ * it. Later requests and every later (re)connect present it. An open
126
+ * socket is left alone: the daemon checks a credential at the upgrade, so
127
+ * a grant that expires under a live subscription ends only with its
128
+ * socket, and the reconnect then needs a fresh one.
129
+ */
130
+ setCredential(credential: RosettaCredential | null): void;
131
+ private response;
132
+ private request;
133
+ status(signal?: AbortSignal): Promise<StatusResponse>;
134
+ /** The roll call's census — what discovery found, content-free. */
135
+ discoveries(signal?: AbortSignal): Promise<DiscoveriesResponse>;
136
+ /** Consent: enroll the chosen agent kinds. Grantable exactly once, while
137
+ * the daemon is awaiting consent. */
138
+ enableRuntimes(kinds: string[], signal?: AbortSignal): Promise<EnableResponse>;
139
+ /** Attention-directed ingestion: the reader opened a still-queued
140
+ * session — ask the daemon to read it next. Advisory; safe to fire on
141
+ * every selection of a pending session. */
142
+ boost(sessionId: string, signal?: AbortSignal): Promise<BoostResponse>;
143
+ runtimes(signal?: AbortSignal): Promise<RuntimesResponse>;
144
+ projects(signal?: AbortSignal): Promise<ProjectsResponse>;
145
+ sessions(options?: {
146
+ project?: string;
147
+ limit?: number;
148
+ native_session_id?: string;
149
+ }, signal?: AbortSignal): Promise<SessionsResponse>;
150
+ /** Resolve canonical rows for provider-native session ids; children come
151
+ * back too, and `root_session_id` names the navigable thread. */
152
+ sessionsByNativeId(nativeSessionIds: readonly string[], signal?: AbortSignal): Promise<SessionsResponse>;
153
+ session(id: string, signal?: AbortSignal): Promise<SessionResponse>;
154
+ /**
155
+ * One backward page. Pass the previous page's `cursor` to continue; a
156
+ * rewrite underneath throws {@link CursorExpiredError} — refetch from the
157
+ * head (no cursor).
158
+ */
159
+ timeline(sessionId: string, options?: {
160
+ limit?: number;
161
+ cursor?: string;
162
+ }, signal?: AbortSignal): Promise<TimelinePage>;
163
+ /** Complete delivered collaboration history for one team member. The
164
+ * response deliberately excludes private prose and tool rows. */
165
+ collaborationTimeline(sessionId: string, signal?: AbortSignal): Promise<CollaborationTimeline>;
166
+ /** An exact row and the generation it belongs to. */
167
+ timelineEntryResponse(sessionId: string, timelineId: string, signal?: AbortSignal): Promise<TimelineEntryResponse>;
168
+ timelineEntry(sessionId: string, timelineId: string, signal?: AbortSignal): Promise<TimelineEntry>;
169
+ reportWork(sessionId: string, timelineId: string, signal?: AbortSignal): Promise<TimelineEntry[]>;
170
+ /** Recover one deliberately omitted command body from its raw-ledger
171
+ * record. Nothing is fetched until the reader opens the disclosure. */
172
+ command(sessionId: string, timelineId: string, signal?: AbortSignal): Promise<CommandResponse>;
173
+ /** Read the live file named by one canonical file-bearing target. The caller
174
+ * supplies identities and an index, never a path; the daemon resolves the
175
+ * exact path already stored on that timeline row. */
176
+ /** Direct image URLs let the browser share compressed and decoded resources.
177
+ * Recipes are finite, versioned and enforced by the daemon. */
178
+ imageAssetUrl(asset: AssetRef, variant: ImageVariant): string;
179
+ imageFileTargetUrl(sessionId: string, timelineId: string, targetIndex: number, variant: ImageVariant): string;
180
+ readFileTarget(sessionId: string, timelineId: string, targetIndex: number, signal?: AbortSignal): Promise<Uint8Array>;
181
+ /** Resolve a canonical oversized-text member only when its disclosure is
182
+ * opened. Asset references are daemon-owned and may not redirect this
183
+ * authenticated/local client to another origin. */
184
+ readTextAsset(asset: AssetRef, signal?: AbortSignal): Promise<string>;
185
+ readAsset(asset: AssetRef, signal?: AbortSignal): Promise<Uint8Array>;
186
+ /** Read one exact plan document selected from timeline_meta. */
187
+ readPlan(sessionId: string, source: TimelineMetaPlanSource, signal?: AbortSignal): Promise<Uint8Array>;
188
+ search(request: SearchRequest, signal?: AbortSignal): Promise<SearchResponse>;
189
+ heatmap(projectId: string, options?: {
190
+ sinceMs?: number;
191
+ offsetMinutes?: number;
192
+ }, signal?: AbortSignal): Promise<HeatmapResponse>;
193
+ contribution(projectId: string, signal?: AbortSignal): Promise<ContributionResponse>;
194
+ /** The heatmap figure's decomposition over the same window: per-model days
195
+ * (they sum back to the heatmap exactly) plus an hour-of-day profile. */
196
+ usage(projectId: string, options?: {
197
+ sinceMs?: number;
198
+ offsetMinutes?: number;
199
+ }, signal?: AbortSignal): Promise<UsageResponse>;
200
+ /** Hourly model tokens for one date, using the heatmap's timezone offset. */
201
+ dayUsage(projectId: string, day: string, offsetMinutes?: number, signal?: AbortSignal): Promise<DayUsageResponse>;
202
+ /** Which top-level sessions were active in a window of at most seven days,
203
+ * newest recorded activity first, each with its tree's turns and the gaps
204
+ * inside them longer than `gapMs` (15 minutes unless asked). It spans
205
+ * sessions, so it needs the bearer. */
206
+ activity(window: {
207
+ sinceMs: number;
208
+ untilMs?: number;
209
+ sessions?: readonly string[];
210
+ gapMs?: number;
211
+ limit?: number;
212
+ }, signal?: AbortSignal): Promise<ActivityResponse>;
213
+ /** The price catalog behind every cost figure: its basis (list-price
214
+ * equivalent), version, sources, and the catalog the projection's rollup
215
+ * was priced with. */
216
+ pricing(signal?: AbortSignal): Promise<PricingResponse>;
217
+ /** A restarted app-owned daemon may bind another port. Abort old requests
218
+ * and reconnect existing consumers without losing the reader's selection. */
219
+ setBaseUrl(baseUrl: string): void;
220
+ onConnectionChange(listener: () => void): () => void;
221
+ private transport;
222
+ subscribeSession(sessionId: string, handlers: SessionSubscriptionHandlers): SessionSubscription;
223
+ subscribeMeta(handlers: MetaSubscriptionHandlers): MetaSubscription;
224
+ subscribeCollaboration(sessionId: string, handlers: CollaborationSubscriptionHandlers): CollaborationSubscription;
225
+ }
226
+ interface SubscriptionTransport {
227
+ url: () => string;
228
+ /** The credential's subprotocol pair, read at every (re)connect. */
229
+ protocols: () => string[] | undefined;
230
+ socket: typeof WebSocket;
231
+ interval: number;
232
+ onClose: (sub: BaseSubscription) => void;
233
+ }
234
+ declare abstract class BaseSubscription {
235
+ protected stamp: Stamp | null;
236
+ protected closed: boolean;
237
+ private readonly transport;
238
+ private socket;
239
+ private attempts;
240
+ private status;
241
+ private reconnectTimer;
242
+ private deadline;
243
+ private changeTimer;
244
+ constructor(transport: SubscriptionTransport);
245
+ protected start(): void;
246
+ private connect;
247
+ private retry;
248
+ private clearDeadline;
249
+ protected live(): void;
250
+ protected setStatus(status: SubscriptionStatus): void;
251
+ protected changed(immediate?: boolean): void;
252
+ protected cancelChange(): void;
253
+ /** Drop a generation and request an authoritative snapshot. */
254
+ restart(): void;
255
+ close(): void;
256
+ protected abstract invalidate(): void;
257
+ protected abstract handleFrame(frame: ServerFrame): void;
258
+ protected abstract flushChanges(): void;
259
+ protected abstract onStatus(status: SubscriptionStatus): void;
260
+ protected abstract onError(error: ApiError): void;
261
+ protected dispose(): void;
262
+ }
263
+ export declare class SessionSubscription extends BaseSubscription {
264
+ private readonly handlers;
265
+ private readonly client;
266
+ private readonly sessionId;
267
+ private readonly rows;
268
+ private readonly visible;
269
+ private timelineMeta;
270
+ private generation;
271
+ private watermark;
272
+ private readonly pending;
273
+ private rowsDirty;
274
+ private metaDirty;
275
+ constructor(transport: SubscriptionTransport, handlers: SessionSubscriptionHandlers, client: RosettaClient, sessionId: string);
276
+ entries(): TimelineEntry[];
277
+ protected dispose(): void;
278
+ protected invalidate(): void;
279
+ protected handleFrame(frame: ServerFrame): void;
280
+ private apply;
281
+ /** Hold a page in this cache without displaying it until the reader pulls. */
282
+ fetchPage(cursor: string, limit?: number, signal?: AbortSignal): Promise<TimelinePage>;
283
+ /** Reveal cached identities using their latest patched values. */
284
+ reveal(entries: readonly TimelineEntry[]): void;
285
+ loadEntry(timelineId: string, signal?: AbortSignal): Promise<boolean>;
286
+ private read;
287
+ protected flushChanges(): void;
288
+ protected onStatus(status: SubscriptionStatus): void;
289
+ protected onError(error: ApiError): void;
290
+ }
291
+ export declare class MetaSubscription extends BaseSubscription {
292
+ private readonly handlers;
293
+ private readonly runtimes;
294
+ private readonly projects;
295
+ private readonly sessions;
296
+ private dirty;
297
+ private source;
298
+ constructor(transport: SubscriptionTransport, handlers: MetaSubscriptionHandlers);
299
+ state(): MetaState;
300
+ protected invalidate(): void;
301
+ protected handleFrame(frame: ServerFrame): void;
302
+ protected flushChanges(): void;
303
+ protected onStatus(status: SubscriptionStatus): void;
304
+ protected onError(error: ApiError): void;
305
+ }
306
+ export interface CollaborationSubscriptionHandlers {
307
+ onChange?: (state: CollaborationTimeline) => void;
308
+ onReset?: () => void;
309
+ onStatus?: (status: SubscriptionStatus) => void;
310
+ onError?: (error: ApiError) => void;
311
+ }
312
+ export declare class CollaborationSubscription extends BaseSubscription {
313
+ private readonly handlers;
314
+ private readonly rows;
315
+ private readonly observations;
316
+ private dirty;
317
+ constructor(transport: SubscriptionTransport, handlers: CollaborationSubscriptionHandlers);
318
+ private observe;
319
+ protected invalidate(): void;
320
+ protected handleFrame(frame: ServerFrame): void;
321
+ protected flushChanges(): void;
322
+ protected onStatus(status: SubscriptionStatus): void;
323
+ protected onError(error: ApiError): void;
324
+ }