@sema-agent/sdk 0.0.118 → 0.0.120

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 (2) hide show
  1. package/openapi.yaml +146 -7
  2. package/package.json +1 -1
package/openapi.yaml CHANGED
@@ -1213,6 +1213,26 @@ paths:
1213
1213
  schema: { $ref: '#/components/schemas/PendingList' }
1214
1214
  '401': { $ref: '#/components/responses/Unauthorized' }
1215
1215
 
1216
+ /v1/approvals/stream:
1217
+ parameters:
1218
+ - $ref: '#/components/parameters/PrincipalHeader'
1219
+ get:
1220
+ tags: [approvals]
1221
+ operationId: approvalsStream
1222
+ x-status: live # spec-path-gate 首批回填 2026-07-27(design/80 native push;SDK approvals.stream 消费)
1223
+ summary: SSE — pending-approval deltas (subscribe once instead of polling GET /v1/approvals).
1224
+ description: >
1225
+ Frames: `meta` ({type,version,mode:"approvals-delta",pollMs}) then `pending`/`resolved` deltas (each
1226
+ data payload mirrors its SSE event name in `data.type` — proxy-safe dispatch). Cross-replica by
1227
+ construction (polls the SHARED checkpoint table). 15-min cap + heartbeats; a DB blip retries, never
1228
+ kills the stream. Scope = the caller's principal (operator/trace token = fleet-wide).
1229
+ responses:
1230
+ '200':
1231
+ description: text/event-stream of meta/pending/resolved frames.
1232
+ content:
1233
+ text/event-stream:
1234
+ schema: { type: string }
1235
+ '401': { $ref: '#/components/responses/Unauthorized' }
1216
1236
  /v1/approvals/{sessionId}/decide:
1217
1237
  parameters:
1218
1238
  - $ref: '#/components/parameters/PrincipalHeader'
@@ -1638,6 +1658,61 @@ paths:
1638
1658
  schema: { $ref: '#/components/schemas/UsageInfo' }
1639
1659
  '401': { $ref: '#/components/responses/Unauthorized' }
1640
1660
 
1661
+ /v1/usage/summary:
1662
+ parameters:
1663
+ - $ref: '#/components/parameters/PrincipalHeader'
1664
+ get:
1665
+ tags: [usage]
1666
+ operationId: usageSummary
1667
+ x-status: live # spec-path-gate 首批回填 2026-07-27(SDK usage.summary() 已消费)
1668
+ summary: Windowed usage totals (usage-analytics face).
1669
+ description: >
1670
+ READ-ONLY analytics aggregate over the caller's principal (operator/trace token = fleet-wide). Query:
1671
+ `from`/`to` (ISO), `owner` (fleet-wide callers only). Response is the analytics aggregate — an OPEN
1672
+ object (additive fields ride; consumers branch on known keys only).
1673
+ responses:
1674
+ '200':
1675
+ description: Aggregate totals for the window.
1676
+ content:
1677
+ application/json:
1678
+ schema: { type: object, additionalProperties: true }
1679
+ '401': { $ref: '#/components/responses/Unauthorized' }
1680
+ /v1/usage/series:
1681
+ parameters:
1682
+ - $ref: '#/components/parameters/PrincipalHeader'
1683
+ get:
1684
+ tags: [usage]
1685
+ operationId: usageSeries
1686
+ x-status: live # spec-path-gate 首批回填 2026-07-27(SDK usage.series() 已消费)
1687
+ summary: Usage time series (UTC buckets; empty buckets are OMITTED — consumers zero-fill).
1688
+ description: >
1689
+ Query: `metric` = tasks|tokensIn|tokensOut|costUsd, plus the summary window params. Buckets ride as an
1690
+ OPEN object array (additive fields ride).
1691
+ responses:
1692
+ '200':
1693
+ description: Time-series buckets (sparse — missing bucket = zero).
1694
+ content:
1695
+ application/json:
1696
+ schema: { type: object, additionalProperties: true }
1697
+ '401': { $ref: '#/components/responses/Unauthorized' }
1698
+ /v1/usage/breakdown:
1699
+ parameters:
1700
+ - $ref: '#/components/parameters/PrincipalHeader'
1701
+ get:
1702
+ tags: [usage]
1703
+ operationId: usageBreakdown
1704
+ x-status: live # spec-path-gate 首批回填 2026-07-27(SDK usage.breakdown() 已消费)
1705
+ summary: Usage broken down by dimension.
1706
+ description: >
1707
+ Query: `dimension` = principal|model (default principal), plus the summary window params. OPEN object.
1708
+ responses:
1709
+ '200':
1710
+ description: Per-dimension buckets.
1711
+ content:
1712
+ application/json:
1713
+ schema: { type: object, additionalProperties: true }
1714
+ '401': { $ref: '#/components/responses/Unauthorized' }
1715
+
1641
1716
  /v1/policy:
