@oscharko-dev/keiko 0.2.0-beta.4 → 0.2.0-beta.5

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 (228) hide show
  1. package/dist/ui/csp-hashes.json +18 -18
  2. package/dist/ui/static/404.html +1 -1
  3. package/dist/ui/static/__next.__PAGE__.txt +2 -2
  4. package/dist/ui/static/__next._full.txt +3 -3
  5. package/dist/ui/static/__next._head.txt +1 -1
  6. package/dist/ui/static/__next._index.txt +2 -2
  7. package/dist/ui/static/__next._tree.txt +2 -2
  8. package/dist/ui/static/_next/static/chunks/1m-kvwm6_90_3.css +1 -0
  9. package/dist/ui/static/_next/static/chunks/2ngm8iwdb1cbv.js +106 -0
  10. package/dist/ui/static/_not-found/__next._full.txt +2 -2
  11. package/dist/ui/static/_not-found/__next._head.txt +1 -1
  12. package/dist/ui/static/_not-found/__next._index.txt +2 -2
  13. package/dist/ui/static/_not-found/__next._not-found.__PAGE__.txt +1 -1
  14. package/dist/ui/static/_not-found/__next._not-found.txt +1 -1
  15. package/dist/ui/static/_not-found/__next._tree.txt +2 -2
  16. package/dist/ui/static/_not-found.html +1 -1
  17. package/dist/ui/static/_not-found.txt +2 -2
  18. package/dist/ui/static/index.html +1 -1
  19. package/dist/ui/static/index.txt +3 -3
  20. package/dist/ui/static/launch/__next._full.txt +3 -3
  21. package/dist/ui/static/launch/__next._head.txt +1 -1
  22. package/dist/ui/static/launch/__next._index.txt +2 -2
  23. package/dist/ui/static/launch/__next._tree.txt +2 -2
  24. package/dist/ui/static/launch/__next.launch.__PAGE__.txt +2 -2
  25. package/dist/ui/static/launch/__next.launch.txt +1 -1
  26. package/dist/ui/static/launch.html +1 -1
  27. package/dist/ui/static/launch.txt +3 -3
  28. package/dist/ui/static/local-knowledge/__next._full.txt +3 -3
  29. package/dist/ui/static/local-knowledge/__next._head.txt +1 -1
  30. package/dist/ui/static/local-knowledge/__next._index.txt +2 -2
  31. package/dist/ui/static/local-knowledge/__next._tree.txt +2 -2
  32. package/dist/ui/static/local-knowledge/__next.local-knowledge.__PAGE__.txt +2 -2
  33. package/dist/ui/static/local-knowledge/__next.local-knowledge.txt +1 -1
  34. package/dist/ui/static/local-knowledge/capsule/__next._full.txt +2 -2
  35. package/dist/ui/static/local-knowledge/capsule/__next._head.txt +1 -1
  36. package/dist/ui/static/local-knowledge/capsule/__next._index.txt +2 -2
  37. package/dist/ui/static/local-knowledge/capsule/__next._tree.txt +2 -2
  38. package/dist/ui/static/local-knowledge/capsule/__next.local-knowledge.capsule.__PAGE__.txt +1 -1
  39. package/dist/ui/static/local-knowledge/capsule/__next.local-knowledge.capsule.txt +1 -1
  40. package/dist/ui/static/local-knowledge/capsule/__next.local-knowledge.txt +1 -1
  41. package/dist/ui/static/local-knowledge/capsule.html +1 -1
  42. package/dist/ui/static/local-knowledge/capsule.txt +2 -2
  43. package/dist/ui/static/local-knowledge.html +1 -1
  44. package/dist/ui/static/local-knowledge.txt +3 -3
  45. package/dist/ui/static/memoriaviva/__next._full.txt +2 -2
  46. package/dist/ui/static/memoriaviva/__next._head.txt +1 -1
  47. package/dist/ui/static/memoriaviva/__next._index.txt +2 -2
  48. package/dist/ui/static/memoriaviva/__next._tree.txt +2 -2
  49. package/dist/ui/static/memoriaviva/__next.memoriaviva.__PAGE__.txt +1 -1
  50. package/dist/ui/static/memoriaviva/__next.memoriaviva.txt +1 -1
  51. package/dist/ui/static/memoriaviva/consolidation/__next._full.txt +2 -2
  52. package/dist/ui/static/memoriaviva/consolidation/__next._head.txt +1 -1
  53. package/dist/ui/static/memoriaviva/consolidation/__next._index.txt +2 -2
  54. package/dist/ui/static/memoriaviva/consolidation/__next._tree.txt +2 -2
  55. package/dist/ui/static/memoriaviva/consolidation/__next.memoriaviva.consolidation.__PAGE__.txt +1 -1
  56. package/dist/ui/static/memoriaviva/consolidation/__next.memoriaviva.consolidation.txt +1 -1
  57. package/dist/ui/static/memoriaviva/consolidation/__next.memoriaviva.txt +1 -1
  58. package/dist/ui/static/memoriaviva/consolidation.html +1 -1
  59. package/dist/ui/static/memoriaviva/consolidation.txt +2 -2
  60. package/dist/ui/static/memoriaviva/detail/__next._full.txt +2 -2
  61. package/dist/ui/static/memoriaviva/detail/__next._head.txt +1 -1
  62. package/dist/ui/static/memoriaviva/detail/__next._index.txt +2 -2
  63. package/dist/ui/static/memoriaviva/detail/__next._tree.txt +2 -2
  64. package/dist/ui/static/memoriaviva/detail/__next.memoriaviva.detail.__PAGE__.txt +1 -1
  65. package/dist/ui/static/memoriaviva/detail/__next.memoriaviva.detail.txt +1 -1
  66. package/dist/ui/static/memoriaviva/detail/__next.memoriaviva.txt +1 -1
  67. package/dist/ui/static/memoriaviva/detail.html +1 -1
  68. package/dist/ui/static/memoriaviva/detail.txt +2 -2
  69. package/dist/ui/static/memoriaviva/review-queue/__next._full.txt +2 -2
  70. package/dist/ui/static/memoriaviva/review-queue/__next._head.txt +1 -1
  71. package/dist/ui/static/memoriaviva/review-queue/__next._index.txt +2 -2
  72. package/dist/ui/static/memoriaviva/review-queue/__next._tree.txt +2 -2
  73. package/dist/ui/static/memoriaviva/review-queue/__next.memoriaviva.review-queue.__PAGE__.txt +1 -1
  74. package/dist/ui/static/memoriaviva/review-queue/__next.memoriaviva.review-queue.txt +1 -1
  75. package/dist/ui/static/memoriaviva/review-queue/__next.memoriaviva.txt +1 -1
  76. package/dist/ui/static/memoriaviva/review-queue.html +1 -1
  77. package/dist/ui/static/memoriaviva/review-queue.txt +2 -2
  78. package/dist/ui/static/memoriaviva.html +1 -1
  79. package/dist/ui/static/memoriaviva.txt +2 -2
  80. package/node_modules/@oscharko-dev/keiko-cli/dist/.tsbuildinfo +1 -1
  81. package/node_modules/@oscharko-dev/keiko-cli/dist/run.d.ts +3 -1
  82. package/node_modules/@oscharko-dev/keiko-cli/dist/run.d.ts.map +1 -1
  83. package/node_modules/@oscharko-dev/keiko-cli/dist/run.js +73 -41
  84. package/node_modules/@oscharko-dev/keiko-cli/package.json +1 -1
  85. package/node_modules/@oscharko-dev/keiko-contracts/dist/.tsbuildinfo +1 -1
  86. package/node_modules/@oscharko-dev/keiko-contracts/dist/index.d.ts +1 -1
  87. package/node_modules/@oscharko-dev/keiko-contracts/dist/index.js +1 -1
  88. package/node_modules/@oscharko-dev/keiko-contracts/dist/qualityIntelligence/bffWire.d.ts +2 -0
  89. package/node_modules/@oscharko-dev/keiko-contracts/dist/qualityIntelligence/bffWire.d.ts.map +1 -1
  90. package/node_modules/@oscharko-dev/keiko-contracts/package.json +1 -1
  91. package/node_modules/@oscharko-dev/keiko-evaluations/dist/.tsbuildinfo +1 -1
  92. package/node_modules/@oscharko-dev/keiko-evaluations/package.json +1 -1
  93. package/node_modules/@oscharko-dev/keiko-evidence/dist/.tsbuildinfo +1 -1
  94. package/node_modules/@oscharko-dev/keiko-evidence/dist/index.d.ts +1 -1
  95. package/node_modules/@oscharko-dev/keiko-evidence/dist/index.d.ts.map +1 -1
  96. package/node_modules/@oscharko-dev/keiko-evidence/dist/index.js +1 -1
  97. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/index.d.ts +3 -3
  98. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/index.d.ts.map +1 -1
  99. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/index.js +1 -1
  100. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/manifestSchema.d.ts +18 -1
  101. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/manifestSchema.d.ts.map +1 -1
  102. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/store.d.ts +33 -0
  103. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/store.d.ts.map +1 -1
  104. package/node_modules/@oscharko-dev/keiko-evidence/dist/qualityIntelligence/store.js +69 -0
  105. package/node_modules/@oscharko-dev/keiko-evidence/package.json +1 -1
  106. package/node_modules/@oscharko-dev/keiko-harness/dist/.tsbuildinfo +1 -1
  107. package/node_modules/@oscharko-dev/keiko-harness/package.json +1 -1
  108. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/.tsbuildinfo +1 -1
  109. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/index.d.ts +0 -1
  110. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/index.d.ts.map +1 -1
  111. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/index.js +0 -1
  112. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/model-gateway-answer-generator.d.ts.map +1 -1
  113. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/model-gateway-answer-generator.js +7 -1
  114. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/types.d.ts.map +1 -1
  115. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/types.js +2 -3
  116. package/node_modules/@oscharko-dev/keiko-local-knowledge/package.json +1 -1
  117. package/node_modules/@oscharko-dev/keiko-memory-capture/package.json +1 -1
  118. package/node_modules/@oscharko-dev/keiko-memory-consolidation/package.json +1 -1
  119. package/node_modules/@oscharko-dev/keiko-memory-governance/package.json +1 -1
  120. package/node_modules/@oscharko-dev/keiko-memory-retrieval/package.json +1 -1
  121. package/node_modules/@oscharko-dev/keiko-memory-vault/dist/.tsbuildinfo +1 -1
  122. package/node_modules/@oscharko-dev/keiko-memory-vault/package.json +1 -1
  123. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/.tsbuildinfo +1 -1
  124. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/normalize.d.ts +1 -0
  125. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/normalize.d.ts.map +1 -1
  126. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/normalize.js +22 -1
  127. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/openai-adapter.d.ts.map +1 -1
  128. package/node_modules/@oscharko-dev/keiko-model-gateway/dist/openai-adapter.js +18 -4
  129. package/node_modules/@oscharko-dev/keiko-model-gateway/package.json +1 -1
  130. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/.tsbuildinfo +1 -1
  131. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/alm.d.ts.map +1 -1
  132. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/alm.js +29 -30
  133. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/markdown.d.ts.map +1 -1
  134. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/markdown.js +29 -5
  135. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/qtest.d.ts.map +1 -1
  136. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/qtest.js +29 -29
  137. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/spreadsheetSafeCsv.d.ts +2 -1
  138. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/spreadsheetSafeCsv.d.ts.map +1 -1
  139. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/spreadsheetSafeCsv.js +40 -2
  140. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/xray.d.ts.map +1 -1
  141. package/node_modules/@oscharko-dev/keiko-quality-intelligence/dist/export/adapters/xray.js +6 -2
  142. package/node_modules/@oscharko-dev/keiko-quality-intelligence/package.json +1 -1
  143. package/node_modules/@oscharko-dev/keiko-sdk/dist/.tsbuildinfo +1 -1
  144. package/node_modules/@oscharko-dev/keiko-sdk/package.json +1 -1
  145. package/node_modules/@oscharko-dev/keiko-security/dist/.tsbuildinfo +1 -1
  146. package/node_modules/@oscharko-dev/keiko-security/package.json +1 -1
  147. package/node_modules/@oscharko-dev/keiko-server/dist/.tsbuildinfo +1 -1
  148. package/node_modules/@oscharko-dev/keiko-server/dist/assistant-response.d.ts +6 -0
  149. package/node_modules/@oscharko-dev/keiko-server/dist/assistant-response.d.ts.map +1 -0
  150. package/node_modules/@oscharko-dev/keiko-server/dist/assistant-response.js +12 -0
  151. package/node_modules/@oscharko-dev/keiko-server/dist/chat-handlers.d.ts +1 -1
  152. package/node_modules/@oscharko-dev/keiko-server/dist/chat-handlers.d.ts.map +1 -1
  153. package/node_modules/@oscharko-dev/keiko-server/dist/chat-handlers.js +11 -4
  154. package/node_modules/@oscharko-dev/keiko-server/dist/chat-stream-handlers.js +1 -1
  155. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-orchestrator.d.ts +0 -1
  156. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-orchestrator.d.ts.map +1 -1
  157. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-orchestrator.js +222 -18
  158. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa-hybrid.d.ts.map +1 -1
  159. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa-hybrid.js +3 -1
  160. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa-multi-source.d.ts.map +1 -1
  161. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa-multi-source.js +3 -1
  162. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa.d.ts.map +1 -1
  163. package/node_modules/@oscharko-dev/keiko-server/dist/grounded-qa.js +3 -1
  164. package/node_modules/@oscharko-dev/keiko-server/dist/local-knowledge-grounded-qa.d.ts.map +1 -1
  165. package/node_modules/@oscharko-dev/keiko-server/dist/local-knowledge-grounded-qa.js +4 -1
  166. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/connectorErrors.d.ts.map +1 -1
  167. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/connectorErrors.js +11 -8
  168. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/editRoutes.d.ts.map +1 -1
  169. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/editRoutes.js +1 -0
  170. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/exportRoutes.d.ts.map +1 -1
  171. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/exportRoutes.js +89 -30
  172. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/generationPort.d.ts.map +1 -1
  173. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/generationPort.js +12 -1
  174. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/handoffErrors.d.ts +1 -1
  175. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/handoffErrors.d.ts.map +1 -1
  176. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/handoffErrors.js +1 -0
  177. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/handoffRoutes.d.ts.map +1 -1
  178. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/handoffRoutes.js +41 -9
  179. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/index.d.ts +1 -0
  180. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/index.d.ts.map +1 -1
  181. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/index.js +2 -0
  182. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/judgePort.d.ts.map +1 -1
  183. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/judgePort.js +17 -3
  184. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/retentionRoutes.d.ts +5 -0
  185. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/retentionRoutes.d.ts.map +1 -0
  186. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/retentionRoutes.js +70 -0
  187. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/reviewRoutes.d.ts.map +1 -1
  188. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/reviewRoutes.js +6 -2
  189. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/reviewStore.d.ts +25 -4
  190. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/reviewStore.d.ts.map +1 -1
  191. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/reviewStore.js +72 -9
  192. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/runIngestion.d.ts.map +1 -1
  193. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/runIngestion.js +46 -3
  194. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/runRegistry.d.ts.map +1 -1
  195. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/runRegistry.js +2 -0
  196. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/uiRoutes.d.ts.map +1 -1
  197. package/node_modules/@oscharko-dev/keiko-server/dist/qualityIntelligence/uiRoutes.js +12 -2
  198. package/node_modules/@oscharko-dev/keiko-server/dist/routes.d.ts.map +1 -1
  199. package/node_modules/@oscharko-dev/keiko-server/dist/routes.js +4 -1
  200. package/node_modules/@oscharko-dev/keiko-server/dist/store-handlers.d.ts.map +1 -1
  201. package/node_modules/@oscharko-dev/keiko-server/dist/store-handlers.js +4 -1
  202. package/node_modules/@oscharko-dev/keiko-server/package.json +1 -1
  203. package/node_modules/@oscharko-dev/keiko-tools/dist/.tsbuildinfo +1 -1
  204. package/node_modules/@oscharko-dev/keiko-tools/package.json +1 -1
  205. package/node_modules/@oscharko-dev/keiko-verification/dist/.tsbuildinfo +1 -1
  206. package/node_modules/@oscharko-dev/keiko-verification/package.json +1 -1
  207. package/node_modules/@oscharko-dev/keiko-workflows/dist/.tsbuildinfo +1 -1
  208. package/node_modules/@oscharko-dev/keiko-workflows/dist/planner/anchors.d.ts.map +1 -1
  209. package/node_modules/@oscharko-dev/keiko-workflows/dist/planner/anchors.js +68 -0
  210. package/node_modules/@oscharko-dev/keiko-workflows/package.json +1 -1
  211. package/node_modules/@oscharko-dev/keiko-workspace/dist/.tsbuildinfo +1 -1
  212. package/node_modules/@oscharko-dev/keiko-workspace/dist/discovery.d.ts.map +1 -1
  213. package/node_modules/@oscharko-dev/keiko-workspace/dist/discovery.js +34 -2
  214. package/node_modules/@oscharko-dev/keiko-workspace/dist/realpath.d.ts +1 -0
  215. package/node_modules/@oscharko-dev/keiko-workspace/dist/realpath.d.ts.map +1 -1
  216. package/node_modules/@oscharko-dev/keiko-workspace/dist/realpath.js +2 -2
  217. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchMatchers.d.ts.map +1 -1
  218. package/node_modules/@oscharko-dev/keiko-workspace/dist/repoSearchMatchers.js +68 -0
  219. package/node_modules/@oscharko-dev/keiko-workspace/package.json +1 -1
  220. package/package.json +1 -1
  221. package/dist/ui/static/_next/static/chunks/1t04tfgin0v_g.js +0 -106
  222. package/dist/ui/static/_next/static/chunks/3wr_35f2vg6sd.css +0 -1
  223. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/scripted-answer-generator.d.ts +0 -6
  224. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/scripted-answer-generator.d.ts.map +0 -1
  225. package/node_modules/@oscharko-dev/keiko-local-knowledge/dist/conversation/scripted-answer-generator.js +0 -49
  226. /package/dist/ui/static/_next/static/{Hb6brrvZY2nZtizQlYhVt → hR2gBQqCDKdPdSxBqZhqv}/_buildManifest.js +0 -0
  227. /package/dist/ui/static/_next/static/{Hb6brrvZY2nZtizQlYhVt → hR2gBQqCDKdPdSxBqZhqv}/_clientMiddlewareManifest.js +0 -0
  228. /package/dist/ui/static/_next/static/{Hb6brrvZY2nZtizQlYhVt → hR2gBQqCDKdPdSxBqZhqv}/_ssgManifest.js +0 -0
