@harperfast/harper 5.2.0-alpha.6 → 5.2.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/dataLayer/harperBridge/ResourceBridge.ts +7 -0
  2. package/dist/dataLayer/harperBridge/ResourceBridge.js +8 -0
  3. package/dist/dataLayer/harperBridge/ResourceBridge.js.map +1 -1
  4. package/dist/resources/Resource.js +5 -2
  5. package/dist/resources/Resource.js.map +1 -1
  6. package/dist/resources/Table.d.ts +3 -1
  7. package/dist/resources/Table.js +13 -3
  8. package/dist/resources/Table.js.map +1 -1
  9. package/dist/resources/databases.js +21 -0
  10. package/dist/resources/databases.js.map +1 -1
  11. package/dist/sqlEngine/binder/bind.d.ts +72 -0
  12. package/dist/sqlEngine/binder/bind.js +289 -0
  13. package/dist/sqlEngine/binder/bind.js.map +1 -0
  14. package/dist/sqlEngine/config.d.ts +35 -0
  15. package/dist/sqlEngine/config.js +62 -0
  16. package/dist/sqlEngine/config.js.map +1 -0
  17. package/dist/sqlEngine/diff/differential.d.ts +23 -0
  18. package/dist/sqlEngine/diff/differential.js +90 -0
  19. package/dist/sqlEngine/diff/differential.js.map +1 -0
  20. package/dist/sqlEngine/errors.d.ts +22 -0
  21. package/dist/sqlEngine/errors.js +36 -0
  22. package/dist/sqlEngine/errors.js.map +1 -0
  23. package/dist/sqlEngine/executor/runMutation.d.ts +35 -0
  24. package/dist/sqlEngine/executor/runMutation.js +352 -0
  25. package/dist/sqlEngine/executor/runMutation.js.map +1 -0
  26. package/dist/sqlEngine/executor/runSelect.d.ts +7 -0
  27. package/dist/sqlEngine/executor/runSelect.js +14 -0
  28. package/dist/sqlEngine/executor/runSelect.js.map +1 -0
  29. package/dist/sqlEngine/expressions/compile.d.ts +24 -0
  30. package/dist/sqlEngine/expressions/compile.js +326 -0
  31. package/dist/sqlEngine/expressions/compile.js.map +1 -0
  32. package/dist/sqlEngine/functions/aggregates.d.ts +12 -0
  33. package/dist/sqlEngine/functions/aggregates.js +299 -0
  34. package/dist/sqlEngine/functions/aggregates.js.map +1 -0
  35. package/dist/sqlEngine/functions/registry.d.ts +36 -0
  36. package/dist/sqlEngine/functions/registry.js +33 -0
  37. package/dist/sqlEngine/functions/registry.js.map +1 -0
  38. package/dist/sqlEngine/functions/standard.d.ts +9 -0
  39. package/dist/sqlEngine/functions/standard.js +86 -0
  40. package/dist/sqlEngine/functions/standard.js.map +1 -0
  41. package/dist/sqlEngine/index.d.ts +29 -0
  42. package/dist/sqlEngine/index.js +62 -0
  43. package/dist/sqlEngine/index.js.map +1 -0
  44. package/dist/sqlEngine/logical/build.d.ts +20 -0
  45. package/dist/sqlEngine/logical/build.js +326 -0
  46. package/dist/sqlEngine/logical/build.js.map +1 -0
  47. package/dist/sqlEngine/logical/op.d.ts +105 -0
  48. package/dist/sqlEngine/logical/op.js +10 -0
  49. package/dist/sqlEngine/logical/op.js.map +1 -0
  50. package/dist/sqlEngine/optimizer/joinAnalysis.d.ts +37 -0
  51. package/dist/sqlEngine/optimizer/joinAnalysis.js +144 -0
  52. package/dist/sqlEngine/optimizer/joinAnalysis.js.map +1 -0
  53. package/dist/sqlEngine/optimizer/optimize.d.ts +13 -0
  54. package/dist/sqlEngine/optimizer/optimize.js +53 -0
  55. package/dist/sqlEngine/optimizer/optimize.js.map +1 -0
  56. package/dist/sqlEngine/optimizer/ruleEngine.d.ts +7 -0
  57. package/dist/sqlEngine/optimizer/ruleEngine.js +26 -0
  58. package/dist/sqlEngine/optimizer/ruleEngine.js.map +1 -0
  59. package/dist/sqlEngine/optimizer/rules/limitPushdown.d.ts +19 -0
  60. package/dist/sqlEngine/optimizer/rules/limitPushdown.js +55 -0
  61. package/dist/sqlEngine/optimizer/rules/limitPushdown.js.map +1 -0
  62. package/dist/sqlEngine/optimizer/rules/planJoins.d.ts +19 -0
  63. package/dist/sqlEngine/optimizer/rules/planJoins.js +62 -0
  64. package/dist/sqlEngine/optimizer/rules/planJoins.js.map +1 -0
  65. package/dist/sqlEngine/optimizer/rules/predicateNormalize.d.ts +18 -0
  66. package/dist/sqlEngine/optimizer/rules/predicateNormalize.js +80 -0
  67. package/dist/sqlEngine/optimizer/rules/predicateNormalize.js.map +1 -0
  68. package/dist/sqlEngine/optimizer/rules/predicatePushdown.d.ts +11 -0
  69. package/dist/sqlEngine/optimizer/rules/predicatePushdown.js +48 -0
  70. package/dist/sqlEngine/optimizer/rules/predicatePushdown.js.map +1 -0
  71. package/dist/sqlEngine/optimizer/rules/projectionPushdown.d.ts +23 -0
  72. package/dist/sqlEngine/optimizer/rules/projectionPushdown.js +160 -0
  73. package/dist/sqlEngine/optimizer/rules/projectionPushdown.js.map +1 -0
  74. package/dist/sqlEngine/optimizer/rules/sortFromIndex.d.ts +14 -0
  75. package/dist/sqlEngine/optimizer/rules/sortFromIndex.js +49 -0
  76. package/dist/sqlEngine/optimizer/rules/sortFromIndex.js.map +1 -0
  77. package/dist/sqlEngine/optimizer/rules/validateScannable.d.ts +15 -0
  78. package/dist/sqlEngine/optimizer/rules/validateScannable.js +60 -0
  79. package/dist/sqlEngine/optimizer/rules/validateScannable.js.map +1 -0
  80. package/dist/sqlEngine/optimizer/whereToConditions.d.ts +85 -0
  81. package/dist/sqlEngine/optimizer/whereToConditions.js +484 -0
  82. package/dist/sqlEngine/optimizer/whereToConditions.js.map +1 -0
  83. package/dist/sqlEngine/parser/ast.d.ts +139 -0
  84. package/dist/sqlEngine/parser/ast.js +10 -0
  85. package/dist/sqlEngine/parser/ast.js.map +1 -0
  86. package/dist/sqlEngine/parser/normalizer.d.ts +28 -0
  87. package/dist/sqlEngine/parser/normalizer.js +413 -0
  88. package/dist/sqlEngine/parser/normalizer.js.map +1 -0
  89. package/dist/sqlEngine/parser/parse.d.ts +14 -0
  90. package/dist/sqlEngine/parser/parse.js +20 -0
  91. package/dist/sqlEngine/parser/parse.js.map +1 -0
  92. package/dist/sqlEngine/physical/PhysicalDistinct.d.ts +9 -0
  93. package/dist/sqlEngine/physical/PhysicalDistinct.js +29 -0
  94. package/dist/sqlEngine/physical/PhysicalDistinct.js.map +1 -0
  95. package/dist/sqlEngine/physical/PhysicalFilter.d.ts +10 -0
  96. package/dist/sqlEngine/physical/PhysicalFilter.js +25 -0
  97. package/dist/sqlEngine/physical/PhysicalFilter.js.map +1 -0
  98. package/dist/sqlEngine/physical/PhysicalHashAggregate.d.ts +27 -0
  99. package/dist/sqlEngine/physical/PhysicalHashAggregate.js +100 -0
  100. package/dist/sqlEngine/physical/PhysicalHashAggregate.js.map +1 -0
  101. package/dist/sqlEngine/physical/PhysicalHashJoin.d.ts +29 -0
  102. package/dist/sqlEngine/physical/PhysicalHashJoin.js +93 -0
  103. package/dist/sqlEngine/physical/PhysicalHashJoin.js.map +1 -0
  104. package/dist/sqlEngine/physical/PhysicalIndexNestedLoopJoin.d.ts +36 -0
  105. package/dist/sqlEngine/physical/PhysicalIndexNestedLoopJoin.js +78 -0
  106. package/dist/sqlEngine/physical/PhysicalIndexNestedLoopJoin.js.map +1 -0
  107. package/dist/sqlEngine/physical/PhysicalIndexScan.d.ts +22 -0
  108. package/dist/sqlEngine/physical/PhysicalIndexScan.js +77 -0
  109. package/dist/sqlEngine/physical/PhysicalIndexScan.js.map +1 -0
  110. package/dist/sqlEngine/physical/PhysicalLimit.d.ts +5 -0
  111. package/dist/sqlEngine/physical/PhysicalLimit.js +28 -0
  112. package/dist/sqlEngine/physical/PhysicalLimit.js.map +1 -0
  113. package/dist/sqlEngine/physical/PhysicalNestedLoopJoin.d.ts +20 -0
  114. package/dist/sqlEngine/physical/PhysicalNestedLoopJoin.js +51 -0
  115. package/dist/sqlEngine/physical/PhysicalNestedLoopJoin.js.map +1 -0
  116. package/dist/sqlEngine/physical/PhysicalProject.d.ts +18 -0
  117. package/dist/sqlEngine/physical/PhysicalProject.js +117 -0
  118. package/dist/sqlEngine/physical/PhysicalProject.js.map +1 -0
  119. package/dist/sqlEngine/physical/PhysicalQualify.d.ts +13 -0
  120. package/dist/sqlEngine/physical/PhysicalQualify.js +29 -0
  121. package/dist/sqlEngine/physical/PhysicalQualify.js.map +1 -0
  122. package/dist/sqlEngine/physical/PhysicalSort.d.ts +12 -0
  123. package/dist/sqlEngine/physical/PhysicalSort.js +59 -0
  124. package/dist/sqlEngine/physical/PhysicalSort.js.map +1 -0
  125. package/dist/sqlEngine/physical/op.d.ts +11 -0
  126. package/dist/sqlEngine/physical/op.js +9 -0
  127. package/dist/sqlEngine/physical/op.js.map +1 -0
  128. package/dist/sqlEngine/physical/plan.d.ts +23 -0
  129. package/dist/sqlEngine/physical/plan.js +162 -0
  130. package/dist/sqlEngine/physical/plan.js.map +1 -0
  131. package/dist/sqlEngine/router.d.ts +26 -0
  132. package/dist/sqlEngine/router.js +48 -0
  133. package/dist/sqlEngine/router.js.map +1 -0
  134. package/dist/sqlEngine/types.d.ts +37 -0
  135. package/dist/sqlEngine/types.js +13 -0
  136. package/dist/sqlEngine/types.js.map +1 -0
  137. package/dist/sqlTranslator/index.js +7 -1
  138. package/dist/sqlTranslator/index.js.map +1 -1
  139. package/dist/validation/deleteValidator.js +10 -2
  140. package/dist/validation/deleteValidator.js.map +1 -1
  141. package/npm-shrinkwrap.json +2 -2
  142. package/package.json +1 -1
  143. package/resources/DESIGN.md +17 -16
  144. package/resources/Resource.ts +5 -2
  145. package/resources/Table.ts +23 -3
  146. package/resources/databases.ts +24 -0
  147. package/sqlTranslator/index.ts +16 -6
  148. package/studio/web/assets/{Chat-CTjtL8Z4.js → Chat-BZks8dVF.js} +2 -2
  149. package/studio/web/assets/{Chat-CTjtL8Z4.js.map → Chat-BZks8dVF.js.map} +1 -1
  150. package/studio/web/assets/{FloatingChat-CafHR4Ur.js → FloatingChat-Dic8paVO.js} +4 -4
  151. package/studio/web/assets/{FloatingChat-CafHR4Ur.js.map → FloatingChat-Dic8paVO.js.map} +1 -1
  152. package/studio/web/assets/{applications-Buh_q0Vj.js → applications-uOXkeUIN.js} +2 -2
  153. package/studio/web/assets/{applications-Buh_q0Vj.js.map → applications-uOXkeUIN.js.map} +1 -1
  154. package/studio/web/assets/{index-0hXeECkS.js → index-i-2wrKhv.js} +6 -6
  155. package/studio/web/assets/{index-0hXeECkS.js.map → index-i-2wrKhv.js.map} +1 -1
  156. package/studio/web/assets/{index.lazy-B00B7VBT.js → index.lazy-Csk8eCoB.js} +4 -4
  157. package/studio/web/assets/{index.lazy-B00B7VBT.js.map → index.lazy-Csk8eCoB.js.map} +1 -1
  158. package/studio/web/assets/{profile-Cg2wwYPn.js → profile-Sb3mGDl6.js} +2 -2
  159. package/studio/web/assets/{profile-Cg2wwYPn.js.map → profile-Sb3mGDl6.js.map} +1 -1
  160. package/studio/web/assets/{setComponentFile-DCaDIvyB.js → setComponentFile-BgZcaPJ2.js} +2 -2
  161. package/studio/web/assets/{setComponentFile-DCaDIvyB.js.map → setComponentFile-BgZcaPJ2.js.map} +1 -1
  162. package/studio/web/assets/{setup-CAVcAQjK.js → setup-DKtlLgmT.js} +2 -2
  163. package/studio/web/assets/{setup-CAVcAQjK.js.map → setup-DKtlLgmT.js.map} +1 -1
  164. package/studio/web/assets/{status-BRXorNdD.js → status-B45iLeug.js} +2 -2
  165. package/studio/web/assets/{status-BRXorNdD.js.map → status-B45iLeug.js.map} +1 -1
  166. package/studio/web/assets/{swagger-ui-react-Dy1D62vO.js → swagger-ui-react-Csu4026e.js} +2 -2
  167. package/studio/web/assets/{swagger-ui-react-Dy1D62vO.js.map → swagger-ui-react-Csu4026e.js.map} +1 -1
  168. package/studio/web/assets/{tsMode-A8gbL74v.js → tsMode-DVgxUr_l.js} +2 -2
  169. package/studio/web/assets/{tsMode-A8gbL74v.js.map → tsMode-DVgxUr_l.js.map} +1 -1
  170. package/studio/web/assets/{useEntityRestURL-cDodrVcQ.js → useEntityRestURL-yfDQMV1f.js} +2 -2
  171. package/studio/web/assets/{useEntityRestURL-cDodrVcQ.js.map → useEntityRestURL-yfDQMV1f.js.map} +1 -1
  172. package/studio/web/index.html +1 -1
  173. package/validation/deleteValidator.ts +11 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../sqlTranslator/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../sqlTranslator/index.ts"],"names":[],"mappings":"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"}