1642
1717
  parameters:
1643
1718
  - $ref: '#/components/parameters/PrincipalHeader'
@@ -1762,6 +1837,67 @@ paths:
1762
1837
  '404': { description: no pending question for this id (non-owner, answered, expired, or wrong replica) — no existence oracle. }
1763
1838
  '501': { description: AskUserQuestion is not enabled on this worker (ASK_QUESTION_ENABLED). }
1764
1839
 
1840
+ /v1/tool-approvals/{id}/respond:
1841
+ parameters:
1842
+ - $ref: '#/components/parameters/PrincipalHeader'
1843
+ - { name: id, in: path, required: true, schema: { type: string } }
1844
+ post:
1845
+ tags: [questions]
1846
+ operationId: toolApprovalRespond
1847
+ x-status: live # spec-path-gate 首批回填 2026-07-27([816]/[820]② CC 三选卡;SDK toolApprovals.respond 消费)
1848
+ summary: Answer a live policy `ask` (the CC three-choice card). LIVE-ONLY + same-replica.
1849
+ description: >
1850
+ Body `{decision: "allow"|"allow_session"|"deny", updatedInput?}` (`allow_session` additionally arms the
1851
+ per-session allow-all for the fs-write family; `updatedInput` = ctrl+g edited args, server ≥1.28x G7).
1852
+ Owner-gated with NO existence oracle (wrong owner / wrong replica / after settle or TTL → 404); body is
1853
+ validated FIRST (400 is existence-independent). 501 when TOOL_APPROVAL_ENABLED is off.
1854
+ requestBody:
1855
+ required: true
1856
+ content:
1857
+ application/json:
1858
+ schema:
1859
+ type: object
1860
+ required: [decision]
1861
+ additionalProperties: true
1862
+ properties:
1863
+ decision: { type: string, enum: [allow, allow_session, deny] }
1864
+ updatedInput: { description: 'ctrl+g edited tool args (replaces the asked args on allow).' }
1865
+ responses:
1866
+ '200':
1867
+ description: Ack (`decision` echoed).
1868
+ content:
1869
+ application/json:
1870
+ schema: { type: object, additionalProperties: true }
1871
+ '400': { description: Malformed body (existence-independent). }
1872
+ '401': { $ref: '#/components/responses/Unauthorized' }
1873
+ '404': { description: Unknown/settled/expired/foreign approval (no existence oracle). }
1874
+ '501': { description: Live tool-approval HITL not enabled (TOOL_APPROVAL_ENABLED). }
1875
+
1876
+ /v1/side-query:
1877
+ parameters:
1878
+ - $ref: '#/components/parameters/PrincipalHeader'
1879
+ post:
1880
+ tags: [tasks]
1881
+ operationId: sideQuery
1882
+ x-status: live # spec-path-gate 首批回填 2026-07-27([1469] server 1.242;SDK sideQuery 消费)
1883
+ summary: One-shot brain-routed Q&A — no session side effects, no tools, no streaming (v1).
1884
+ description: >
1885
+ Utility transport for a shell-side one-off question. Probe `capabilities.sideQuery`. Body/response are
1886
+ OPEN objects (the brain answer rides `answer`; additive fields ride).
1887
+ requestBody:
1888
+ required: true
1889
+ content:
1890
+ application/json:
1891
+ schema: { type: object, additionalProperties: true }
1892
+ responses:
1893
+ '200':
1894
+ description: The one-shot answer.
1895
+ content:
1896
+ application/json:
1897
+ schema: { type: object, additionalProperties: true }
1898
+ '401': { $ref: '#/components/responses/Unauthorized' }
1899
+ '501': { description: side-query not enabled on this worker. }
1900
+
1765
1901
  /v1/workflows:
