@phenx-inc/ctlsurf 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/out/headless/index.mjs +169 -10
  2. package/out/headless/index.mjs.map +2 -2
  3. package/out/main/index.js +175 -9
  4. package/out/preload/index.js +10 -0
  5. package/out/renderer/assets/{cssMode-eTXVdAkZ.js → cssMode-BdYp0fp9.js} +3 -3
  6. package/out/renderer/assets/{freemarker2-B5BKaiK4.js → freemarker2-Cya-9zr-.js} +1 -1
  7. package/out/renderer/assets/{handlebars-BIdLd2wU.js → handlebars-EJs9W5Ub.js} +1 -1
  8. package/out/renderer/assets/{html-BXL4cnLS.js → html-Ex4qy2lh.js} +1 -1
  9. package/out/renderer/assets/{htmlMode-46N3XG2c.js → htmlMode-CCm0aJ6C.js} +3 -3
  10. package/out/renderer/assets/{index-dRvutfbl.js → index-Cj7K9-Ba.js} +823 -137
  11. package/out/renderer/assets/{index-Cf-RsxoC.css → index-nvsNYP5c.css} +229 -0
  12. package/out/renderer/assets/{javascript-n_iZZzDX.js → javascript-B2niCouI.js} +2 -2
  13. package/out/renderer/assets/{jsonMode-DXDczSNu.js → jsonMode-BgCUHaFo.js} +3 -3
  14. package/out/renderer/assets/{liquid-B1QweUh7.js → liquid-DOQmSo4G.js} +1 -1
  15. package/out/renderer/assets/{lspLanguageFeatures-DqzMqkRk.js → lspLanguageFeatures-8SIcRAMh.js} +1 -1
  16. package/out/renderer/assets/{mdx-BCv8lm5e.js → mdx-DuKdGNKE.js} +1 -1
  17. package/out/renderer/assets/{python-BLNzYwDv.js → python-BUa4XFG-.js} +1 -1
  18. package/out/renderer/assets/{razor-CvAww8bG.js → razor-BUw8jho0.js} +1 -1
  19. package/out/renderer/assets/{transformers.web-DtSCnG36.js → transformers.web-_PuZoIho.js} +824 -19
  20. package/out/renderer/assets/{tsMode-C7m6Kr5E.js → tsMode-8FLRnobw.js} +1 -1
  21. package/out/renderer/assets/{typescript-DhPw4VVg.js → typescript-rdwAjCi4.js} +1 -1
  22. package/out/renderer/assets/{xml-B0WLFJ2U.js → xml-HOzT59Qg.js} +1 -1
  23. package/out/renderer/assets/{yaml-BWyn9Wd7.js → yaml-B81JfLsW.js} +1 -1
  24. package/out/renderer/index.html +64 -2
  25. package/out/repro-toggle.mjs +305 -0
  26. package/package.json +1 -1
  27. package/src/main/index.ts +9 -0
  28. package/src/main/orchestrator.ts +51 -10
  29. package/src/main/transcripts.ts +134 -0
  30. package/src/preload/index.ts +14 -0
  31. package/src/renderer/App.tsx +30 -11
  32. package/src/renderer/components/FloatingMic.tsx +48 -0
  33. package/src/renderer/components/SpeakControls.tsx +235 -0
  34. package/src/renderer/components/VoiceInput.tsx +183 -140
  35. package/src/renderer/index.html +62 -0
  36. package/src/renderer/lib/localWhisper.ts +94 -6
  37. package/src/renderer/lib/speech.ts +317 -0
  38. package/src/renderer/styles.css +229 -0
@@ -8087,6 +8087,40 @@ html, body, #root {
8087
8087
  }