@@ -30,6 +30,33 @@ const mapPriority = (priority) => {
30
30
  // qTest default priorities are P-prefixed; pass through verbatim.
31
31
  return priority;
32
32
  };
33
+ // Build the qTest rows for a single candidate. One row per (step, expected) pair — the row count is
34
+ // the longer of `steps`/`expectedResults` so a trailing expected result is never dropped (Issue
35
+ // #283); a candidate with neither yields one empty-step row.
36
+ function qtestRowsFor(candidate) {
37
+ const head = [
38
+ candidate.title,
39
+ buildDescription(candidate),
40
+ "Manual",
41
+ mapPriority(candidate.priority),
42
+ candidate.status,
43
+ ];
44
+ const rowCount = Math.max(candidate.steps.length, candidate.expectedResults.length);
45
+ if (rowCount === 0) {
46
+ return encodeSpreadsheetSafeRow([...head, "", "", ""]);
47
+ }
48
+ let rows = "";
49
+ for (let i = 0; i < rowCount; i += 1) {
50
+ const stepNumber = i < candidate.steps.length ? String(i + 1) : "";
51
+ rows += encodeSpreadsheetSafeRow([
52
+ ...head,
53
+ stepNumber,
54
+ candidate.steps[i] ?? "",
55
+ candidate.expectedResults[i] ?? "",
56
+ ]);
57
+ }
58
+ return rows;
59
+ }
33
60
  export function adaptToQtest(bundle, candidates) {
34
61
  assertExportBundleInvariant(bundle);
35
62
  const byId = new Map();
@@ -43,35 +70,8 @@ export function adaptToQtest(bundle, candidates) {
43
70
  let body = encodeSpreadsheetSafeRow(QTEST_CSV_HEADERS);
44
71
  for (const id of sortedIds) {
45
72
  const candidate = byId.get(id);
46
- if (candidate === undefined) {
47
- continue;
48
- }
49
- if (candidate.steps.length === 0) {
50
- body += encodeSpreadsheetSafeRow([
51
- candidate.title,
52
- buildDescription(candidate),
53
- "Manual",
54
- mapPriority(candidate.priority),
55
- candidate.status,
56
- "",
57
- "",
58
- "",
59
- ]);
60
- continue;
61
- }
62
- for (let i = 0; i < candidate.steps.length; i += 1) {
63
- const action = candidate.steps[i] ?? "";
64
- const expected = candidate.expectedResults[i] ?? "";
65
- body += encodeSpreadsheetSafeRow([
66
- candidate.title,
67
- buildDescription(candidate),
68
- "Manual",
69
- mapPriority(candidate.priority),
70
- candidate.status,
71
- String(i + 1),
72
- action,
73
- expected,
74
- ]);
73
+ if (candidate !== undefined) {
74
+ body += qtestRowsFor(candidate);
75
75
  }
76
76
  }
77
77
  return body;
@@ -7,7 +7,8 @@ import type { QualityIntelligenceTestCaseCandidate } from "@oscharko-dev/keiko-c
7
7
  export declare const SPREADSHEET_FORMULA_LEAD_CHARS: ReadonlySet<string>;
8
8
  /**
9
9
  * Returns `true` if `value` would be interpreted as a formula or DDE invocation
10
- * by a typical spreadsheet because of its leading character.
10
+ * by a typical spreadsheet because of its leading character — including the case where a leading
11
+ * whitespace run precedes a formula lead, which importers may trim before evaluating.
11
12
  */
12
13
  export declare function startsWithFormulaLead(value: string): boolean;
13
14
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"spreadsheetSafeCsv.d.ts","sourceRoot":"","sources":["../../../src/export/adapters/spreadsheetSafeCsv.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AAErF,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,+BAA+B,CAAC;AAE1F;;;GAGG;AACH,eAAO,MAAM,8BAA8B,EAAE,WAAW,CAAC,MAAM,CAQ7D,CAAC;AAEH;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAK5D;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAa/D;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAMzE;AAED;;;GAGG;AACH,eAAO,MAAM,4BAA4B,EAAE,SAAS,MAAM,EAUxD,CAAC;AAIH;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,+BAA+B,EACvC,UAAU,EAAE,SAAS,oCAAoC,EAAE,GAC1D,MAAM,CA2BR"}
1
+ {"version":3,"file":"spreadsheetSafeCsv.d.ts","sourceRoot":"","sources":["../../../src/export/adapters/spreadsheetSafeCsv.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AAErF,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,+BAA+B,CAAC;AAE1F;;;GAGG;AACH,eAAO,MAAM,8BAA8B,EAAE,WAAW,CAAC,MAAM,CAQ7D,CAAC;AAuCH;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAQ5D;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAa/D;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAMzE;AAED;;;GAGG;AACH,eAAO,MAAM,4BAA4B,EAAE,SAAS,MAAM,EAUxD,CAAC;AAIH;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,+BAA+B,EACvC,UAAU,EAAE,SAAS,oCAAoC,EAAE,GAC1D,MAAM,CA2BR"}
@@ -29,15 +29,53 @@ export const SPREADSHEET_FORMULA_LEAD_CHARS = new Set([
29
29
  "\r",
30
30
  "\n",
31
31
  ]);
32
+ // Whitespace code points a spreadsheet import may strip BEFORE formula detection. Several importers
33
+ // (Excel/LibreOffice/Sheets) trim a leading whitespace run, so a cell like " =1+1" or a NBSP/tab-
34
+ // prefixed formula can still evaluate even though its literal first char is not a lead char.
35
+ const LEADING_WHITESPACE_CODE_POINTS = new Set([
36
+ 0x09, // tab
37
+ 0x0a, // line feed
38
+ 0x0b, // vertical tab
39
+ 0x0c, // form feed
40
+ 0x0d, // carriage return
41
+ 0x20, // space
42
+ 0xa0, // no-break space
43
+ 0x2007, // figure space
44
+ 0x2028, // line separator
45
+ 0x2029, // paragraph separator
46
+ 0x202f, // narrow no-break space
47
+ 0xfeff, // zero-width no-break space / BOM
48
+ ]);
49
+ // The formula/DDE lead characters that remain dangerous once a leading whitespace run is stripped.
50
+ // The whitespace leads themselves (TAB/CR/LF) stay covered by the literal first-char check.
51
+ const FORMULA_LEAD_AFTER_WHITESPACE = new Set(["=", "+", "-", "@"]);
52
+ // Scan past a leading whitespace run; return true when the first non-whitespace character is a
53
+ // formula lead. Pure, no regex — scans UTF-16 code units (every listed whitespace point is BMP).
54
+ function firstNonWhitespaceIsFormulaLead(value) {
55
+ let index = 0;
56
+ while (index < value.length && LEADING_WHITESPACE_CODE_POINTS.has(value.charCodeAt(index))) {
57
+ index += 1;
58
+ }
59
+ // index === 0 → no leading whitespace (the literal first-char check already handled it);
60
+ // index >= length → the cell is all whitespace.
61
+ if (index === 0 || index >= value.length) {
62
+ return false;
63
+ }
64
+ return FORMULA_LEAD_AFTER_WHITESPACE.has(value.charAt(index));
65
+ }
32
66
  /**
33
67
  * Returns `true` if `value` would be interpreted as a formula or DDE invocation
34
- * by a typical spreadsheet because of its leading character.
68
+ * by a typical spreadsheet because of its leading character — including the case where a leading
69
+ * whitespace run precedes a formula lead, which importers may trim before evaluating.
35
70
  */
36
71
  export function startsWithFormulaLead(value) {
37
72
  if (value.length === 0) {
38
73
  return false;
39
74
  }
40
- return SPREADSHEET_FORMULA_LEAD_CHARS.has(value.charAt(0));
75
+ if (SPREADSHEET_FORMULA_LEAD_CHARS.has(value.charAt(0))) {
76
+ return true;
77
+ }
78
+ return firstNonWhitespaceIsFormulaLead(value);
41
79
  }
42
80
  /**
43
81
  * Encodes a single cell value as RFC-4180 CSV with formula-injection
@@ -1 +1 @@
1
- {"version":3,"file":"xray.d.ts","sourceRoot":"","sources":["../../../src/export/adapters/xray.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,+BAA+B,EAC/B,oCAAoC,EACrC,MAAM,+BAA+B,CAAC;AAIvC,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAQ5C,CAAC;AASH,wBAAgB,WAAW,CACzB,MAAM,EAAE,+BAA+B,EACvC,UAAU,EAAE,SAAS,oCAAoC,EAAE,GAC1D,MAAM,CA2CR"}
1
+ {"version":3,"file":"xray.d.ts","sourceRoot":"","sources":["../../../src/export/adapters/xray.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,+BAA+B,EAC/B,oCAAoC,EACrC,MAAM,+BAA+B,CAAC;AAIvC,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAQ5C,CAAC;AASH,wBAAgB,WAAW,CACzB,MAAM,EAAE,+BAA+B,EACvC,UAAU,EAAE,SAAS,oCAAoC,EAAE,GAC1D,MAAM,CA+CR"}
@@ -38,7 +38,11 @@ export function adaptToXray(bundle, candidates) {
38
38
  if (candidate === undefined) {
39
39
  continue;
40
40
  }
41
- if (candidate.steps.length === 0) {
41
+ // `steps` and `expectedResults` are independent arrays with no co-length contract invariant, so
42
+ // the row count is the longer of the two — bounding the loop by `steps.length` alone would
43
+ // silently drop trailing expected results (and ALL of them when there are zero steps).
44
+ const rowCount = Math.max(candidate.steps.length, candidate.expectedResults.length);
45
+ if (rowCount === 0) {
42
46
  body += encodeSpreadsheetSafeRow([
43
47
  candidate.id,
44
48
  candidate.title,
@@ -50,7 +54,7 @@ export function adaptToXray(bundle, candidates) {
50
54
  ]);
51
55
  continue;
52
56
  }
53
- for (let i = 0; i < candidate.steps.length; i += 1) {
57
+ for (let i = 0; i < rowCount; i += 1) {
54
58
  const action = candidate.steps[i] ?? "";
55
59
  const result = candidate.expectedResults[i] ?? "";
56
60
  body += encodeSpreadsheetSafeRow([
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oscharko-dev/keiko-quality-intelligence",
3
- "version": "0.2.0-beta.4",
3
+ "version": "0.2.0-beta.5",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",