@hasna/recordings 0.2.7 → 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -940,14 +940,17 @@ var DEFAULT_CONFIG = {
940
940
  function loadConfig(configPath) {
941
941
  const config = { ...DEFAULT_CONFIG };
942
942
  const filePath = configPath || findConfigFile() || join2(getDataDir(), "config.json");
943
+ let fileProvidedOpenAIKey = false;
943
944
  if (existsSync2(filePath)) {
944
945
  try {
945
946
  const raw = readFileSync(filePath, "utf-8");
946
947
  const fileConfig = JSON.parse(raw);
947
- Object.assign(config, expandEnvBackedConfig(fileConfig));
948
+ const expanded = expandEnvBackedConfig(fileConfig);
949
+ Object.assign(config, expanded);
950
+ fileProvidedOpenAIKey = typeof expanded.openai_api_key === "string" && expanded.openai_api_key.length > 0;
948
951
  } catch {}
949
952
  }
950
- if (process.env.OPENAI_API_KEY) {
953
+ if (process.env.OPENAI_API_KEY && !fileProvidedOpenAIKey) {
951
954
  config.openai_api_key = process.env.OPENAI_API_KEY;
952
955
  }
953
956
  if (process.env.RECORDINGS_API_KEY) {
@@ -1515,7 +1518,7 @@ function setAgentFocus(idOrName, projectId, db) {
1515
1518
  }
1516
1519
 
1517
1520
  // src/version.ts
1518
- var VERSION = "0.2.7";
1521
+ var VERSION = "0.2.9";
1519
1522
 
1520
1523
  // src/db/feedback.ts
1521
1524
  function saveFeedback(input) {
@@ -12,4 +12,13 @@ export declare class ProjectNotFoundError extends Error {
12
12
  readonly ref: string;
13
13
  constructor(ref: string);
14
14
  }
15
+ /**
16
+ * Thrown for invalid client input (missing/blank required fields). Its message
17
+ * is safe to surface to the caller as a clean 400. This is distinct from an
18
+ * unexpected internal/DB error, whose raw text (e.g. a Postgres constraint name)
19
+ * must NEVER be returned to the client.
20
+ */
21
+ export declare class ValidationError extends Error {
22
+ constructor(message: string);
23
+ }
15
24
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/db/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;gBACT,GAAG,EAAE,MAAM;CAKxB"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/db/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;gBACT,GAAG,EAAE,MAAM;CAKxB;AAED;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B"}
package/dist/index.js CHANGED
@@ -232,14 +232,17 @@ var DEFAULT_CONFIG = {
232
232
  function loadConfig(configPath) {
233
233
  const config = { ...DEFAULT_CONFIG };
234
234
  const filePath = configPath || findConfigFile() || join(getDataDir(), "config.json");
235
+ let fileProvidedOpenAIKey = false;
235
236
  if (existsSync(filePath)) {
236
237
  try {
237
238
  const raw = readFileSync(filePath, "utf-8");
238
239
  const fileConfig = JSON.parse(raw);
239
- Object.assign(config, expandEnvBackedConfig(fileConfig));
240
+ const expanded = expandEnvBackedConfig(fileConfig);
241
+ Object.assign(config, expanded);
242
+ fileProvidedOpenAIKey = typeof expanded.openai_api_key === "string" && expanded.openai_api_key.length > 0;
240
243
  } catch {}
241
244
  }
242
- if (process.env.OPENAI_API_KEY) {
245
+ if (process.env.OPENAI_API_KEY && !fileProvidedOpenAIKey) {
243
246
  config.openai_api_key = process.env.OPENAI_API_KEY;
244
247
  }
245
248
  if (process.env.RECORDINGS_API_KEY) {
@@ -774,7 +777,7 @@ function setAgentFocus(idOrName, projectId, db) {
774
777
  }
775
778
 
776
779
  // src/version.ts
777
- var VERSION = "0.2.7";
780
+ var VERSION = "0.2.9";
778
781
 
779
782
  // src/db/feedback.ts
780
783
  function saveFeedback(input) {
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,eAAO,MAAM,cAAc,EAAE,gBA2B5B,CAAC;AAEF,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAqEhE;AAmBD,wBAAgB,UAAU,IAAI,MAAM,CAoBnC;AAwFD,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAU5D"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,eAAO,MAAM,cAAc,EAAE,gBA2B5B,CAAC;AAEF,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAmFhE;AAmBD,wBAAgB,UAAU,IAAI,MAAM,CAoBnC;AAwFD,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAU5D"}
package/dist/mcp/index.js CHANGED
@@ -4073,14 +4073,17 @@ var DEFAULT_CONFIG = {
4073
4073
  function loadConfig(configPath) {
4074
4074
  const config = { ...DEFAULT_CONFIG };
4075
4075
  const filePath = configPath || findConfigFile() || join(getDataDir(), "config.json");
4076
+ let fileProvidedOpenAIKey = false;
4076
4077
  if (existsSync(filePath)) {
4077
4078
  try {
4078
4079
  const raw = readFileSync(filePath, "utf-8");
4079
4080
  const fileConfig = JSON.parse(raw);
4080
- Object.assign(config, expandEnvBackedConfig(fileConfig));
4081
+ const expanded = expandEnvBackedConfig(fileConfig);
4082
+ Object.assign(config, expanded);
4083
+ fileProvidedOpenAIKey = typeof expanded.openai_api_key === "string" && expanded.openai_api_key.length > 0;
4081
4084
  } catch {}
4082
4085
  }
4083
- if (process.env.OPENAI_API_KEY) {
4086
+ if (process.env.OPENAI_API_KEY && !fileProvidedOpenAIKey) {
4084
4087
  config.openai_api_key = process.env.OPENAI_API_KEY;
4085
4088
  }
4086
4089
  if (process.env.RECORDINGS_API_KEY) {
@@ -4648,7 +4651,7 @@ function setAgentFocus(idOrName, projectId, db) {
4648
4651
  }
4649
4652
 
4650
4653
  // src/version.ts
4651
- var VERSION = "0.2.7";
4654
+ var VERSION = "0.2.9";
4652
4655
 
4653
4656
  // src/db/feedback.ts
4654
4657
  function saveFeedback(input) {
@@ -18,7 +18,7 @@ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
18
18
  var __require = import.meta.require;
19
19
 
20
20
  // src/version.ts
21
- var VERSION = "0.2.7";
21
+ var VERSION = "0.2.9";
22
22
 
23
23
  // src/db/remote-storage.ts
24
24
  import pg from "pg";
@@ -262,7 +262,7 @@ var init_cloud = __esm(() => {
262
262
  });
263
263
 
264
264
  // src/db/errors.ts
265
- var ProjectNotFoundError;
265
+ var ProjectNotFoundError, ValidationError;
266
266
  var init_errors = __esm(() => {
267
267
  ProjectNotFoundError = class ProjectNotFoundError extends Error {
268
268
  ref;
@@ -272,6 +272,12 @@ var init_errors = __esm(() => {
272
272
  this.ref = ref;
273
273
  }
274
274
  };
275
+ ValidationError = class ValidationError extends Error {
276
+ constructor(message) {
277
+ super(message);
278
+ this.name = "ValidationError";
279
+ }
280
+ };
275
281
  });
276
282
 
277
283
  // src/server/repo.ts
@@ -335,7 +341,7 @@ function parseProject(row) {
335
341
  }
336
342
  async function createRecording(pg2, input) {
337
343
  if (typeof input.raw_text !== "string" || !input.raw_text) {
338
- throw new Error("raw_text is required");
344
+ throw new ValidationError("raw_text is required");
339
345
  }
340
346
  const id = shortUuid();
341
347
  await pg2.run(`INSERT INTO recordings (id, audio_path, raw_text, processed_text, processing_mode, model_used, enhancement_model, duration_ms, language, tags, agent_id, project_id, session_id, goal, role, task_list_id, machine_id, metadata)
@@ -423,7 +429,7 @@ async function getRecordingStats(pg2) {
423
429
  }
424
430
  async function registerAgent(pg2, name, description, role) {
425
431
  if (!name)
426
- throw new Error("name is required");
432
+ throw new ValidationError("name is required");
427
433
  const now = new Date().toISOString();
428
434
  const existing = await pg2.get("SELECT * FROM agents WHERE name = ?", name);
429
435
  if (existing) {
@@ -471,7 +477,7 @@ async function setAgentFocus(pg2, idOrName, projectId) {
471
477
  }
472
478
  async function registerProject(pg2, name, path, description) {
473
479
  if (!name || !path)
474
- throw new Error("name and path are required");
480
+ throw new ValidationError("name and path are required");
475
481
  const now = new Date().toISOString();
476
482
  const existing = await pg2.get("SELECT * FROM projects WHERE path = ?", path);
477
483
  if (existing) {
@@ -501,7 +507,7 @@ async function listProjects(pg2) {
501
507
  }
502
508
  async function saveFeedback(pg2, input) {
503
509
  if (typeof input.message !== "string" || !input.message.trim()) {
504
- throw new Error("message is required");
510
+ throw new ValidationError("message is required");
505
511
  }
506
512
  await pg2.run("INSERT INTO feedback (message, email, category, version) VALUES (?, ?, ?, ?)", input.message, input.email || null, input.category || "general", input.version || null);
507
513
  return { saved: true };
@@ -679,7 +685,11 @@ async function handleV1Request(req, url) {
679
685
  }
680
686
  return error(404, `unknown /v1 resource: ${resource ?? ""}`);
681
687
  } catch (e) {
682
- return error(500, e.message);
688
+ if (e instanceof ProjectNotFoundError || e instanceof ValidationError) {
689
+ return error(400, e.message);
690
+ }
691
+ console.error(`[recordings-serve] unhandled ${method} ${path} error:`, e);
692
+ return error(500, "internal server error");
683
693
  }
684
694
  }
685
695
  var JSON_HEADERS;
@@ -5072,14 +5082,17 @@ import { homedir } from "os";
5072
5082
  function loadConfig(configPath) {
5073
5083
  const config = { ...DEFAULT_CONFIG };
5074
5084
  const filePath = configPath || findConfigFile() || join(getDataDir(), "config.json");
5085
+ let fileProvidedOpenAIKey = false;
5075
5086
  if (existsSync(filePath)) {
5076
5087
  try {
5077
5088
  const raw = readFileSync(filePath, "utf-8");
5078
5089
  const fileConfig = JSON.parse(raw);
5079
- Object.assign(config, expandEnvBackedConfig(fileConfig));
5090
+ const expanded = expandEnvBackedConfig(fileConfig);
5091
+ Object.assign(config, expanded);
5092
+ fileProvidedOpenAIKey = typeof expanded.openai_api_key === "string" && expanded.openai_api_key.length > 0;
5080
5093
  } catch {}
5081
5094
  }
5082
- if (process.env.OPENAI_API_KEY) {
5095
+ if (process.env.OPENAI_API_KEY && !fileProvidedOpenAIKey) {
5083
5096
  config.openai_api_key = process.env.OPENAI_API_KEY;
5084
5097
  }
5085
5098
  if (process.env.RECORDINGS_API_KEY) {
@@ -12,9 +12,9 @@
12
12
  * stubs — every operation executes real SQL.
13
13
  */
14
14
  import type { PgAdapterAsync } from "../db/remote-storage.js";
15
- import { ProjectNotFoundError } from "../db/errors.js";
15
+ import { ProjectNotFoundError, ValidationError } from "../db/errors.js";
16
16
  import type { Recording, CreateRecordingInput, RecordingFilter, Agent, Project } from "../types/index.js";
17
- export { ProjectNotFoundError };
17
+ export { ProjectNotFoundError, ValidationError };
18
18
  export declare function createRecording(pg: PgAdapterAsync, input: CreateRecordingInput): Promise<Recording>;
19
19
  export declare function getRecording(pg: PgAdapterAsync, id: string): Promise<Recording | null>;
20
20
  export declare function listRecordings(pg: PgAdapterAsync, filter?: RecordingFilter): Promise<Recording[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../src/server/repo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../src/server/repo.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"v1.d.ts","sourceRoot":"","sources":["../../src/server/v1.ts"],"names":[],"mappings":"AAkCA;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA6KtF"}
1
+ {"version":3,"file":"v1.d.ts","sourceRoot":"","sources":["../../src/server/v1.ts"],"names":[],"mappings":"AAkCA;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAsLtF"}
package/dist/storage.js CHANGED
@@ -71,14 +71,17 @@ var DEFAULT_CONFIG = {
71
71
  function loadConfig(configPath) {
72
72
  const config = { ...DEFAULT_CONFIG };
73
73
  const filePath = configPath || findConfigFile() || join(getDataDir(), "config.json");
74
+ let fileProvidedOpenAIKey = false;
74
75
  if (existsSync(filePath)) {
75
76
  try {
76
77
  const raw = readFileSync(filePath, "utf-8");
77
78
  const fileConfig = JSON.parse(raw);
78
- Object.assign(config, expandEnvBackedConfig(fileConfig));
79
+ const expanded = expandEnvBackedConfig(fileConfig);
80
+ Object.assign(config, expanded);
81
+ fileProvidedOpenAIKey = typeof expanded.openai_api_key === "string" && expanded.openai_api_key.length > 0;
79
82
  } catch {}
80
83
  }
81
- if (process.env.OPENAI_API_KEY) {
84
+ if (process.env.OPENAI_API_KEY && !fileProvidedOpenAIKey) {
82
85
  config.openai_api_key = process.env.OPENAI_API_KEY;
83
86
  }
84
87
  if (process.env.RECORDINGS_API_KEY) {
@@ -613,7 +616,7 @@ function setAgentFocus(idOrName, projectId, db) {
613
616
  }
614
617
 
615
618
  // src/version.ts
616
- var VERSION = "0.2.7";
619
+ var VERSION = "0.2.9";
617
620
 
618
621
  // src/db/feedback.ts
619
622
  function saveFeedback(input) {
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.2.7";
1
+ export declare const VERSION = "0.2.9";
2
2
  //# sourceMappingURL=version.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/recordings",
3
- "version": "0.2.7",
3
+ "version": "0.2.9",
4
4
  "type": "module",
5
5
  "description": "Speech-to-text recording tool with MCP and CLI — records, transcribes, and optionally enhances text using AI",
6
6
  "repository": {