sentisense 0.53.0 → 0.54.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.
package/README.md CHANGED
@@ -170,7 +170,22 @@ Most methods resolve to the payload directly, but two families wrap it. The retu
170
170
 
171
171
  **1. Tier-gated endpoints return a preview envelope.** The payload is in `data`, and `isPreview` tells you whether it was truncated for your tier. `totalCount` carries the untruncated size whenever the server knows it: on a truncated response, so you can render "showing N of M", and on a paged endpoint such as `politicians.getActivity`, where it is the full match count on every tier including PRO. A missing `totalCount` means "count `data` yourself", never "zero results".
172
172
 
173
- Affected: `institutional.getFlows` / `getHolders` / `getActivists`, and all five `insights` methods.
173
+ Affected: every method whose declared return type is `PreviewResponse<T>`. A test keeps this table in step with the source, so it is the full list rather than a sample.
174
+
175
+ | Namespace | Methods |
176
+ |-----------|---------|
177
+ | `analyst` | `consensus` `actions` `estimates` `marketActivity` `coverage` `profile` `calls` |
178
+ | `calendar` | `getEarnings` |
179
+ | `earnings` | `getSummaries` `getRecent` |
180
+ | `etfs` | `analystAggregate` `insiderAggregate` `sentimentAggregate` |
181
+ | `insider` | `getActivity` `getTrades` `getClusterBuys` |
182
+ | `insights` | `stock` `stockRange` `market` `latest` `user` |
183
+ | `institutional` | `getFlows` `getHolders` `getActivists` |
184
+ | `options` | `getOverview` |
185
+ | `politicians` | `getActivity` `getFilings` `getMembers` `getMember` |
186
+ | `stocks` | `getSentiment` `getKpis` `getOptionsSummary` `getOptionsHistory` |
187
+
188
+ The envelope itself is always an object, so test the payload rather than the response. Two of these declare a `data` that can be null: `stocks.getOptionsSummary`, for a ticker outside the covered options universe, and `options.getOverview`, before its first nightly build. Everywhere else `data` is an array or an object.
174
189
 
175
190
  ```typescript
176
191
  const flows = await client.institutional.getFlows();
@@ -475,11 +490,11 @@ client.stocks.getOptionsHistory("NVDA", { window: "2y" }) // That name's daily
475
490
 
476
491
  The radar carries two separately-ranked boards: `data.rows` for stocks and `data.etfRows` for ETFs. Keep them apart. Every reading behind a row's `interestScore` is a percentile of that ticker's own trailing history, so a ranking built across both boards compares numbers measured against different baselines. The aggregates split the same way, with the `etf`-prefixed fields describing the ETF board alone.
477
492
 
478
- A row whose baseline is still building carries its raw readings with the percentiles and `interestScore` omitted, which means "not enough history yet" rather than "nothing interesting". `getOptionsSummary` reports an uncovered ticker as a `null` payload; `getOptionsHistory` reports it as an empty `series` instead, so check the array rather than null-checking there.
493
+ A row whose baseline is still building carries its raw readings with the percentiles and `interestScore` omitted, which means "not enough history yet" rather than "nothing interesting". `getOptionsSummary` reports an uncovered ticker as a null payload inside the usual envelope, so the check is `result.data === null`: the response object itself is always truthy, and a bare `if (summary === null)` never fires. `getOptionsHistory` reports it as an empty `series` instead, so check the array's length rather than null-checking there.
479
494
 
480
495
  ### SentiSense Rating
481
496
 
482
- Where a stock ranks against the other stocks rated that day, as a score, a letter and a percentile, plus the six dimensions the rank is blended from. It is a relative research signal for informational and educational purposes, not financial, investment or trading advice, and not a recommendation about any security. Every response carries the wording to display alongside a grade in `disclaimer`. [Methodology](https://sentisense.ai/methodology/#sentisense-rating).
497
+ Where a stock ranks against the other stocks rated that day, as a score, a letter and a percentile, plus the seven dimensions the rank is blended from. It is a relative research signal for informational and educational purposes, not financial, investment or trading advice, and not a recommendation about any security. Every response carries the wording to display alongside a grade in `disclaimer`. [Methodology](https://sentisense.ai/methodology/#sentisense-rating).
483
498
 
484
499
  ```typescript
485
500
  const rating = await client.stocks.getRating("AAPL");
@@ -498,7 +513,7 @@ if (rating.rated) {
498
513
 
499
514
  Having no grade is a normal 200, not a 404: ETFs and tickers outside the swept universe answer that way, and `reason` is one of `stale`, `not_rated_today`, `insufficient_dimensions` or `insufficient_coverage_weight`. Only a ticker that resolves to nothing we track rejects with `NotFoundError`.
500
515
 
501
- `dimensions` always holds all six rows in a fixed order, including the ones with no data, which arrive with `present` false and a `null` percentile. Read `present` first and never substitute zero for a missing percentile: zero is the bottom of the cross-section, absence is not a position on it. Only the smart-money dimension carries `subLegs`.
516
+ `dimensions` always holds all seven rows in a fixed order, including the ones with no data, which arrive with `present` false and a `null` percentile. Read `present` first and never substitute zero for a missing percentile: zero is the bottom of the cross-section, absence is not a position on it. Only the smart-money dimension carries `subLegs`.
502
517
 
503
518
  **`score` is not `percentile`.** `percentile` is the rank of the blended signals against the day's rated set. `score = percentile - sum(riskAdjustments.map((a) => a.points))`, floored at 10 when fewer than five dimensions are available, and it is the number `letter` bands (A 90, B 70, C 30, D 10). `bucketLetter` is the band the percentile alone would give, so the two letters differ by exactly what the conditions cost. `riskAdjustments` itemises that cost, `penaltyPoints` totals it, and `riskConditions` names the active ones from the `RiskCondition` union: `thin_coverage`, `weak_dimension`, `unprofitable`, `no_fundamentals`, `high_leverage`, `unseasoned_listing`, `small_market_cap`, `thin_liquidity`, `extended_price`, `insider_selling` and `institutional_outflow`.
504
519
 
package/dist/cli.cjs CHANGED
@@ -1324,7 +1324,7 @@ var flowsCommand = {
1324
1324
  };
1325
1325
 
1326
1326
  // src/version.ts
1327
- var VERSION = "0.53.0";
1327
+ var VERSION = "0.54.0";
1328
1328
 
1329
1329
  // src/resources/analyst.ts
1330
1330
  var Analyst = class {
@@ -3452,6 +3452,7 @@ var optionsCommand = {
3452
3452
  kind: "facts",
3453
3453
  items: fields(
3454
3454
  field("ATM IV", fixed(latest.atmIv, 4)),
3455
+ field("Exp move 1d", fixed(latest.expectedMove1d, 4)),
3455
3456
  field("Skew 25d", signed(latest.skew25d, 4)),
3456
3457
  field("Call vol", humanize(latest.callVol, 1)),
3457
3458
  field("Put vol", humanize(latest.putVol, 1)),
package/dist/index.cjs CHANGED
@@ -1249,7 +1249,7 @@ var Trackers = class {
1249
1249
  };
1250
1250
 
1251
1251
  // src/version.ts
1252
- var VERSION = "0.53.0";
1252
+ var VERSION = "0.54.0";
1253
1253
 
1254
1254
  // src/client.ts
1255
1255
  var DEFAULT_BASE_URL = "https://app.sentisense.ai";