8088
8088
  .floating-mic-hide:hover { color: #f7768e; }
8089
8089
 
8090
+ /* Smaller sibling of the round mic: read the last agent reply aloud. */
8091
+ .floating-mic-read {
8092
+ width: 30px;
8093
+ height: 30px;
8094
+ border-radius: 50%;
8095
+ display: inline-flex;
8096
+ align-items: center;
8097
+ justify-content: center;
8098
+ background: #2a2b3d;
8099
+ border: 1px solid #3b3d57;
8100
+ color: #a9b1d6;
8101
+ cursor: pointer;
8102
+ transition: all 0.15s;
8103
+ }
8104
+ .floating-mic-read:hover { border-color: #565f89; color: #c0caf5; }
8105
+ .floating-mic-read.speaking {
8106
+ color: #7aa2f7;
8107
+ border-color: #7aa2f7;
8108
+ }
8109
+ .floating-mic-note {
8110
+ position: absolute;
8111
+ bottom: -22px;
8112
+ left: 50%;
8113
+ transform: translateX(-50%);
8114
+ white-space: nowrap;
8115
+ font-size: 11px;
8116
+ color: #565f89;
8117
+ background: #16161e;
8118
+ border: 1px solid #3b3d57;
8119
+ border-radius: 6px;
8120
+ padding: 2px 6px;
8121
+ pointer-events: none;
8122
+ }
8123
+
8090
8124
  .voice-btn-floating {
8091
8125
  width: 48px;
8092
8126
  height: 48px;
@@ -8119,6 +8153,201 @@ html, body, #root {
8119
8153
  margin-bottom: 8px;
8120
8154
  }
8121
8155
 
8156
+ /* Mic source picker (small caret badge on the round mic + dropdown) */
8157
+ .voice-source-btn {
8158
+ position: absolute;
8159
+ bottom: -3px;
8160
+ right: -3px;
8161
+ width: 18px;
8162
+ height: 18px;
8163
+ border-radius: 50%;
8164
+ display: inline-flex;
8165
+ align-items: center;
8166
+ justify-content: center;
8167
+ padding: 0;
8168
+ font-size: 10px;
8169
+ line-height: 1;
8170
+ background: #2a2b3d;
8171
+ border: 1px solid #3b3d57;
8172
+ color: #a9b1d6;
8173
+ cursor: pointer;
8174
+ z-index: 60;
8175
+ }
8176
+ .voice-source-btn:hover {
8177
+ border-color: #7aa2f7;
8178
+ color: #c0caf5;
8179
+ }
8180
+ .voice-source-menu {
8181
+ position: absolute;
8182
+ bottom: 100%;
8183
+ right: 0;
8184
+ margin-bottom: 10px;
8185
+ min-width: 200px;
8186
+ max-width: 280px;
8187
+ padding: 4px;
8188
+ background: #16161e;
8189
+ border: 1px solid #3b3d57;
8190
+ border-radius: 8px;
8191
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.5);
8192
+ z-index: 300;
8193
+ }
8194
+ .voice-source-head {
8195
+ font-size: 10px;
8196
+ text-transform: uppercase;
8197
+ letter-spacing: 0.04em;
8198
+ color: #565f89;
8199
+ padding: 4px 8px 6px;
8200
+ }
8201
+ .voice-source-item {
8202
+ display: flex;
8203
+ align-items: center;
8204
+ gap: 6px;
8205
+ width: 100%;
8206
+ padding: 5px 8px;
8207
+ border: none;
8208
+ border-radius: 5px;
8209
+ background: transparent;
8210
+ color: #a9b1d6;
8211
+ font-size: 12px;
8212
+ text-align: left;
8213
+ cursor: pointer;
8214
+ }
8215
+ .voice-source-item:hover { background: #1f2335; }
8216
+ .voice-source-item.active { color: #7aa2f7; }
8217
+ .voice-source-check {
8218
+ flex: 0 0 12px;
8219
+ width: 12px;
8220
+ color: #7aa2f7;
8221
+ font-size: 11px;
8222
+ }
8223
+ .voice-source-label {
8224
+ overflow: hidden;
8225
+ text-overflow: ellipsis;
8226
+ white-space: nowrap;
8227
+ }
8228
+ .voice-source-empty {
8229
+ padding: 6px 8px;
8230
+ font-size: 11px;
8231
+ color: #565f89;
8232
+ }
8233
+
8234
+ /* Spoken-replies titlebar control */
8235
+ .speak-controls {
8236
+ position: relative;
8237
+ display: inline-flex;
8238
+ align-items: center;
8239
+ }
8240
+ .speak-btn.active {
8241
+ color: #7aa2f7;
8242
+ border-color: #7aa2f7;
8243
+ }
8244
+ .speak-pct {
8245
+ font-size: 9px;
8246
+ margin-left: 3px;
8247
+ color: #e0af68;
8248
+ }
8249
+ .speak-caret {
8250
+ padding: 0 3px;
8251
+ font-size: 10px;
8252
+ min-width: 0;
8253
+ }
8254
+ .speak-stop {
8255
+ color: #f7768e;
8256
+ border-color: #f7768e;
8257
+ }
8258
+ .speak-stop:hover { background: #2d2030; }
8259
+ .speak-error {
8260
+ position: absolute;
8261
+ top: 100%;
8262
+ right: 0;
8263
+ margin-top: 6px;
8264
+ max-width: 340px;
8265
+ padding: 4px 9px;
8266
+ border-radius: 5px;
8267
+ font-size: 11px;
8268
+ line-height: 1.3;
8269
+ white-space: normal;
8270
+ word-break: break-word;
8271
+ background: #2d2030;
8272
+ color: #f7768e;
8273
+ border: 1px solid #f7768e;
8274
+ z-index: 60;
8275
+ }
8276
+ .speak-menu {
8277
+ position: absolute;
8278
+ top: 100%;
8279
+ right: 0;
8280
+ margin-top: 6px;
8281
+ min-width: 220px;
8282
+ max-width: 280px;
8283
+ padding: 6px;
8284
+ background: #16161e;
8285
+ border: 1px solid #3b3d57;
8286
+ border-radius: 8px;
8287
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.5);
8288
+ z-index: 300;
8289
+ }
8290
+ .speak-menu-head {
8291
+ font-size: 10px;
8292
+ text-transform: uppercase;
8293
+ letter-spacing: 0.04em;
8294
+ color: #565f89;
8295
+ padding: 6px 6px 4px;
8296
+ }
8297
+ .speak-menu-item {
8298
+ display: flex;
8299
+ align-items: center;
8300
+ gap: 6px;
8301
+ width: 100%;
8302
+ padding: 5px 6px;
8303
+ border: none;
8304
+ border-radius: 5px;
8305
+ background: transparent;
8306
+ color: #a9b1d6;
8307
+ font-size: 12px;
8308
+ text-align: left;
8309
+ cursor: pointer;
8310
+ }
8311
+ .speak-menu-item:hover { background: #1f2335; }
8312
+ .speak-menu-item.active { color: #7aa2f7; }
8313
+ .speak-menu-check {
8314
+ flex: 0 0 12px;
8315
+ width: 12px;
8316
+ color: #7aa2f7;
8317
+ font-size: 11px;
8318
+ }
8319
+ .speak-select {
8320
+ width: 100%;
8321
+ margin: 2px 0 4px;
8322
+ padding: 4px 6px;
8323
+ background: #1f2335;
8324
+ color: #a9b1d6;
8325
+ border: 1px solid #3b3d57;
8326
+ border-radius: 5px;
8327
+ font-size: 12px;
8328
+ }
8329
+ .speak-rate {
8330
+ width: 100%;
8331
+ margin: 2px 0 6px;
8332
+ accent-color: #7aa2f7;
8333
+ }
8334
+ .speak-menu-row {
8335
+ display: flex;
8336
+ gap: 6px;
8337
+ padding: 2px 0 0;
8338
+ }
8339
+ .speak-menu-btn {
8340
+ flex: 1;
8341
+ padding: 5px 6px;
8342
+ background: #2a2b3d;
8343
+ color: #a9b1d6;
8344
+ border: 1px solid #3b3d57;
8345
+ border-radius: 5px;
8346
+ font-size: 12px;
8347
+ cursor: pointer;
8348
+ }
8349
+ .speak-menu-btn:hover { border-color: #7aa2f7; color: #c0caf5; }
8350
+
8122
8351
  /* Editor panel */
8123
8352
  .editor-panel {
8124
8353
  display: flex;
@@ -1,5 +1,5 @@
1
- import { conf as conf$1, language as language$1 } from "./typescript-DhPw4VVg.js";
2
- import "./index-dRvutfbl.js";
1
+ import { conf as conf$1, language as language$1 } from "./typescript-rdwAjCi4.js";
2
+ import "./index-Cj7K9-Ba.js";
3
3
  const conf = conf$1;
4
4
  const language = {
5
5
  // Set defaultToken to invalid to see what you do not tokenize yet
@@ -1,6 +1,6 @@
1
- import { c as createWebWorker, l as languages, e as editor } from "./index-dRvutfbl.js";
2
- import { f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider, C as CompletionAdapter, H as HoverAdapter, b as DocumentSymbolAdapter, d as DocumentColorAdapter, F as FoldingRangeAdapter, S as SelectionRangeAdapter, e as DiagnosticsAdapter } from "./lspLanguageFeatures-DqzMqkRk.js";
3
- import { a, D, h, R, c, i, j, t, k } from "./lspLanguageFeatures-DqzMqkRk.js";
1
+ import { c as createWebWorker, l as languages, e as editor } from "./index-Cj7K9-Ba.js";
2
+ import { f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider, C as CompletionAdapter, H as HoverAdapter, b as DocumentSymbolAdapter, d as DocumentColorAdapter, F as FoldingRangeAdapter, S as SelectionRangeAdapter, e as DiagnosticsAdapter } from "./lspLanguageFeatures-8SIcRAMh.js";
3
+ import { a, D, h, R, c, i, j, t, k } from "./lspLanguageFeatures-8SIcRAMh.js";
4
4
  const STOP_WHEN_IDLE_FOR = 2 * 60 * 1e3;
5
5
  class WorkerManager {
6
6
  constructor(defaults) {
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-dRvutfbl.js";
1
+ import { l as languages } from "./index-Cj7K9-Ba.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "area",
4
4
  "base",
@@ -1,4 +1,4 @@
1
- import { R as Range$1, l as languages, e as editor, U as Uri, M as MarkerSeverity } from "./index-dRvutfbl.js";
1
+ import { R as Range$1, l as languages, e as editor, U as Uri, M as MarkerSeverity } from "./index-Cj7K9-Ba.js";
2
2
  var DocumentUri;
3
3
  (function(DocumentUri2) {
4
4
  function is(value) {
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-dRvutfbl.js";
1
+ import { l as languages } from "./index-Cj7K9-Ba.js";
2
2
  const conf = {
3
3
  comments: {
4
4
  blockComment: ["{/*", "*/}"]
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-dRvutfbl.js";
1
+ import { l as languages } from "./index-Cj7K9-Ba.js";
2
2
  const conf = {
3
3
  comments: {
4
4
  lineComment: "#",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-dRvutfbl.js";
1
+ import { l as languages } from "./index-Cj7K9-Ba.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "area",
4
4
  "base",