@@ -40,12 +40,20 @@ exports.default = default_1;
40
40
  const validator = __importStar(require("./validationWrapper.js"));
41
41
  const joi_1 = __importDefault(require("joi"));
42
42
  const common_validators_ts_1 = require("./common_validators.js");
43
+ // `hash_values`/`ids` are lists of primary keys. Items may be strings, numbers, or composite
44
+ // (array/object) keys, but never `null`/`undefined`: a null key is coerced downstream into a
45
+ // whole-collection target that wipes the table (see HarperFast/studio#1199), reject at the boundary.
46
+ // `{#label}` resolves to the offending field/index (e.g. `hash_values[0]` or `ids[0]`) so the error
47
+ // names the right field whether the null came in via `hash_values` or `ids`.
48
+ const hashValue = joi_1.default.any().invalid(null).messages({
49
+ 'any.invalid': `{#label} must not contain null`,
50
+ });
43
51
  const deleteSchema = joi_1.default.object({
44
52
  schema: common_validators_ts_1.hdbDatabase,
45
53
  database: common_validators_ts_1.hdbDatabase,
46
54
  table: common_validators_ts_1.hdbTable,
47
- hash_values: joi_1.default.array().required(),
48
- ids: joi_1.default.array(),
55
+ hash_values: joi_1.default.array().items(hashValue).required(),
56
+ ids: joi_1.default.array().items(hashValue),
49
57
  });