1766
1902
  parameters:
1767
1903
  - $ref: '#/components/parameters/PrincipalHeader'
@@ -2433,13 +2569,16 @@ components:
2433
2569
  the user wants only files reverted. Target = a user-message SessionTreeEntry.id.
2434
2570
  permissionMode:
2435
2571
  type: string
2436
- enum: [default, plan, acceptEdits, bypassPermissions]
2572
+ enum: [default, plan, acceptEdits, bypassPermissions, auto]
2437
2573
  description: >
2438
- CC permission-mode INTENT. The frontend (TUI shell / web portal) carries the RAW mode; the SERVICE
2439
- INTERPRETS it (axis-aware, tighten-only): `plan` ⇒ mount present_plan (core enablePlanMode) + read-only
2440
- hands (handsReadOnly) = CC EnterPlanMode read-only research; `acceptEdits`/`bypassPermissions` are
2441
- loosening, not honorable remotely (coerced to default engine-side, enforced client-side). Carrying the
2442
- intent (not pre-interpreted core fields) = one interpretation across frontends + service-owned governance.
2574
+ CC permission-mode INTENT (the five CC modes verbatim, post-[816]/[820]/[822]). The frontend (TUI shell /
2575
+ web portal) carries the RAW mode; the SERVICE interprets it TIGHTEN-ONLY vs the deployment baseline:
2576
+ `plan` ⇒ mount present_plan (core enablePlanMode) + read-only hands (CC EnterPlanMode research);
2577
+ `default` adds the manual ask gate; `auto` = same ask gate with core's auto-mode classifier screening
2578
+ asks upstream (entitlement-gated in core); `acceptEdits`/`bypassPermissions` are honored as
2579
+ "add less/no mode-derived gating" — they can never subtract from the deployment/operator policy
2580
+ (deny-wins). An unknown string coerces to `default` (the most-asking mode). Carrying the intent
2581
+ (not pre-interpreted core fields) = one interpretation across frontends + service-owned governance.
2443
2582
  attachmentIds:
2444
2583
  type: array
2445
2584
  maxItems: 16
@@ -3050,7 +3189,7 @@ components:
3050
3189
  sessionDelete: { type: boolean, description: "Session delete verb." }
3051
3190
  sessionInit: { type: boolean, description: "Session pre-initialization verb." }
3052
3191
  sessionPolicy: { type: boolean, description: "E6 per-session operator-tightened tool rules are durable." }
3053
- usage: { type: boolean, description: "Usage analytics face." }
3192
+ usage: { type: boolean, description: "QUOTA face wired (server costQuota dep — cost/token budget enforcement + per-principal accounting). NOT an analytics-availability probe ([1871] B15): per-turn analytics (turn_end.usage, model_usage frames) are engine-side and unconditional, and GET /v1/usage always answers 200 (with `enabled: false` when the quota face is off). Gate quota UI on this key; never gate analytics on it." }
3054
3193
  policy: { type: boolean, description: "`GET /v1/policy` (autonomy/permission READ side)." }
3055
3194
  permissionModeWrite: { type: boolean, description: "Runtime permission-mode WRITE. Advertised false by design — autonomy is CONFIG, not steer; the READ side is `policy`." }
3056
3195
  modelSelection: { type: boolean, description: "`model` accepted per request." }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema-agent/sdk",
3
- "version": "0.0.118",
3
+ "version": "0.0.120",
4
4
  "description": "Typed, zero-runtime-dependency SDK for the Sema agent fleet usage plane. The shared substrate for all doors (CC/Codex MCP façade + web). Server-side only — tokens never enter the browser.",
5
5
  "type": "module",
6
6
  "license": "BUSL-1.1",