50
58
  function default_1(deleteObject) {
51
59
  return validator.validateBySchema(deleteObject, deleteSchema);
@@ -1 +1 @@
1
- {"version":3,"file":"deleteValidator.js","sourceRoot":"","sources":["../../validation/deleteValidator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,4BAEC;AAdD,kEAAoD;AACpD,8CAAsB;AACtB,iEAA+D;AAE/D,MAAM,YAAY,GAAG,aAAG,CAAC,MAAM,CAAC;IAC/B,MAAM,EAAE,kCAAW;IACnB,QAAQ,EAAE,kCAAW;IACrB,KAAK,EAAE,+BAAQ;IACf,WAAW,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE;IACnC,GAAG,EAAE,aAAG,CAAC,KAAK,EAAE;CAChB,CAAC,CAAC;AAEH,mBAAyB,YAAiB;IACzC,OAAO,SAAS,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;AAC/D,CAAC"}
1
+ {"version":3,"file":"deleteValidator.js","sourceRoot":"","sources":["../../validation/deleteValidator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,4BAEC;AAvBD,kEAAoD;AACpD,8CAAsB;AACtB,iEAA+D;AAE/D,6FAA6F;AAC7F,6FAA6F;AAC7F,qGAAqG;AACrG,oGAAoG;AACpG,6EAA6E;AAC7E,MAAM,SAAS,GAAG,aAAG,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;IAClD,aAAa,EAAE,gCAAgC;CAC/C,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,aAAG,CAAC,MAAM,CAAC;IAC/B,MAAM,EAAE,kCAAW;IACnB,QAAQ,EAAE,kCAAW;IACrB,KAAK,EAAE,+BAAQ;IACf,WAAW,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE;IACpD,GAAG,EAAE,aAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;CACjC,CAAC,CAAC;AAEH,mBAAyB,YAAiB;IACzC,OAAO,SAAS,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;AAC/D,CAAC"}
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "harper",
3
- "version": "5.2.0-alpha.6",
3
+ "version": "5.2.0-beta.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "harper",
9
- "version": "5.2.0-alpha.6",
9
+ "version": "5.2.0-beta.1",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@aws-sdk/client-s3": "^3.1012.0",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@harperfast/harper",
3
3
  "description": "Harper is an open-source Node.js performance platform that unifies database, cache, application, and messaging layers into one in-memory process.",
4
- "version": "5.2.0-alpha.6",
4
+ "version": "5.2.0-beta.1",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://harper.fast",
7
7
  "bugs": {
@@ -78,22 +78,23 @@ One giant `makeTable()` factory that returns a `TableResource extends Resource`
78
78
 
79
79
  ## "Where is X" cheat sheet
80
80
 
81
- | Question | Where |
82
- | --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
83
- | How is a CRUD request authorized? | `Table.ts → #section: authz-hooks`; defaults in `Resource.ts` (`allowRead` etc.) |
84
- | Where does versioning / conflict resolution happen? | `Table.ts → _writeUpdate` (`#section: write-path-internals`) |
85
- | How does `search()` choose an index? | `Table.ts → search` (`#section: search-query`) |
86
- | How are subscriptions replayed? | `Table.ts → subscribe` (`#section: pub-sub`) |
87
- | How is the response body shaped (select clause)? | `Table.ts → transformEntryForSelect` (`#section: search-query`) |
88
- | Where is record-level TTL evaluated? | `Table.ts → setTTLExpiration` (`#section: lifecycle-admin`); `Updatable.getExpiresAt` (`#section: setup-and-factory`) |
89
- | How are residencies enforced (replication)? | `Table.ts → #section: lifecycle-admin` (residency block: `getResidencyRecord`, `setResidency`, `setResidencyById`, `getResidency`) |
90
- | How is the RecordObject prototype applied? | `RecordEncoder.ts` (see `../DESIGN.md`) |
91
- | Where is the per-request transaction stored? | `transaction.ts` + `contextStorage` (AsyncLocalStorage) |
92
- | How does a query opt out of a read snapshot? | Pass `snapshot: false` on the search request (e.g. `get_analytics`). `Table.ts → search` calls `txn.useReadTxn(snapshot === false)`; on RocksDB `DatabaseTransaction.getReadTxn` then builds the read txn with `{ disableSnapshot: true }` so a long scan reads latest without pinning a snapshot. No-op on LMDB (`LMDBTransaction.useReadTxn`). |
93
- | How does a URL path map to a Resource? | `Resources.ts → getMatch` (exact/prefix fast path) then `matchParamRoute` (parameterised routes); see "Path routing" below |
94
- | How does HNSW keep the graph connected on delete? | `indexes/HierarchicalNavigableSmallWorld.ts → index()` delete path: zero-degree orphans reindexed via `needsReindexing`; severed multi-node islands detected and reconnected by `repairSeveredNeighbors` (#1712) |
95
- | How is a filter applied _during_ a vector search? | Predicate-aware traversal (#1241): `search.ts → executeConditions` composes companion AND conditions + a request `vectorFilter` + a record-scoped `allowRead` override into one `(primaryKey) => boolean` (`composeRecordFilter`) and passes it to `HierarchicalNavigableSmallWorld.search(cond, ctx, filter)`. The filter gates result admission at layer 0 only (routing ignores it, ACORN-style); a visit budget (`filterExpansion`) bounds the under-filled/selective case. Very selective _condition_ filters are instead diverted to the exact brute-force path by the query planner's `estimateCountAsSort` ordering. |
96
- | How is row-level read access control enforced? | Unified `allowRead` (#1422 gap 2 / #1241): an application-OVERRIDDEN `allowRead` (detected via the `isDefaultAllowRead` marker on the framework defaults) is record-scoped evaluated once per record with `this` = the (frozen) record during query execution, fail-closed on throw, dispatched via the resolved method (never `record.allowRead` lookup data shadowing). The authorize wrapper (`Resource.ts → authorizeActionOnResource`) defers collection reads on tables (`supportsRowLevelAllowRead`) to this per-record path; single-record `get` keeps the entry check (record loaded, proxied reads work). Records also expose a non-enumerable `allowRead` delegate on the per-table `structPrototype`. |
81
+ | Question | Where |
82
+ | --------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
83
+ | How is a CRUD request authorized? | `Table.ts → #section: authz-hooks`; defaults in `Resource.ts` (`allowRead` etc.) |
84
+ | Where does versioning / conflict resolution happen? | `Table.ts → _writeUpdate` (`#section: write-path-internals`) |
85
+ | How does `search()` choose an index? | `Table.ts → search` (`#section: search-query`) |
86
+ | How are subscriptions replayed? | `Table.ts → subscribe` (`#section: pub-sub`) |
87
+ | How is the response body shaped (select clause)? | `Table.ts → transformEntryForSelect` (`#section: search-query`) |
88
+ | Where is record-level TTL evaluated? | `Table.ts → setTTLExpiration` (`#section: lifecycle-admin`); `Updatable.getExpiresAt` (`#section: setup-and-factory`) |
89
+ | Why does `search()` hide a row that's past its TTL but not yet swept? | `Table.ts → transformEntryForSelect` unconditionally treats `entry.expiresAt < Date.now()` as gone (lazy eviction on read) — correct for a SELECT, but a mutation locating rows to overwrite needs the opposite: pass `target.includeExpired = true` (read by the SQL engine's `runUpdate`/`runDelete` via `SqlEngineContext.includeExpiredRows`) to treat such a row as a live match, matching the leniency a direct by-id `put`/`patch` already has (they skip this check entirely, since `Resource.patch`'s static options don't request `ensureLoaded`). |
90
+ | How are residencies enforced (replication)? | `Table.ts → #section: lifecycle-admin` (residency block: `getResidencyRecord`, `setResidency`, `setResidencyById`, `getResidency`) |
91
+ | How is the RecordObject prototype applied? | `RecordEncoder.ts` (see `../DESIGN.md`) |
92
+ | Where is the per-request transaction stored? | `transaction.ts` + `contextStorage` (AsyncLocalStorage) |
93
+ | How does a query opt out of a read snapshot? | Pass `snapshot: false` on the search request (e.g. `get_analytics`). `Table.ts → search` calls `txn.useReadTxn(snapshot === false)`; on RocksDB `DatabaseTransaction.getReadTxn` then builds the read txn with `{ disableSnapshot: true }` so a long scan reads latest without pinning a snapshot. No-op on LMDB (`LMDBTransaction.useReadTxn`). |
94
+ | How does a URL path map to a Resource? | `Resources.ts → getMatch` (exact/prefix fast path) then `matchParamRoute` (parameterised routes); see "Path routing" below |
95
+ | How does HNSW keep the graph connected on delete? | `indexes/HierarchicalNavigableSmallWorld.ts → index()` delete path: zero-degree orphans reindexed via `needsReindexing`; severed multi-node islands detected and reconnected by `repairSeveredNeighbors` (#1712) |
96
+ | How is a filter applied _during_ a vector search? | Predicate-aware traversal (#1241): `search.ts executeConditions` composes companion AND conditions + a request `vectorFilter` + a record-scoped `allowRead` override into one `(primaryKey) => boolean` (`composeRecordFilter`) and passes it to `HierarchicalNavigableSmallWorld.search(cond, ctx, filter)`. The filter gates result admission at layer 0 only (routing ignores it, ACORN-style); a visit budget (`filterExpansion`) bounds the under-filled/selective case. Very selective _condition_ filters are instead diverted to the exact brute-force path by the query planner's `estimateCountAsSort` ordering. |
97
+ | How is row-level read access control enforced? | Unified `allowRead` (#1422 gap 2 / #1241): an application-OVERRIDDEN `allowRead` (detected via the `isDefaultAllowRead` marker on the framework defaults) is record-scoped — evaluated once per record with `this` = the (frozen) record during query execution, fail-closed on throw, dispatched via the resolved method (never `record.allowRead` lookup — data shadowing). The authorize wrapper (`Resource.ts → authorizeActionOnResource`) defers collection reads on tables (`supportsRowLevelAllowRead`) to this per-record path; single-record `get` keeps the entry check (record loaded, proxied reads work). Records also expose a non-enumerable `allowRead` delegate on the per-table `structPrototype`. |
97
98
 
98
99
  ---
99
100
 
@@ -689,8 +689,11 @@ function transactional(
689
689
  query = new RequestTarget();
690
690
  query.id = id;
691
691
  if (id == null) {
692
- if (options.method === 'get') {
693
- throw new Error(`Using an argument with a value of ${id} for ${options.method}, is not allowed`);
692
+ if (options.method === 'get' || options.method === 'delete') {
693
+ // For delete, a bare null/undefined id would be coerced into a whole-collection
694
+ // target and silently delete every record (studio#1199); a deliberate delete-all
695
+ // must use an explicit query object instead.
696
+ throw new ClientError(`Using an argument with a value of ${id} for ${options.method}, is not allowed`);
694
697
  }
695
698
  query.isCollection = true;
696
699
  }
@@ -2989,6 +2989,14 @@ export function makeTable(options) {
2989
2989
  // there, after materialization (the earlier evaluation stays as a prune that also bounds HNSW
2990
2990
  // traversal). vectorFilter and condition filters intentionally keep the local-record
2991
2991
  // semantics all query filters have on caching tables.
2992
+ //
2993
+ // A row that is past its TTL but not yet swept by the background eviction
2994
+ // scan is still physically present. A write that is about to overwrite it
2995
+ // anyway (e.g. the SQL engine locating UPDATE/DELETE targets) needs to see
2996
+ // it as a match — the same leniency a direct by-id put/patch already gets,
2997
+ // since those never run the ensureLoaded-gated freshness check this transform
2998
+ // otherwise applies unconditionally to every read.
2999
+ const includeExpired = (target as any).includeExpired === true;
2992
3000
  const transformToRecord = TableResource.transformEntryForSelect(
2993
3001
  select,
2994
3002
  context,
@@ -2996,7 +3004,8 @@ export function makeTable(options) {
2996
3004
  filtered,
2997
3005
  ensure_loaded,
2998
3006
  true,
2999
- recordGuard
3007
+ recordGuard,
3008
+ includeExpired
3000
3009
  );
3001
3010
  let results = TableResource.transformToOrderedSelect(
3002
3011
  entries,
@@ -3210,9 +3219,20 @@ export function makeTable(options) {
3210
3219
  * @param recordGuard record-level read check (#1241) applied to the record actually being
3211
3220
  * returned — i.e. AFTER any caching-source revalidation replaces a stale local copy — so an
3212
3221
  * authorization verdict can't be made on bytes that differ from what the caller receives.
3222
+ * @param includeExpired when true, a row past its TTL but not yet swept is treated as a live
3223
+ * match rather than gone (used by the SQL engine's UPDATE/DELETE row-finder).
3213
3224
  * @returns
3214
3225
  */
3215
- static transformEntryForSelect(select, context, readTxn, filtered, ensure_loaded?, canSkip?, recordGuard?) {
3226
+ static transformEntryForSelect(
3227
+ select,
3228
+ context,
3229
+ readTxn,
3230
+ filtered,
3231
+ ensure_loaded?,
3232
+ canSkip?,
3233
+ recordGuard?,
3234
+ includeExpired?
3235
+ ) {
3216
3236
  let checkLoaded;
3217
3237
  if (
3218
3238
  ensure_loaded &&
@@ -3260,7 +3280,7 @@ export function makeTable(options) {
3260
3280
  }
3261
3281
  if (
3262
3282
  (checkLoaded && entry?.metadataFlags & (INVALIDATED | EVICTED)) || // invalidated or evicted should go to load from source
3263
- (entry?.expiresAt != undefined && entry?.expiresAt < Date.now())
3283
+ (!includeExpired && entry?.expiresAt != undefined && entry?.expiresAt < Date.now())
3264
3284
  ) {
3265
3285
  // should expiration really apply?
3266
3286
  if (context.onlyIfCached) {
@@ -13,6 +13,7 @@ import { makeTable } from './Table.ts';
13
13
  import OpenEnvironmentObject from '../utility/lmdb/OpenEnvironmentObject.ts';
14
14
  import { CONFIG_PARAMS, LEGACY_DATABASES_DIR_NAME, DATABASES_DIR_NAME } from '../utility/hdbTerms.ts';
15
15
  import { getConfigPath } from '../config/configUtils.ts';
16
+ import { ClientError } from '../utility/errors/hdbError.ts';
16
17
  import { _assignPackageExport } from '../globals.js';
17
18
  import { getIndexedValues } from '../utility/lmdb/commonUtility.ts';
18
19
  import * as signalling from '../utility/signalling.ts';
@@ -1120,6 +1121,29 @@ export function table<TableResourceType>(tableDefinition: TableDefinition): Tabl
1120
1121
  if (Table.primaryStore.rootStore.status === 'closed') {
1121
1122
  throw new Error(`Can not use a closed data store from ${tableName} class`);
1122
1123
  }
1124
+ // Reject moving the primary key to a different attribute on a table that already has records.
1125
+ // The storage key (Table.primaryKey) is never re-pointed here, so honoring the change would
1126
+ // leave describe reporting the new attribute while every record — old and newly inserted — stays
1127
+ // keyed by the original one; search_by_id/update/delete by the declared key then all miss. Only
1128
+ // schema-authored callers (@table / defineTable / create_table) reassert the declaration, so
1129
+ // gate on schemaDefinedExplicit to leave cluster schema-replication / data-loader callers alone.
1130
+ // See HarperFast/studio#1199.
1131
+ const declaredPrimaryKey = attributes.find((attribute) => attribute.isPrimaryKey)?.name;
1132
+ if (schemaDefinedExplicit && declaredPrimaryKey && declaredPrimaryKey !== Table.primaryKey) {
1133
+ let hasRecords = false;
1134
+ for (const _entry of Table.primaryStore.getRange({ start: true })) {
1135
+ hasRecords = true;
1136
+ break;
1137
+ }
1138
+ if (hasRecords) {
1139
+ throw new ClientError(
1140
+ `Cannot change the primary key of table '${databaseName}.${tableName}' from '${Table.primaryKey}' to ` +
1141
+ `'${declaredPrimaryKey}' because it already contains records. Recreate the table with the new primary ` +
1142
+ `key, or migrate the existing records.`,
1143
+ 400
1144
+ );
1145
+ }
1146
+ }
1123
1147
  // it table already exists, get the split segments setting
1124
1148
  if (splitSegments == undefined) splitSegments = Table.splitSegments;
1125
1149
  Table.attributes.splice(0, Table.attributes.length, ...attributes);
@@ -16,6 +16,7 @@ import * as hdbUtils from '../utility/common_utils.ts';
16
16
  import * as terms from '../utility/hdbTerms.ts';
17
17
  import { handleHDBError } from '../utility/errors/hdbError.ts';
18
18
  import { HTTP_STATUS_CODES } from '../utility/errors/commonErrors.ts';
19
+ import * as sqlEngineRouter from '../sqlEngine/router.ts';
19
20
 
20
21
  //here we call to define and import custom functions to alasql
21
22
  alasqlFunctionImporter(alasql);
@@ -158,13 +159,22 @@ export function processAST(jsonMessage: any, parsedSqlObject: any, callback: any
158
159
  default:
159
160
  throw new Error(`unsupported SQL type ${parsedSqlObject.variant} in SQL: ${jsonMessage}`);
160
161
  }
161
- sqlFunction(statement, (err, data) => {
162
- if (err) {
163
- callback(err);
164
- return;
162
+
163
+ sqlEngineRouter.route(
164
+ {
165
+ variant: parsedSqlObject.variant,
166
+ jsonMessage,
167
+ statement,
168
+ legacy: sqlFunction,
169
+ },
170
+ (err, data) => {
171
+ if (err) {
172
+ callback(err);
173
+ return;
174
+ }
175
+ callback(null, data);
165
176
  }
166
- callback(null, data);
167
- });
177
+ );
168
178
  } catch (e) {
169
179
  return callback(e);
170
180
  }
@@ -1,4 +1,4 @@
1
- import{a as e,t}from"./rolldown-runtime-CNC7AqOf.js";import{g as n,t as r}from"./button-i10JPNcp.js";import{C as i,S as a,_ as o,a as s,b as c,c as l,d as u,g as d,i as f,l as p,m,p as h,r as g,s as _,t as v,u as ee,v as y,w as b,x,y as S}from"./vendor-core-vIXn_E4D.js";import{C as te,I as ne,N as re,j as ie}from"./vendor-tanstack-Dl75hT33.js";import{a as ae}from"./vendor-datadog-DBn-aOxh.js";import{r as oe}from"./vendor-react-B36dp27u.js";import{zt as C}from"./vendor-ui-Bm4W8wqw.js";import{t as w}from"./createLucideIcon-B49W6uF4.js";import{l as se,t as ce}from"./react-SMksfEpE.js";import{a as le,i as ue,n as de,r as fe,t as pe}from"./x-Bru-nCti.js";import{_ as me,d as he,g as ge,h as _e,i as ve,l as ye,m as be,p as xe,r as Se,t as Ce,u as we}from"./setComponentFile-DCaDIvyB.js";import{n as Te}from"./queryClient-DK1L0t7F.js";import{n as Ee,t as De}from"./localStorageKeys-D_mgWLDC.js";import{$n as Oe,At as ke,Dt as Ae,Et as je,G as Me,Kn as Ne,Ot as Pe,Pn as Fe,R as Ie,Rt as Le,Tt as Re,Un as ze,Vn as Be,Wn as Ve,Yn as He,ar as Ue,c as We,d as Ge,ir as Ke,l as qe,lr as Je,mt as Ye,o as Xe,qt as Ze,rr as Qe,rt as $e,st as et,z as tt}from"./index-0hXeECkS.js";import{t as nt}from"./useEntityRestURL-cDodrVcQ.js";import{n as rt}from"./getAnalytics-CmXDoq4g.js";var it=w(`between-horizontal-start`,[[`rect`,{width:`13`,height:`7`,x:`8`,y:`3`,rx:`1`,key:`pkso9a`}],[`path`,{d:`m2 9 3 3-3 3`,key:`1agib5`}],[`rect`,{width:`13`,height:`7`,x:`8`,y:`14`,rx:`1`,key:`1q5fc1`}]]),at=w(`book`,[[`path`,{d:`M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20`,key:`k3hazp`}]]),ot=w(`chart-area`,[[`path`,{d:`M3 3v16a2 2 0 0 0 2 2h16`,key:`c24i48`}],[`path`,{d:`M7 11.207a.5.5 0 0 1 .146-.353l2-2a.5.5 0 0 1 .708 0l3.292 3.292a.5.5 0 0 0 .708 0l4.292-4.292a.5.5 0 0 1 .854.353V16a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z`,key:`q0gr47`}]]),st=w(`circle-x`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m15 9-6 6`,key:`1uzhvr`}],[`path`,{d:`m9 9 6 6`,key:`z0biqf`}]]),ct=w(`file-pen`,[[`path`,{d:`M12.659 22H18a2 2 0 0 0 2-2V8a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v9.34`,key:`o6klzx`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10.378 12.622a1 1 0 0 1 3 3.003L8.36 20.637a2 2 0 0 1-.854.506l-2.867.837a.5.5 0 0 1-.62-.62l.836-2.869a2 2 0 0 1 .506-.853z`,key:`zhnas1`}]]),lt=w(`logs`,[[`path`,{d:`M3 5h1`,key:`1mv5vm`}],[`path`,{d:`M3 12h1`,key:`lp3yf2`}],[`path`,{d:`M3 19h1`,key:`w6f3n9`}],[`path`,{d:`M8 5h1`,key:`1nxr5w`}],[`path`,{d:`M8 12h1`,key:`1con00`}],[`path`,{d:`M8 19h1`,key:`k7p10e`}],[`path`,{d:`M13 5h8`,key:`a7qcls`}],[`path`,{d:`M13 12h8`,key:`h98zly`}],[`path`,{d:`M13 19h8`,key:`c3s6r1`}]]),ut=w(`message-square-heart`,[[`path`,{d:`M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z`,key:`18887p`}],[`path`,{d:`M7.5 9.5c0 .687.265 1.383.697 1.844l3.009 3.264a1.14 1.14 0 0 0 .407.314 1 1 0 0 0 .783-.004 1.14 1.14 0 0 0 .398-.31l3.008-3.264A2.77 2.77 0 0 0 16.5 9.5 2.5 2.5 0 0 0 12 8a2.5 2.5 0 0 0-4.5 1.5`,key:`1faxuh`}]]),dt=w(`send`,[[`path`,{d:`M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z`,key:`1ffxy3`}],[`path`,{d:`m21.854 2.147-10.94 10.939`,key:`12cjpa`}]]),ft=w(`wrench`,[[`path`,{d:`M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z`,key:`1ngwbx`}]]);async function pt(){await n.delete(`/Chat/Messages/`)}var T=e(ae(),1),E=oe();function mt({setMessages:e}){let[t,n]=(0,T.useState)(!1);return(0,E.jsxs)(`button`,{type:`button`,className:`clear-chat-button gap-1`,onClick:(0,T.useCallback)(async()=>{if(!t){n(!0);try{await pt(),e([])}catch(e){console.error(`Failed to clear chat:`,e)}finally{n(!1)}}},[t,e]),disabled:t,title:`Clear chat`,children:[t?(0,E.jsx)(de,{className:`animate-spin`,size:18}):(0,E.jsx)(Ve,{size:18}),`Clear`]})}async function ht(){let{data:e}=await n.get(`/Chat/Messages/`);return e}var gt=`vercel.ai.error`,_t=Symbol.for(gt),vt,yt,D=class e extends (yt=Error,vt=_t,yt){constructor({name:e,message:t,cause:n}){super(t),this[vt]=!0,this.name=e,this.cause=n}static isInstance(t){return e.hasMarker(t,gt)}static hasMarker(e,t){let n=Symbol.for(t);return typeof e==`object`&&!!e&&n in e&&typeof e[n]==`boolean`&&e[n]===!0}};function bt(e){return e==null?`unknown error`:typeof e==`string`?e:e instanceof Error?e.toString():JSON.stringify(e)}var xt=`AI_InvalidArgumentError`,St=`vercel.ai.error.${xt}`,Ct=Symbol.for(St),wt,Tt,Et=class extends (Tt=D,wt=Ct,Tt){constructor({message:e,cause:t,argument:n}){super({name:xt,message:e,cause:t}),this[wt]=!0,this.argument=n}static isInstance(e){return D.hasMarker(e,St)}},Dt=`AI_JSONParseError`,Ot=`vercel.ai.error.${Dt}`,kt=Symbol.for(Ot),At,jt,Mt=class extends (jt=D,At=kt,jt){constructor({text:e,cause:t}){super({name:Dt,message:`JSON parsing failed: Text: ${e}.
1
+ import{a as e,t}from"./rolldown-runtime-CNC7AqOf.js";import{g as n,t as r}from"./button-i10JPNcp.js";import{C as i,S as a,_ as o,a as s,b as c,c as l,d as u,g as d,i as f,l as p,m,p as h,r as g,s as _,t as v,u as ee,v as y,w as b,x,y as S}from"./vendor-core-vIXn_E4D.js";import{C as te,I as ne,N as re,j as ie}from"./vendor-tanstack-Dl75hT33.js";import{a as ae}from"./vendor-datadog-DBn-aOxh.js";import{r as oe}from"./vendor-react-B36dp27u.js";import{zt as C}from"./vendor-ui-Bm4W8wqw.js";import{t as w}from"./createLucideIcon-B49W6uF4.js";import{l as se,t as ce}from"./react-SMksfEpE.js";import{a as le,i as ue,n as de,r as fe,t as pe}from"./x-Bru-nCti.js";import{_ as me,d as he,g as ge,h as _e,i as ve,l as ye,m as be,p as xe,r as Se,t as Ce,u as we}from"./setComponentFile-BgZcaPJ2.js";import{n as Te}from"./queryClient-DK1L0t7F.js";import{n as Ee,t as De}from"./localStorageKeys-D_mgWLDC.js";import{$n as Oe,At as ke,Dt as Ae,Et as je,G as Me,Kn as Ne,Ot as Pe,Pn as Fe,R as Ie,Rt as Le,Tt as Re,Un as ze,Vn as Be,Wn as Ve,Yn as He,ar as Ue,c as We,d as Ge,ir as Ke,l as qe,lr as Je,mt as Ye,o as Xe,qt as Ze,rr as Qe,rt as $e,st as et,z as tt}from"./index-i-2wrKhv.js";import{t as nt}from"./useEntityRestURL-yfDQMV1f.js";import{n as rt}from"./getAnalytics-CmXDoq4g.js";var it=w(`between-horizontal-start`,[[`rect`,{width:`13`,height:`7`,x:`8`,y:`3`,rx:`1`,key:`pkso9a`}],[`path`,{d:`m2 9 3 3-3 3`,key:`1agib5`}],[`rect`,{width:`13`,height:`7`,x:`8`,y:`14`,rx:`1`,key:`1q5fc1`}]]),at=w(`book`,[[`path`,{d:`M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20`,key:`k3hazp`}]]),ot=w(`chart-area`,[[`path`,{d:`M3 3v16a2 2 0 0 0 2 2h16`,key:`c24i48`}],[`path`,{d:`M7 11.207a.5.5 0 0 1 .146-.353l2-2a.5.5 0 0 1 .708 0l3.292 3.292a.5.5 0 0 0 .708 0l4.292-4.292a.5.5 0 0 1 .854.353V16a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z`,key:`q0gr47`}]]),st=w(`circle-x`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m15 9-6 6`,key:`1uzhvr`}],[`path`,{d:`m9 9 6 6`,key:`z0biqf`}]]),ct=w(`file-pen`,[[`path`,{d:`M12.659 22H18a2 2 0 0 0 2-2V8a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v9.34`,key:`o6klzx`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10.378 12.622a1 1 0 0 1 3 3.003L8.36 20.637a2 2 0 0 1-.854.506l-2.867.837a.5.5 0 0 1-.62-.62l.836-2.869a2 2 0 0 1 .506-.853z`,key:`zhnas1`}]]),lt=w(`logs`,[[`path`,{d:`M3 5h1`,key:`1mv5vm`}],[`path`,{d:`M3 12h1`,key:`lp3yf2`}],[`path`,{d:`M3 19h1`,key:`w6f3n9`}],[`path`,{d:`M8 5h1`,key:`1nxr5w`}],[`path`,{d:`M8 12h1`,key:`1con00`}],[`path`,{d:`M8 19h1`,key:`k7p10e`}],[`path`,{d:`M13 5h8`,key:`a7qcls`}],[`path`,{d:`M13 12h8`,key:`h98zly`}],[`path`,{d:`M13 19h8`,key:`c3s6r1`}]]),ut=w(`message-square-heart`,[[`path`,{d:`M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z`,key:`18887p`}],[`path`,{d:`M7.5 9.5c0 .687.265 1.383.697 1.844l3.009 3.264a1.14 1.14 0 0 0 .407.314 1 1 0 0 0 .783-.004 1.14 1.14 0 0 0 .398-.31l3.008-3.264A2.77 2.77 0 0 0 16.5 9.5 2.5 2.5 0 0 0 12 8a2.5 2.5 0 0 0-4.5 1.5`,key:`1faxuh`}]]),dt=w(`send`,[[`path`,{d:`M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z`,key:`1ffxy3`}],[`path`,{d:`m21.854 2.147-10.94 10.939`,key:`12cjpa`}]]),ft=w(`wrench`,[[`path`,{d:`M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z`,key:`1ngwbx`}]]);async function pt(){await n.delete(`/Chat/Messages/`)}var T=e(ae(),1),E=oe();function mt({setMessages:e}){let[t,n]=(0,T.useState)(!1);return(0,E.jsxs)(`button`,{type:`button`,className:`clear-chat-button gap-1`,onClick:(0,T.useCallback)(async()=>{if(!t){n(!0);try{await pt(),e([])}catch(e){console.error(`Failed to clear chat:`,e)}finally{n(!1)}}},[t,e]),disabled:t,title:`Clear chat`,children:[t?(0,E.jsx)(de,{className:`animate-spin`,size:18}):(0,E.jsx)(Ve,{size:18}),`Clear`]})}async function ht(){let{data:e}=await n.get(`/Chat/Messages/`);return e}var gt=`vercel.ai.error`,_t=Symbol.for(gt),vt,yt,D=class e extends (yt=Error,vt=_t,yt){constructor({name:e,message:t,cause:n}){super(t),this[vt]=!0,this.name=e,this.cause=n}static isInstance(t){return e.hasMarker(t,gt)}static hasMarker(e,t){let n=Symbol.for(t);return typeof e==`object`&&!!e&&n in e&&typeof e[n]==`boolean`&&e[n]===!0}};function bt(e){return e==null?`unknown error`:typeof e==`string`?e:e instanceof Error?e.toString():JSON.stringify(e)}var xt=`AI_InvalidArgumentError`,St=`vercel.ai.error.${xt}`,Ct=Symbol.for(St),wt,Tt,Et=class extends (Tt=D,wt=Ct,Tt){constructor({message:e,cause:t,argument:n}){super({name:xt,message:e,cause:t}),this[wt]=!0,this.argument=n}static isInstance(e){return D.hasMarker(e,St)}},Dt=`AI_JSONParseError`,Ot=`vercel.ai.error.${Dt}`,kt=Symbol.for(Ot),At,jt,Mt=class extends (jt=D,At=kt,jt){constructor({text:e,cause:t}){super({name:Dt,message:`JSON parsing failed: Text: ${e}.
2
2
  Error message: ${bt(t)}`,cause:t}),this[At]=!0,this.text=e}static isInstance(e){return D.hasMarker(e,Ot)}},Nt=`AI_TypeValidationError`,Pt=`vercel.ai.error.${Nt}`,Ft=Symbol.for(Pt),It,Lt,O=class e extends (Lt=D,It=Ft,Lt){constructor({value:e,cause:t,context:n}){let r=`Type validation failed`;if(n?.field&&(r+=` for ${n.field}`),n?.entityName||n?.entityId){r+=` (`;let e=[];n.entityName&&e.push(n.entityName),n.entityId&&e.push(`id: "${n.entityId}"`),r+=e.join(`, `),r+=`)`}super({name:Nt,message:`${r}: Value: ${JSON.stringify(e)}.
3
3
  Error message: ${bt(t)}`,cause:t}),this[It]=!0,this.value=e,this.context=n}static isInstance(e){return D.hasMarker(e,Pt)}static wrap({value:t,cause:n,context:r}){return e.isInstance(n)&&n.value===t&&n.context?.field===r?.field&&n.context?.entityName===r?.entityName&&n.context?.entityId===r?.entityId?n:new e({value:t,cause:n,context:r})}},Rt=class extends Error{constructor(e,t){super(e),this.name=`ParseError`,this.type=t.type,this.field=t.field,this.value=t.value,this.line=t.line}},zt=10,Bt=13,k=32;function Vt(e){}function Ht(e){if(typeof e==`function`)throw TypeError("`config` must be an object, got a function instead. Did you mean `createParser({onEvent: fn})`?");let{onEvent:t=Vt,onError:n=Vt,onRetry:r=Vt,onComment:i,maxBufferSize:a}=e,o=[],s=0,c=!0,l,u=``,d=0,f,p=!1;function m(e){if(p)throw Error("Cannot feed parser: it was terminated after exceeding the configured max buffer size. Call `reset()` to resume parsing.");if(c&&(c=!1,e.charCodeAt(0)===239&&e.charCodeAt(1)===187&&e.charCodeAt(2)===191&&(e=e.slice(3))),o.length===0){let t=g(e);t!==``&&(o.push(t),s=t.length),h();return}if(e.indexOf(`
4
4
  `)===-1&&e.indexOf(`\r`)===-1){o.push(e),s+=e.length,h();return}o.push(e);let t=o.join(``);o.length=0,s=0;let n=g(t);n!==``&&(o.push(n),s=n.length),h()}function h(){a!==void 0&&(s+u.length<=a||(p=!0,o.length=0,s=0,l=void 0,u=``,d=0,f=void 0,n(new Rt(`Buffered data exceeded max buffer size of ${a} characters`,{type:`max-buffer-size-exceeded`}))))}function g(e){let n=0;if(e.indexOf(`\r`)===-1){let r=e.indexOf(`
@@ -1946,4 +1946,4 @@ jsResource:
1946
1946
  `,"using-blob-datatype":"---\nname: using-blob-datatype\ndescription: How to use the Blob data type for efficient binary storage in Harper.\nmetadata:\n mode: generate\n sources:\n - reference/v5/database/schema.md#Blob Type\n - reference/v5/database/api.md#Streaming\n - reference/v5/database/api.md#`BlobOptions`\n - reference/v5/database/api.md#Blob Coercion\n sourceCommit: f37a8c4021e20d5c74c1d339a6b6c8c196b5603e\n inputHash: 92e03eb0b830f335\n---\n\n# Using the Blob Data Type\n\nInstructions for the agent to follow when storing and retrieving large binary content using the `Blob` data type in Harper.\n\n## When to Use\n\nApply this rule when a schema field needs to store large binary content such as images, video, audio, or large HTML — typically content larger than 20KB. Use `Blob` instead of `Bytes` when streaming support and out-of-record storage are required. See [handling-binary-data.md](handling-binary-data.md) for broader binary data guidance.\n\n## How It Works\n\n1. **Declare a `Blob` field in your schema**: Add a field typed as `Blob` to your `@table` type.\n\n ```graphql\n type MyTable @table {\n id: Any! @primaryKey\n data: Blob\n }\n ```\n\n2. **Create and store a blob with `createBlob()`**: Pass a buffer or stream to `createBlob()`, then `put` the record.\n\n ```javascript\n let blob = createBlob(largeBuffer);\n await MyTable.put({ id: 'my-record', data: blob });\n ```\n\n3. **Retrieve blob data using standard Web API methods**: The `Blob` type implements the Web API `Blob` interface. Use `.bytes()`, `.text()`, `.arrayBuffer()`, `.stream()`, or `.slice()` as needed.\n\n ```javascript\n let record = await MyTable.get('my-record');\n let buffer = await record.data.bytes(); // ArrayBuffer\n let text = await record.data.text(); // string\n let stream = record.data.stream(); // ReadableStream\n ```\n\n4. **Use `saveBeforeCommit` when full write must precede commit**: By default, `Blob` is not ACID-compliant — a record can reference a blob before it is fully written. Set `saveBeforeCommit: true` to block the transaction until the blob is fully saved.\n\n ```javascript\n let blob = createBlob(stream, { saveBeforeCommit: true });\n await MyTable.put({ id: 'my-record', data: blob });\n // put() resolves only after blob is fully written and record is committed\n ```\n\n5. **Register an error handler when returning a blob via REST**: Interrupted streams must be handled explicitly.\n\n ```javascript\n export class MyEndpoint extends MyTable {\n static async get(target) {\n const record = super.get(target);\n let blob = record.data;\n blob.on('error', () => {\n MyTable.invalidate(target);\n });\n return { status: 200, headers: {}, body: blob };\n }\n }\n ```\n\n6. **Rely on automatic coercion where applicable**: When a field is typed as `Blob` in the schema, any string or buffer assigned via `put`, `patch`, or `publish` is automatically coerced to a `Blob` — no manual `createBlob()` call is needed in those cases.\n\n### `BlobOptions` reference\n\nPass an options object as the second argument to `createBlob()`.\n\n| Option | Type | Default | Description |\n| ------------------ | --------- | ----------- | ------------------------------------------------------------------------------------------------------------------------ |\n| `type` | `string` | `undefined` | MIME type to associate with the blob (e.g., `image/jpeg`). Readable via `blob.type` and used when serving HTTP. |\n| `size` | `number` | `undefined` | Size of the data in bytes, if known ahead of time. Otherwise inferred from a buffer or determined as a stream completes. |\n| `saveBeforeCommit` | `boolean` | `false` | Wait until the blob is fully written before the transaction commits. |\n| `compress` | `boolean` | `false` | Compress the stored data with deflate. |\n| `flush` | `boolean` | `false` | Flush the file to disk after writing, before the `createBlob` promise chain resolves. |\n\n## Examples\n\n**Store an image with a MIME type:**\n\n```javascript\nlet blob = createBlob(imageBuffer, { type: 'image/jpeg' });\nawait Photo.put({ id, data: blob });\n```\n\n**Stream a blob in as it streams out (low-latency passthrough):**\n\n```javascript\nlet blob = createBlob(incomingStream);\n// blob exists, but data is still streaming to storage\nawait MyTable.put({ id: 'my-record', data: blob });\n\nlet record = await MyTable.get('my-record');\n// blob data is accessible as it arrives\nlet outgoingStream = record.data.stream();\n```\n\n**Guarantee full write before commit using `saveBeforeCommit`:**\n\n```javascript\nlet blob = createBlob(stream, { saveBeforeCommit: true });\nawait MyTable.put({ id: 'my-record', data: blob });\n```\n\n## Notes\n\n- `Blob` stores data separately from the record. If you need the binary data to be a true, ACID-committed part of the record, use a `Bytes` field instead.\n- All standard Web API `Blob` methods — `.text()`, `.arrayBuffer()`, `.stream()`, `.slice()`, and `.bytes()` — are available on retrieved blob fields.\n- Without `saveBeforeCommit: true`, blobs are **not** ACID-compliant by default; a record can reference a blob before it is fully written to storage.\n","vector-indexing":'---\nname: vector-indexing\ndescription: How to enable and query vector indexes for similarity search in Harper.\nmetadata:\n mode: generate\n sources:\n - reference/v5/database/schema.md#Vector Indexing\n sourceCommit: 4fe4c9c95e0974eaa77032f6f10e36fbd8ec64ac\n inputHash: d90b1b74597d08a6\n---\n\n# Vector Indexing\n\nInstructions for the agent to enable HNSW vector indexes on table fields and query them for similarity search in Harper.\n\n## When to Use\n\nApply this rule when adding a vector similarity search capability to a Harper table — for example, storing text embeddings and querying for nearest neighbors, filtering by distance threshold, or tuning index construction and search parameters. Use it alongside [adding-tables-with-schemas.md](adding-tables-with-schemas.md) when defining the schema that hosts the vector field.\n\n## How It Works\n\n1. **Declare the vector index on a field**: Add `@indexed(type: "HNSW")` to a `[Float]` field inside a `@table` type. This creates an HNSW (Hierarchical Navigable Small World) index for approximate nearest-neighbor search.\n\n ```graphql\n type Document @table {\n id: Long @primaryKey\n textEmbeddings: [Float] @indexed(type: "HNSW")\n }\n ```\n\n2. **Query by nearest neighbors using `sort`**: Call `.search()` with a `sort` descriptor that specifies the indexed `attribute` and a `target` vector. Use `limit` to cap results.\n\n ```javascript\n let results = Document.search({\n sort: { attribute: \'textEmbeddings\', target: searchVector },\n limit: 5,\n });\n ```\n\n3. **Combine with filter conditions**: Add a `conditions` array alongside `sort` to pre-filter records before ranking by similarity.\n\n ```javascript\n let results = Document.search({\n conditions: [{ attribute: \'price\', comparator: \'lt\', value: 50 }],\n sort: { attribute: \'textEmbeddings\', target: searchVector },\n limit: 5,\n });\n ```\n\n4. **Filter by distance threshold**: To return only records within a similarity cutoff (without ranking), place `target` directly on the condition alongside `comparator` and `value`. This bounds result quality rather than ranking by similarity.\n\n ```javascript\n let results = Document.search({\n conditions: {\n attribute: \'textEmbeddings\',\n comparator: \'lt\',\n value: 0.1,\n target: searchVector,\n },\n });\n ```\n\n5. **Include computed distance in results**: Use the special `$distance` field in `select` to return the distance from the target vector. Available in both `sort`-based and threshold-based queries.\n\n ```javascript\n let results = Document.search({\n select: [\'name\', \'$distance\'],\n sort: { attribute: \'textEmbeddings\', target: searchVector },\n limit: 5,\n });\n ```\n\n6. **Tune per-query search options**: Pass `distance` and `ef` directly on the `sort` descriptor to override index defaults for a single query.\n\n ```javascript\n let results = Document.search({\n sort: { attribute: \'textEmbeddings\', target: searchVector, distance: \'dotProduct\', ef: 200 },\n limit: 5,\n });\n ```\n\n - `distance` — overrides the distance function for this query: `"cosine"`, `"euclidean"`, or `"dotProduct"`.\n - `ef` — overrides the search exploration budget. Higher values improve recall at the cost of latency.\n\n7. **Configure HNSW index parameters**: Pass parameters directly in the `@indexed` directive. Structural parameters (`distance`, `M`, `efConstruction`, `quantization`) trigger an index rebuild when changed; `efConstructionSearch` does not.\n\n ```graphql\n type Document @table {\n id: Long @primaryKey\n textEmbeddings: [Float]\n @indexed(type: "HNSW", distance: "euclidean", optimizeRouting: 0, efConstructionSearch: 100)\n }\n ```\n\n8. **Enable vector quantization**: Use `quantization: "int8"` to store vectors as 8-bit integers, reducing index size and memory usage. Harper re-ranks nearest-neighbor `sort` results against full-precision vectors automatically.\n\n ```graphql\n type Document @table {\n id: Long @primaryKey\n textEmbeddings: [Float] @indexed(type: "HNSW", quantization: "int8")\n }\n ```\n\n## Examples\n\nFull schema with custom HNSW parameters and a nearest-neighbor query with distance output:\n\n```graphql\ntype Document @table {\n id: Long @primaryKey\n textEmbeddings: [Float]\n @indexed(type: "HNSW", distance: "euclidean", optimizeRouting: 0, efConstructionSearch: 100)\n}\n```\n\n```javascript\n// Nearest-neighbor search with distance scores\nlet results = Document.search({\n select: [\'name\', \'$distance\'],\n sort: { attribute: \'textEmbeddings\', target: searchVector },\n limit: 5,\n});\n\n// Distance-threshold query (no ranking)\nlet closeMatches = Document.search({\n conditions: {\n attribute: \'textEmbeddings\',\n comparator: \'lt\',\n value: 0.1,\n target: searchVector,\n },\n});\n```\n\n## Notes\n\n### HNSW Parameters\n\n| Parameter | Default | Description |\n| ---------------------- | ----------------- | ------------------------------------------------------------------------------------------------------ |\n| `distance` | `"cosine"` | Distance function: `"cosine"`, `"euclidean"`, or `"dotProduct"` |\n| `efConstruction` | `100` | Max nodes explored during index construction. Higher = better recall, lower = better performance |\n| `M` | `16` | Preferred connections per graph layer. Higher = more space, better recall for high-dimensional data |\n| `optimizeRouting` | `0.5` | Heuristic aggressiveness for omitting redundant connections (0 = off, 1 = most aggressive) |\n| `mL` | computed from `M` | Normalization factor for level generation |\n| `efConstructionSearch` | auto-scaled | Max nodes explored during search. When unset, auto-scales with index size; setting it fixes the budget |\n| `quantization` | — | `"int8"` stores vectors quantized to int8 |\n\n- The `distance` option on a per-query `sort` descriptor accepts `"cosine"`, `"euclidean"`, or `"dotProduct"`.\n- When no `ef` is passed and `efConstructionSearch` (or `efConstruction`) is not explicitly set on the index, the search budget auto-scales with index size.\n- `efConstruction` seeds the initial value of `efConstructionSearch`; setting either one fixes the search budget.\n- The correct parameter name is `efConstructionSearch` (not `efSearchConstruction`).\n- `$distance` is available in both `sort`-based ranking and `conditions`-based threshold queries.\n- For `quantization: "int8"`, distance-threshold (`lt`/`le`) queries filter on approximate distance; `sort` queries re-rank against full-precision vectors.\n'},oa={name:`readHarperSkill`,description:`Returns documentation for a Harper skill or best practice. Skills provide guidance on developing Harper applications.`,inputSchema:o({skill:g(ia)})};async function sa({input:{skill:e}}){return{success:!!aa[e],message:aa[e]||`No skill found with the name ${e}`}}var ca={...oa,icon:at,execute:sa},la={name:`readLogs`,description:`Returns the matching logs from the server.`,inputSchema:o({log_name:g([`hdb.log`,`system.log`]).default(`hdb.log`),limit:c().or(s()).optional(),level:g([`notify`,`error`,`warn`,`info`,`debug`,`trace`,`undefined`]).or(s()).optional(),from:c().or(s()).optional(),until:c().or(s()).optional()})};async function ua({input:e,instanceClientParams:t}){try{return{success:!0,data:await Xe({...t,logFilters:e,replicated:t.entityType===`cluster`})}}catch(e){return{success:!1,message:`Error: ${e}`}}}var da={...la,icon:lt,execute:ua},fa={name:`readTableRecords`,description:`Retrieves some or all table records from a database on the server.`,inputSchema:o({database:c().trim(),table:c().trim(),pageIndex:d().default(0),pageSize:d().default(10),primaryKey:c(),conditions:l(o({search_attribute:c(),search_type:g([`between`,`eq`,`equals`,`greater_than`,`greater_than_equal`,`less_than`,`less_than_equal`,`ne`,`not_equal`,`starts_with`]),search_value:_()})),sort:o({attribute:c(),descending:p()})})};async function pa({input:{database:e,table:t,conditions:n,primaryKey:r,...i},instanceClientParams:a}){try{if(!n.length){let{data:n}=await je({...a,databaseName:e,tableName:t,onlyIfCached:!0,searchAttribute:r,...i});return{success:!0,data:n}}let{data:o}=await tt({...a,databaseName:e,tableName:t,onlyIfCached:!0,conditions:n,...i});return{success:!0,data:o}}catch(e){return{success:!1,message:`Error: ${e}`}}}var ma={...fa,icon:He,execute:pa},ha={name:`restartHTTPService`,description:`Restarts the HTTP service on the server to allow schema and resource changes to be applied.`,inputSchema:o({})};async function ga({instanceClientParams:e,baseURL:t}){let n=C.loading(`Restarting HTTP service...`,{description:`This may take a bit.`,duration:3e5});try{await Ye({...e,operation:`restart_service`,replicated:e.entityType===`cluster`})}catch(e){return{success:!1,message:`Error: ${e}`}}return C.success(`Done!`,{description:`HTTP Service restarted!`,id:n,duration:5e3}),{success:!0,message:`HTTP Service restarted!`,webURL:t}}var _a={...ha,icon:de,execute:ga,requiresApproval:!0},va={name:`setComponentFile`,description:`Returns the contents of a component file by its full path (which was returned by getComponents)`,inputSchema:o({path:c().trim(),payload:c(),encoding:g([`utf8`,`ASCII`,`binary`,`hex`,`base64`,`utf16le`,`latin1`,`ucs2`])})};async function ya({input:{path:e,encoding:t,payload:n},instanceClientParams:r}){try{let i=e.split(`/`),a=i.shift(),o=i.join(`/`),s=await Ce({...r,file:o,project:a,payload:n,encoding:t});return await Te.invalidateQueries({queryKey:[r.entityId,`get_component_file`,a,o]}),ke(`ReloadApplicationRootEntries`,!0),{success:!0,data:s}}catch(e){return{success:!1,message:`Error: ${e}`}}}var ba={...va,icon:ct,execute:ya,requiresApproval:!0},xa={name:`updateTableRecords`,description:`Updates records in a particular table in a particular database on the server.`,inputSchema:o({database:c().trim(),table:c().trim(),records:l(_())})};async function Sa({input:{database:e,table:t,records:n},instanceClientParams:r,params:i}){try{let a=await We({...r,databaseName:e,tableName:t,records:n}),{databaseName:o,tableName:s}=i;return await Te.invalidateQueries({queryKey:[r.entityId,o,s]}),{success:!0,data:a}}catch(e){return{success:!1,message:`Error: ${e}`}}}var Ca={readHarperSkill:ca,createApp:Ei,readLogs:da,getAnalytics:Fi,listAnalyticsMetrics:ra,restartHTTPService:_a,collectFeedback:Ci,getUserContext:Xi,getComponentFile:Ri,getComponents:Vi,setComponentFile:ba,dropComponentFile:Mi,getDescribeAll:Wi,getDescribeTable:qi,insertTableRecords:$i,readTableRecords:ma,updateTableRecords:{...xa,icon:it,execute:Sa,requiresApproval:!0},deleteTableRecords:ki};function wa(e){return Ca[e]}function Ta(e){return e.state===`input-available`&&!!wa(Zr(e))?.requiresApproval}function Ea(e){let t=[];for(let[n,r]of(e??[]).entries()){if(G(r)){if(Ta(r)){t.push({kind:`part`,part:r,index:n});continue}let e=t.at(-1);e?.kind===`tool-group`?e.parts.push(r):t.push({kind:`tool-group`,parts:[r],index:n});continue}qr(r)&&r.text.length>0&&t.push({kind:`part`,part:r,index:n})}return t}function Da({part:e,onApprove:t,onDeny:n,onAlwaysApprove:i,isApproving:a}){let[o,s]=(0,T.useState)(!1),[c,l]=(0,T.useState)(!1),u=Zr(e),d=wa(u),f=d?.icon||Ke,p=d?.requiresApproval,m=(0,T.useMemo)(()=>!e.input||typeof e.input==`object`&&Object.keys(e.input).length===0,[e.input]),h=(0,T.useMemo)(()=>{let t=JSON.stringify(e.input,null,` `);return{json:t,lines:t?t.split(`
1947
1947
  `).length:0}},[e.input]),g=(0,T.useMemo)(()=>{let t=JSON.stringify(e.output,null,` `);return{json:t,lines:t?t.split(`
1948
1948
  `).length:0}},[e.output]);return(0,E.jsxs)(`div`,{className:`tool-invocation ${e.state}`,children:[(0,E.jsxs)(`div`,{className:`tool-info`,children:[(0,E.jsxs)(`div`,{className:`tool-name`,children:[(0,E.jsx)(f,{size:14}),(0,E.jsx)(`span`,{children:u})]}),(0,E.jsxs)(`div`,{className:`tool-status`,children:[e.state===`input-streaming`&&(0,E.jsx)(`span`,{children:`Thinking...`}),e.state===`input-available`&&(0,E.jsx)(`span`,{children:a?`Executing...`:p?`Awaiting Approval...`:`Executing...`}),e.state===`output-available`&&(e.output?.error?(0,E.jsx)(st,{size:14,className:`text-destructive`}):(0,E.jsx)(le,{size:14}))]})]}),e.state!==`input-streaming`&&(0,E.jsxs)(`div`,{className:`tool-io`,children:[!m&&(0,E.jsxs)(`div`,{className:`tool-args`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between gap-2 mb-1`,children:[(0,E.jsx)(`strong`,{children:`Input:`}),h.lines>3&&(0,E.jsx)(r,{type:`button`,variant:`ghost`,size:`sm`,className:`h-6 px-2 text-[10px] uppercase tracking-wider text-muted-foreground hover:text-foreground`,onClick:()=>s(!o),children:o?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(fe,{size:12}),`Hide`]}):(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(ue,{size:12}),`Show`]})})]}),(0,E.jsx)(`div`,{className:o?`whitespace-pre-wrap`:`line-clamp-3 overflow-hidden whitespace-pre-wrap`,children:h.json})]}),e.state===`input-available`&&p&&(0,E.jsxs)(`div`,{className:`flex gap-2 mt-3 pt-3 border-t`,children:[(0,E.jsxs)(r,{size:`sm`,className:`h-8 text-xs bg-green-600 hover:bg-green-700 text-white`,onClick:()=>t?.(e.toolCallId),disabled:a,children:[a?(0,E.jsx)(Qe,{className:`mr-2 h-3 w-3 animate-spin`}):null,`Approve`]}),(0,E.jsx)(r,{type:`button`,size:`sm`,variant:`outline`,className:`h-8 text-xs approval-outline`,onClick:()=>i?.(e.toolCallId),disabled:a,children:`Always Approve`}),(0,E.jsx)(r,{type:`button`,size:`sm`,variant:`outline`,className:`h-8 text-xs approval-outline`,onClick:()=>n?.(e.toolCallId),disabled:a,children:`Deny`})]}),e.state===`output-available`&&(0,E.jsx)(E.Fragment,{children:d?.render?d.render(e):(0,E.jsxs)(`div`,{className:`tool-result`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between gap-2 mb-1`,children:[(0,E.jsx)(`strong`,{children:`Result:`}),g.lines>3&&(0,E.jsx)(r,{type:`button`,variant:`ghost`,size:`sm`,className:`h-6 px-2 text-[10px] uppercase tracking-wider text-muted-foreground hover:text-foreground`,onClick:()=>l(!c),children:c?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(fe,{size:12}),`Hide`]}):(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(ue,{size:12}),`Show`]})})]}),(0,E.jsx)(`div`,{className:c?`whitespace-pre-wrap`:`line-clamp-3 overflow-hidden whitespace-pre-wrap`,children:g.json})]})})]})]})}function Oa({parts:e,onApprove:t,onDeny:n,onAlwaysApprove:r,approvingToolCallIds:i}){let[a,o]=(0,T.useState)(!1),s=e.some(e=>e.state!==`output-available`&&e.state!==`output-error`),c=e.some(e=>e.state===`output-error`||e.state===`output-available`&&e.output?.error),l=e.length===1?Zr(e[0]):void 0,u=l&&wa(l)?.icon||ft,d=l??`${e.length} tools`;return(0,E.jsxs)(`div`,{className:`tool-group`,children:[(0,E.jsxs)(`button`,{type:`button`,className:`tool-group-summary`,"aria-expanded":a,onClick:()=>o(!a),children:[a?(0,E.jsx)(ue,{size:14}):(0,E.jsx)(Je,{size:14}),(0,E.jsx)(u,{size:14}),(0,E.jsx)(`span`,{children:s?`Using ${d}...`:`Used ${d}`}),(0,E.jsx)(`span`,{className:`tool-group-status`,children:s?(0,E.jsx)(Qe,{size:14,className:`animate-spin`}):c?(0,E.jsx)(st,{size:14,className:`text-destructive`}):(0,E.jsx)(le,{size:14})})]}),a&&e.map(e=>(0,E.jsx)(Da,{part:e,onApprove:t,onDeny:n,onAlwaysApprove:r,isApproving:i?.has(e.toolCallId)},e.toolCallId))]})}function ka({message:e,onApprove:t,onDeny:n,onAlwaysApprove:r,approvingToolCallIds:i}){return e.parts?.some(e=>qr(e)&&e.text.length>0||G(e))?(0,E.jsxs)(ce.div,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},className:`message-bubble ${e.role===`user`?`user`:`assistant`}`,children:[(0,E.jsx)(`div`,{className:`avatar`,children:e.role===`user`?(0,E.jsx)(Be,{size:18}):(0,E.jsx)(se,{size:18})}),(0,E.jsx)(`div`,{className:`content`,children:Ea(e.parts).map(e=>{if(e.kind===`tool-group`)return(0,E.jsx)(Oa,{parts:e.parts,onApprove:t,onDeny:n,onAlwaysApprove:r,approvingToolCallIds:i},e.parts[0].toolCallId);let{part:a,index:o}=e;return qr(a)?(0,E.jsx)(`div`,{className:`text-block`,children:a.text},o):G(a)?(0,E.jsx)(Da,{part:a,onApprove:t,onDeny:n,onAlwaysApprove:r,isApproving:i?.has(a.toolCallId)},o):null})})]},e.id):null}function Aa(e,t){if(e!==`submitted`&&e!==`streaming`)return!1;if(t?.role!==`assistant`)return!0;let n=t.parts?.at(-1);return n?qr(n)?n.state!==`streaming`||n.text.length===0:!G(n)||n.state===`output-available`||n.state===`output-error`:!0}function ja(){return(0,E.jsxs)(ce.div,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},transition:{delay:.2},className:`message-bubble assistant`,children:[(0,E.jsx)(`div`,{className:`avatar`,children:(0,E.jsx)(se,{size:18})}),(0,E.jsxs)(`div`,{className:`content thinking-indicator`,role:`status`,"aria-label":`Harper Agent is thinking`,children:[(0,E.jsx)(`span`,{className:`thinking-dot`}),(0,E.jsx)(`span`,{className:`thinking-dot`}),(0,E.jsx)(`span`,{className:`thinking-dot`})]})]})}function Ma(e){return ie({queryKey:[`getMyUsage`,e],queryFn:async()=>{let{data:t}=await n.get(`/Chat/Usage/${e}`);return t}})}function Na(){let{organizationId:e}=te({strict:!1});return re(Ma(e))}function Pa(){let{data:e,isLoading:t,error:n}=Na();if(t||n||!e)return null;let{usageUSD:r,monthlyLimitUSD:i,usageBarPercent:a}=e,o=e=>new Intl.NumberFormat(`en-US`,{style:`currency`,currency:`USD`}).format(e);return(0,E.jsxs)(`div`,{className:`usage-container`,children:[(0,E.jsxs)(`div`,{className:`usage-info`,children:[(0,E.jsx)(`span`,{children:`Monthly Org Usage`}),(0,E.jsxs)(`span`,{children:[o(r),` / `,o(i)]}),(0,E.jsxs)(`span`,{children:[Math.round(a),`%`]})]}),(0,E.jsx)(`div`,{className:`usage-bar-bg`,children:(0,E.jsx)(`div`,{className:`usage-bar-fill`,style:{width:`${a}%`}})})]})}function Fa({autoFocus:e,closeChat:t}){let n=te({strict:!1}),{organizationId:r}=n,[i,a]=Ae(`ApplicationChat`,``),[o,s]=(0,T.useState)(!0),[c,l]=(0,T.useState)({}),[u,d]=(0,T.useState)(new Set),[f,p]=Ee(De.ChatAlwaysApprovedTools,[]),m=new Set(f),h=nt(),g=Fe(),_=ne(),{messages:v,sendMessage:ee,status:y,addToolOutput:b,setMessages:x}=vi({transport:si(r),generateId:A(),sendAutomaticallyWhen:oi,onFinish(){_.invalidateQueries({queryKey:[`getMyUsage`]})},async onToolCall({toolCall:e}){if(e.dynamic)return;let t=wa(e.toolName);if(t){if(t.requiresApproval&&!m.has(e.toolName)){let t={type:`tool-call`,toolCallId:e.toolCallId,toolName:e.toolName,input:e.input};l(n=>({...n,[e.toolCallId]:t}));return}let r=await t.execute({input:e.input,instanceClientParams:g,baseURL:h,params:n});b({tool:e.toolName,toolCallId:e.toolCallId,output:r})}}}),S=(0,T.useCallback)(async e=>{let t=c[e];if(t){d(t=>{let n=new Set(t);return n.add(e),n});try{let r=wa(t.toolName);if(r){let i=await r.execute({input:t.input,instanceClientParams:g,baseURL:h,params:n});b({tool:t.toolName,toolCallId:t.toolCallId,output:i}),l(t=>{let n={...t};return delete n[e],n})}}finally{d(t=>{let n=new Set(t);return n.delete(e),n})}}},[c,g,h,b,n]),re=(0,T.useCallback)(e=>{let t=c[e];t&&(b({tool:t.toolName,toolCallId:t.toolCallId,output:{error:`User denied the tool execution.`}}),l(t=>{let n={...t};return delete n[e],n}))},[c,b]),ie=(0,T.useCallback)(async e=>{let t=c[e];t&&(p(e=>Re([...e,t.toolName])),await S(e))},[c,p,S]);(0,T.useEffect)(()=>{(async()=>{try{let e=await ht();Array.isArray(e)&&x(e)}catch(e){console.error(`Failed to fetch initial messages:`,e)}finally{s(!1)}})()},[x]);let ae=y===`streaming`||y===`submitted`,oe=(0,T.useRef)(null);return(0,T.useEffect)(()=>{oe.current?.scrollIntoView({behavior:`smooth`})},[v]),(0,E.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,E.jsxs)(`div`,{className:`flex items-start justify-between gap-6 px-4 py-2.5 border-b border-border bg-card`,children:[(0,E.jsxs)(`div`,{className:`flex flex-col gap-1 min-w-0 flex-1`,children:[(0,E.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,E.jsx)(se,{className:`text-primary`,size:20}),(0,E.jsx)(`span`,{className:`font-semibold text-foreground`,children:`Harper Agent`})]}),(0,E.jsx)(Pa,{})]}),(0,E.jsxs)(`div`,{className:`flex items-center gap-2 shrink-0`,children:[(0,E.jsx)(mt,{setMessages:x}),(0,E.jsx)(`button`,{onClick:t,className:`p-1 hover:bg-accent rounded-md transition-colors text-muted-foreground hover:text-foreground`,title:`Close chat`,children:(0,E.jsx)(pe,{size:20})})]})]}),(0,E.jsx)(`div`,{className:`flex-1 overflow-hidden`,children:(0,E.jsxs)(`div`,{className:`chat-interface h-full w-full`,children:[(0,E.jsxs)(`div`,{className:`messages-area`,children:[o&&(0,E.jsx)(bi,{}),!o&&v.length===0&&(0,E.jsxs)(`div`,{className:`empty-state`,children:[(0,E.jsx)(se,{size:48}),(0,E.jsx)(`p`,{children:`Ask me to create a Harper app!`})]}),v.map(e=>(0,E.jsx)(ka,{message:e,onApprove:S,onDeny:re,onAlwaysApprove:ie,approvingToolCallIds:u},e.id)),Aa(y,v.at(-1))&&(0,E.jsx)(ja,{}),(0,E.jsx)(`div`,{ref:oe})]}),(0,E.jsx)(yi,{input:i,setInput:a,onSubmit:e=>{e.preventDefault(),i.trim()&&!ae&&!o&&(ee({text:i}),a(``))},disabled:o,autoFocus:e})]})})]})}export{Fa as Chat};
1949
- //# sourceMappingURL=Chat-CTjtL8Z4.js.map
1949
+ //# sourceMappingURL=Chat-BZks8dVF.js.map