@hasna/recordings 0.1.4 → 0.1.7

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/LICENSE CHANGED
@@ -1,21 +1,170 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Hasna
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship made available under
36
+ the License, as indicated by a copyright notice that is included in
37
+ or attached to the work (an example is provided in the Appendix below).
38
+
39
+ "Derivative Works" shall mean any work, whether in Source or Object
40
+ form, that is based on (or derived from) the Work and for which the
41
+ editorial revisions, annotations, elaborations, or other modifications
42
+ represent, as a whole, an original work of authorship. For the purposes
43
+ of this License, Derivative Works shall not include works that remain
44
+ separable from, or merely link (or bind by name) to the interfaces of,
45
+ the Work and Derivative Works thereof.
46
+
47
+ "Contribution" shall mean, as submitted to the Licensor for inclusion
48
+ in the Work by the copyright owner or by an individual or Legal Entity
49
+ authorized to submit on behalf of the copyright owner. For the purposes
50
+ of this definition, "submitted" means any form of electronic, verbal,
51
+ or written communication sent to the Licensor or its representatives,
52
+ including but not limited to communication on electronic mailing lists,
53
+ source code control systems, and issue tracking systems that are managed
54
+ by, or on behalf of, the Licensor for the purpose of recording and
55
+ discussing the Work, but excluding communication that is conspicuously
56
+ marked or designated in writing by the copyright owner as "Not a
57
+ Contribution."
58
+
59
+ "Contributor" shall mean Licensor and any Legal Entity on behalf of
60
+ whom a Contribution has been received by the Licensor and included
61
+ within the Work.
62
+
63
+ 2. Grant of Copyright License. Subject to the terms and conditions of
64
+ this License, each Contributor hereby grants to You a perpetual,
65
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
66
+ copyright license to reproduce, prepare Derivative Works of,
67
+ publicly display, publicly perform, sublicense, and distribute the
68
+ Work and such Derivative Works in Source or Object form.
69
+
70
+ 3. Grant of Patent License. Subject to the terms and conditions of
71
+ this License, each Contributor hereby grants to You a perpetual,
72
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
73
+ (except as stated in this section) patent license to make, have made,
74
+ use, offer to sell, sell, import, and otherwise transfer the Work,
75
+ where such license applies only to those patent contributions
76
+ Licensors can make available under this License.
77
+
78
+ 4. Redistribution. You may reproduce and distribute copies of the
79
+ Work or Derivative Works thereof in any medium, with or without
80
+ modifications, and in Source or Object form, provided that You
81
+ meet the following conditions:
82
+
83
+ (a) You must give any other recipients of the Work or Derivative Works
84
+ a copy of this License; and
85
+
86
+ (b) You must cause any modified files to carry prominent notices
87
+ stating that You changed the files; and
88
+
89
+ (c) You must retain, in the Source form of any Derivative Works
90
+ that You distribute, all copyright, patent, trademark, and
91
+ attribution notices from the Source form of the Work,
92
+ excluding those notices that do not pertain to any part of
93
+ the Derivative Works; and
94
+
95
+ (d) If the Work includes a "NOTICE" text file as part of its
96
+ distribution, You must include a readable copy of the attribution
97
+ notices contained within such NOTICE file, in at least one
98
+ of the following places: within a NOTICE text file distributed
99
+ as part of the Derivative Works; within the Source form or
100
+ documentation, if provided along with the Derivative Works; or,
101
+ within a display generated by the Derivative Works, if and
102
+ wherever such third-party notices normally appear. The contents
103
+ of the NOTICE file are for informational purposes only and
104
+ do not modify the License. You may add Your own attribution
105
+ notices within Derivative Works that You distribute, alongside
106
+ or as an addendum to the NOTICE text from the Work, provided
107
+ that such additional attribution notices cannot be construed
108
+ as modifying the License.
109
+
110
+ You may add Your own license statement for Your modifications and
111
+ may provide additional grant of rights to use, copy, modify, merge,
112
+ publish, distribute, sublicense, and/or sell copies of the Software.
113
+
114
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
115
+ any Contribution intentionally submitted for inclusion in the Work
116
+ by You to the Licensor shall be under the terms and conditions of
117
+ this License, without any additional terms or conditions.
118
+ Notwithstanding the above, nothing herein shall supersede or modify
119
+ the terms of any separate license agreement you may have executed
120
+ with Licensor regarding such Contributions.
121
+
122
+ 6. Trademarks. This License does not grant permission to use the trade
123
+ names, trademarks, service marks, or product names of the Licensor,
124
+ except as required for reasonable and customary use in describing the
125
+ origin of the Work and reproducing the content of the NOTICE file.
126
+
127
+ 7. Disclaimer of Warranty. Unless required by applicable law or
128
+ agreed to in writing, Licensor provides the Work (and each
129
+ Contributor provides its Contributions) on an "AS IS" BASIS,
130
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
131
+ implied, including, without limitation, any warranties or conditions
132
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
133
+ PARTICULAR PURPOSE. You are solely responsible for determining the
134
+ appropriateness of using or redistributing the Work and assume any
135
+ risks associated with Your exercise of permissions under this License.
136
+
137
+ 8. Limitation of Liability. In no event and under no legal theory,
138
+ whether in tort (including negligence), contract, or otherwise,
139
+ unless required by applicable law (such as deliberate and grossly
140
+ negligent acts) or agreed to in writing, shall any Contributor be
141
+ liable to You for damages, including any direct, indirect, special,
142
+ incidental, or exemplary damages of any character arising as a
143
+ result of this License or out of the use or inability to use the
144
+ Work (including but not limited to damages for loss of goodwill,
145
+ work stoppage, computer failure or malfunction, or all other
146
+ commercial damages or losses), even if such Contributor has been
147
+ advised of the possibility of such damages.
148
+
149
+ 9. Accepting Warranty or Additional Liability. While redistributing
150
+ the Work or Derivative Works thereof, You may choose to offer,
151
+ and charge a fee for, acceptance of support, warranty, indemnity,
152
+ or other liability obligations and/or rights consistent with this
153
+ License. However, in accepting such obligations, You may offer only
154
+ conditions consistent with this License.
155
+
156
+ END OF TERMS AND CONDITIONS
157
+
158
+ Copyright 2024 hasna.com
159
+
160
+ Licensed under the Apache License, Version 2.0 (the "License");
161
+ you may not use this file except in compliance with the License.
162
+ You may obtain a copy of the License at
163
+
164
+ http://www.apache.org/licenses/LICENSE-2.0
165
+
166
+ Unless required by applicable law or agreed to in writing, software
167
+ distributed under the License is distributed on an "AS IS" BASIS,
168
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
169
+ See the License for the specific language governing permissions and
170
+ limitations under the License.
package/dist/cli/index.js CHANGED
@@ -7,7 +7,7 @@ import { Command } from "commander";
7
7
  import chalk from "chalk";
8
8
 
9
9
  // src/lib/config.ts
10
- import { existsSync, readFileSync } from "fs";
10
+ import { existsSync, readFileSync, mkdirSync, cpSync } from "fs";
11
11
  import { join } from "path";
12
12
  import { homedir } from "os";
13
13
  var DEFAULT_CONFIG = {
@@ -65,7 +65,9 @@ function loadConfig(configPath) {
65
65
  if (process.env.RECORDINGS_LANGUAGE) {
66
66
  config.language = process.env.RECORDINGS_LANGUAGE;
67
67
  }
68
- if (process.env.RECORDINGS_DB_PATH) {
68
+ if (process.env.HASNA_RECORDINGS_DB_PATH) {
69
+ config.db_path = process.env.HASNA_RECORDINGS_DB_PATH;
70
+ } else if (process.env.RECORDINGS_DB_PATH) {
69
71
  config.db_path = process.env.RECORDINGS_DB_PATH;
70
72
  }
71
73
  if (process.env.RECORDINGS_AUDIO_DIR) {
@@ -114,7 +116,16 @@ function getDataDir() {
114
116
  break;
115
117
  dir = parent;
116
118
  }
117
- return join(homedir(), ".recordings");
119
+ const home = homedir();
120
+ const newDir = join(home, ".hasna", "recordings");
121
+ const oldDir = join(home, ".recordings");
122
+ if (!existsSync(newDir) && existsSync(oldDir)) {
123
+ try {
124
+ mkdirSync(join(home, ".hasna"), { recursive: true });
125
+ cpSync(oldDir, newDir, { recursive: true });
126
+ } catch {}
127
+ }
128
+ return newDir;
118
129
  }
119
130
  function loadSecretKey(keyName) {
120
131
  const secretsPath = join(homedir(), ".secrets");
@@ -135,16 +146,16 @@ function loadSecretKey(keyName) {
135
146
  return "";
136
147
  }
137
148
  function ensureDataDir(config) {
138
- const { mkdirSync } = __require("fs");
139
- mkdirSync(config.audio_dir, { recursive: true });
149
+ const { mkdirSync: mkdirSync2 } = __require("fs");
150
+ mkdirSync2(config.audio_dir, { recursive: true });
140
151
  const dbDir = config.db_path.substring(0, config.db_path.lastIndexOf("/"));
141
152
  if (dbDir)
142
- mkdirSync(dbDir, { recursive: true });
153
+ mkdirSync2(dbDir, { recursive: true });
143
154
  }
144
155
 
145
156
  // src/db/database.ts
146
157
  import { Database } from "bun:sqlite";
147
- import { mkdirSync } from "fs";
158
+ import { mkdirSync as mkdirSync2 } from "fs";
148
159
  import { dirname } from "path";
149
160
  var _db = null;
150
161
  var MIGRATIONS = [
@@ -203,6 +214,12 @@ var MIGRATIONS = [
203
214
  CREATE INDEX IF NOT EXISTS idx_recordings_created ON recordings(created_at);
204
215
  CREATE INDEX IF NOT EXISTS idx_recordings_mode ON recordings(processing_mode);
205
216
  CREATE INDEX IF NOT EXISTS idx_recording_tags_tag ON recording_tags(tag);
217
+ `,
218
+ `
219
+ ALTER TABLE recordings ADD COLUMN goal TEXT;
220
+ ALTER TABLE recordings ADD COLUMN role TEXT;
221
+ ALTER TABLE recordings ADD COLUMN task_list_id TEXT;
222
+ INSERT OR IGNORE INTO _migrations (id) VALUES (2);
206
223
  `
207
224
  ];
208
225
  function getDatabase(dbPath) {
@@ -210,7 +227,7 @@ function getDatabase(dbPath) {
210
227
  return _db;
211
228
  const path = dbPath || loadConfig().db_path;
212
229
  const dir = dirname(path);
213
- mkdirSync(dir, { recursive: true });
230
+ mkdirSync2(dir, { recursive: true });
214
231
  _db = new Database(path, { create: true });
215
232
  _db.run("PRAGMA journal_mode = WAL");
216
233
  _db.run("PRAGMA busy_timeout = 5000");
@@ -249,6 +266,9 @@ function parseRow(row) {
249
266
  agent_id: row["agent_id"] || null,
250
267
  project_id: row["project_id"] || null,
251
268
  session_id: row["session_id"] || null,
269
+ goal: row["goal"] || null,
270
+ role: row["role"] || null,
271
+ task_list_id: row["task_list_id"] || null,
252
272
  metadata: JSON.parse(row["metadata"] || "{}"),
253
273
  created_at: row["created_at"]
254
274
  };
@@ -258,8 +278,8 @@ function createRecording(input, db) {
258
278
  const id = crypto.randomUUID();
259
279
  const tagsJson = JSON.stringify(input.tags || []);
260
280
  const metadataJson = JSON.stringify(input.metadata || {});
261
- d.query(`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, metadata)
262
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, input.audio_path || null, input.raw_text, input.processed_text || null, input.processing_mode || "raw", input.model_used || "gpt-4o-mini-transcribe", input.enhancement_model || null, input.duration_ms || 0, input.language || null, tagsJson, input.agent_id || null, input.project_id || null, input.session_id || null, metadataJson);
281
+ d.query(`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, metadata)
282
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, input.audio_path || null, input.raw_text, input.processed_text || null, input.processing_mode || "raw", input.model_used || "gpt-4o-mini-transcribe", input.enhancement_model || null, input.duration_ms || 0, input.language || null, tagsJson, input.agent_id || null, input.project_id || null, input.session_id || null, input.goal || null, input.role || null, input.task_list_id || null, metadataJson);
263
283
  if (input.tags && input.tags.length > 0) {
264
284
  const insertTag = d.query("INSERT OR IGNORE INTO recording_tags (recording_id, tag) VALUES (?, ?)");
265
285
  for (const tag of input.tags) {
@@ -925,12 +945,12 @@ program.command("projects").description("List registered projects").action(() =>
925
945
  }
926
946
  });
927
947
  program.command("init").description("Initialize .recordings/ in current directory").action(() => {
928
- const { mkdirSync: mkdirSync2, writeFileSync, existsSync: existsSync3 } = __require("fs");
948
+ const { mkdirSync: mkdirSync3, writeFileSync, existsSync: existsSync3 } = __require("fs");
929
949
  const { join: join3 } = __require("path");
930
950
  const dir = join3(process.cwd(), ".recordings");
931
951
  const audioDir = join3(dir, "audio");
932
952
  const configFile = join3(dir, "config.json");
933
- mkdirSync2(audioDir, { recursive: true });
953
+ mkdirSync3(audioDir, { recursive: true });
934
954
  if (!existsSync3(configFile)) {
935
955
  const defaultConf = {
936
956
  transcription_model: "gpt-4o-mini-transcribe",
@@ -971,19 +991,21 @@ program.command("start").description("Launch the menu bar helper app (F5 to togg
971
991
  const { homedir: getHome } = __require("os");
972
992
  const { existsSync: fileExists } = __require("fs");
973
993
  const home = getHome();
974
- const appPath = pathJoin(home, ".recordings", "RecordingsHelper.app");
975
- if (!fileExists(appPath)) {
994
+ const appPath = pathJoin(home, ".hasna", "recordings", "RecordingsHelper.app");
995
+ const oldAppPath = pathJoin(home, ".recordings", "RecordingsHelper.app");
996
+ if (!fileExists(appPath) && !fileExists(oldAppPath)) {
976
997
  console.error(chalk.red("RecordingsHelper.app not found. Run: recordings shortcut --install"));
977
998
  process.exit(1);
978
999
  }
1000
+ const resolvedAppPath = fileExists(appPath) ? appPath : oldAppPath;
979
1001
  try {
980
1002
  execSync("pkill -f RecordingsHelper", { stdio: "pipe" });
981
1003
  } catch {}
982
- execSync(`open "${appPath}"`, { stdio: "pipe" });
1004
+ execSync(`open "${resolvedAppPath}"`, { stdio: "pipe" });
983
1005
  console.log(chalk.green("Recordings helper launched \u2014 press F5 to record"));
984
1006
  if (opts.login) {
985
1007
  try {
986
- execSync(`osascript -e 'tell application "System Events" to make login item at end with properties {path:"${appPath}", hidden:true}'`, { stdio: "pipe" });
1008
+ execSync(`osascript -e 'tell application "System Events" to make login item at end with properties {path:"${resolvedAppPath}", hidden:true}'`, { stdio: "pipe" });
987
1009
  console.log(chalk.green("Added to Login Items \u2014 will start on boot"));
988
1010
  } catch {
989
1011
  console.log(chalk.yellow("Could not add to Login Items \u2014 add manually in System Settings > General > Login Items"));
@@ -1108,12 +1130,12 @@ Bye.`));
1108
1130
  });
1109
1131
  });
1110
1132
  program.command("shortcut").description("Set up a global keyboard shortcut for recording (macOS)").option("--raycast", "Generate Raycast script command").option("--install", "Set up F5 global shortcut via macOS Services (no extra installs)").option("--karabiner", "Set up Fn key via Karabiner-Elements").option("--skhd", "Generate skhd hotkey config").option("--hammerspoon", "Generate Hammerspoon config").option("--script", "Just output the shell script path").action((opts) => {
1111
- const { writeFileSync, mkdirSync: mkdirSync2, chmodSync, existsSync: fileExists } = __require("fs");
1133
+ const { writeFileSync, mkdirSync: mkdirSync3, chmodSync, existsSync: fileExists } = __require("fs");
1112
1134
  const { join: pathJoin } = __require("path");
1113
1135
  const { homedir: getHome } = __require("os");
1114
1136
  const home = getHome();
1115
- const scriptDir = pathJoin(home, ".recordings");
1116
- mkdirSync2(scriptDir, { recursive: true });
1137
+ const scriptDir = pathJoin(home, ".hasna", "recordings");
1138
+ mkdirSync3(scriptDir, { recursive: true });
1117
1139
  const scriptPath = pathJoin(scriptDir, "record-toggle.sh");
1118
1140
  const pidFile = pathJoin(scriptDir, ".recording.pid");
1119
1141
  const recordingsBin = pathJoin(home, ".bun", "bin", "recordings");
@@ -1165,16 +1187,16 @@ fi
1165
1187
  chmodSync(scriptPath, 493);
1166
1188
  if (opts.install) {
1167
1189
  const { execSync: exec } = __require("child_process");
1168
- const appPath = pathJoin(home, ".recordings", "RecordingsHelper.app");
1190
+ const appPath = pathJoin(home, ".hasna", "recordings", "RecordingsHelper.app");
1169
1191
  const srcSwift = pathJoin(__dirname, "..", "native", "RecordingsHelper.swift");
1170
1192
  const distApp = pathJoin(__dirname, "..", "RecordingsHelper.app");
1171
1193
  if (fileExists(pathJoin(distApp, "Contents", "MacOS", "RecordingsHelper"))) {
1172
1194
  exec(`rm -rf "${appPath}" && cp -R "${distApp}" "${appPath}"`, { stdio: "pipe", shell: "/bin/bash" });
1173
1195
  } else if (fileExists(srcSwift)) {
1174
1196
  console.log(chalk.blue("Compiling native helper app..."));
1175
- const appDir = pathJoin(home, ".recordings", "RecordingsHelper.app", "Contents", "MacOS");
1176
- mkdirSync2(appDir, { recursive: true });
1177
- const plistDir = pathJoin(home, ".recordings", "RecordingsHelper.app", "Contents");
1197
+ const appDir = pathJoin(home, ".hasna", "recordings", "RecordingsHelper.app", "Contents", "MacOS");
1198
+ mkdirSync3(appDir, { recursive: true });
1199
+ const plistDir = pathJoin(home, ".hasna", "recordings", "RecordingsHelper.app", "Contents");
1178
1200
  const plist = `<?xml version="1.0" encoding="UTF-8"?>
1179
1201
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
1180
1202
  <plist version="1.0"><dict>
@@ -1213,7 +1235,7 @@ Recordings helper installed and running!
1213
1235
  }
1214
1236
  if (opts.karabiner) {
1215
1237
  const karabinerDir = pathJoin(home, ".config", "karabiner", "assets", "complex_modifications");
1216
- mkdirSync2(karabinerDir, { recursive: true });
1238
+ mkdirSync3(karabinerDir, { recursive: true });
1217
1239
  const rule = {
1218
1240
  title: "Recordings \u2014 Fn key to toggle recording",
1219
1241
  rules: [
@@ -1253,7 +1275,7 @@ Recordings helper installed and running!
1253
1275
  }
1254
1276
  if (opts.raycast) {
1255
1277
  const raycastDir = pathJoin(home, ".config", "raycast", "script-commands");
1256
- mkdirSync2(raycastDir, { recursive: true });
1278
+ mkdirSync3(raycastDir, { recursive: true });
1257
1279
  const raycastScript = `#!/bin/bash
1258
1280
 
1259
1281
  # Required parameters:
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAmEtC,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAkBrD;AAuBD,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA2EtC,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAkBrD;AAuBD,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC"}
@@ -1 +1 @@
1
- {"version":3,"file":"recordings.d.ts","sourceRoot":"","sources":["../../src/db/recordings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,KAAK,EACV,SAAS,EACT,oBAAoB,EACpB,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAuB3B,wBAAgB,eAAe,CAC7B,KAAK,EAAE,oBAAoB,EAC3B,EAAE,CAAC,EAAE,QAAQ,GACZ,SAAS,CAqCX;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,MAAM,EACV,EAAE,CAAC,EAAE,QAAQ,GACZ,SAAS,GAAG,IAAI,CAgBlB;AAED,wBAAgB,cAAc,CAC5B,MAAM,CAAC,EAAE,eAAe,EACxB,EAAE,CAAC,EAAE,QAAQ,GACZ,SAAS,EAAE,CAuDb;AAED,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,EAAE,CAAC,EAAE,QAAQ,GACZ,OAAO,CAIT;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,eAAe,EACxB,EAAE,CAAC,EAAE,QAAQ,GACZ,SAAS,EAAE,CAEb;AAED,wBAAgB,iBAAiB,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CA2CA"}
1
+ {"version":3,"file":"recordings.d.ts","sourceRoot":"","sources":["../../src/db/recordings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,KAAK,EACV,SAAS,EACT,oBAAoB,EACpB,eAAe,EAChB,MAAM,mBAAmB,CAAC;AA0B3B,wBAAgB,eAAe,CAC7B,KAAK,EAAE,oBAAoB,EAC3B,EAAE,CAAC,EAAE,QAAQ,GACZ,SAAS,CAwCX;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,MAAM,EACV,EAAE,CAAC,EAAE,QAAQ,GACZ,SAAS,GAAG,IAAI,CAgBlB;AAED,wBAAgB,cAAc,CAC5B,MAAM,CAAC,EAAE,eAAe,EACxB,EAAE,CAAC,EAAE,QAAQ,GACZ,SAAS,EAAE,CAuDb;AAED,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,EAAE,CAAC,EAAE,QAAQ,GACZ,OAAO,CAIT;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,eAAe,EACxB,EAAE,CAAC,EAAE,QAAQ,GACZ,SAAS,EAAE,CAEb;AAED,wBAAgB,iBAAiB,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CA2CA"}
package/dist/index.js CHANGED
@@ -31,11 +31,11 @@ class EnhancementError extends Error {
31
31
  }
32
32
  // src/db/database.ts
33
33
  import { Database } from "bun:sqlite";
34
- import { mkdirSync } from "fs";
34
+ import { mkdirSync as mkdirSync2 } from "fs";
35
35
  import { dirname } from "path";
36
36
 
37
37
  // src/lib/config.ts
38
- import { existsSync, readFileSync } from "fs";
38
+ import { existsSync, readFileSync, mkdirSync, cpSync } from "fs";
39
39
  import { join } from "path";
40
40
  import { homedir } from "os";
41
41
  var DEFAULT_CONFIG = {
@@ -93,7 +93,9 @@ function loadConfig(configPath) {
93
93
  if (process.env.RECORDINGS_LANGUAGE) {
94
94
  config.language = process.env.RECORDINGS_LANGUAGE;
95
95
  }
96
- if (process.env.RECORDINGS_DB_PATH) {
96
+ if (process.env.HASNA_RECORDINGS_DB_PATH) {
97
+ config.db_path = process.env.HASNA_RECORDINGS_DB_PATH;
98
+ } else if (process.env.RECORDINGS_DB_PATH) {
97
99
  config.db_path = process.env.RECORDINGS_DB_PATH;
98
100
  }
99
101
  if (process.env.RECORDINGS_AUDIO_DIR) {
@@ -142,7 +144,16 @@ function getDataDir() {
142
144
  break;
143
145
  dir = parent;
144
146
  }
145
- return join(homedir(), ".recordings");
147
+ const home = homedir();
148
+ const newDir = join(home, ".hasna", "recordings");
149
+ const oldDir = join(home, ".recordings");
150
+ if (!existsSync(newDir) && existsSync(oldDir)) {
151
+ try {
152
+ mkdirSync(join(home, ".hasna"), { recursive: true });
153
+ cpSync(oldDir, newDir, { recursive: true });
154
+ } catch {}
155
+ }
156
+ return newDir;
146
157
  }
147
158
  function loadSecretKey(keyName) {
148
159
  const secretsPath = join(homedir(), ".secrets");
@@ -163,11 +174,11 @@ function loadSecretKey(keyName) {
163
174
  return "";
164
175
  }
165
176
  function ensureDataDir(config) {
166
- const { mkdirSync } = __require("fs");
167
- mkdirSync(config.audio_dir, { recursive: true });
177
+ const { mkdirSync: mkdirSync2 } = __require("fs");
178
+ mkdirSync2(config.audio_dir, { recursive: true });
168
179
  const dbDir = config.db_path.substring(0, config.db_path.lastIndexOf("/"));
169
180
  if (dbDir)
170
- mkdirSync(dbDir, { recursive: true });
181
+ mkdirSync2(dbDir, { recursive: true });
171
182
  }
172
183
 
173
184
  // src/db/database.ts
@@ -228,6 +239,12 @@ var MIGRATIONS = [
228
239
  CREATE INDEX IF NOT EXISTS idx_recordings_created ON recordings(created_at);
229
240
  CREATE INDEX IF NOT EXISTS idx_recordings_mode ON recordings(processing_mode);
230
241
  CREATE INDEX IF NOT EXISTS idx_recording_tags_tag ON recording_tags(tag);
242
+ `,
243
+ `
244
+ ALTER TABLE recordings ADD COLUMN goal TEXT;
245
+ ALTER TABLE recordings ADD COLUMN role TEXT;
246
+ ALTER TABLE recordings ADD COLUMN task_list_id TEXT;
247
+ INSERT OR IGNORE INTO _migrations (id) VALUES (2);
231
248
  `
232
249
  ];
233
250
  function getDatabase(dbPath) {
@@ -235,7 +252,7 @@ function getDatabase(dbPath) {
235
252
  return _db;
236
253
  const path = dbPath || loadConfig().db_path;
237
254
  const dir = dirname(path);
238
- mkdirSync(dir, { recursive: true });
255
+ mkdirSync2(dir, { recursive: true });
239
256
  _db = new Database(path, { create: true });
240
257
  _db.run("PRAGMA journal_mode = WAL");
241
258
  _db.run("PRAGMA busy_timeout = 5000");
@@ -288,6 +305,9 @@ function parseRow(row) {
288
305
  agent_id: row["agent_id"] || null,
289
306
  project_id: row["project_id"] || null,
290
307
  session_id: row["session_id"] || null,
308
+ goal: row["goal"] || null,
309
+ role: row["role"] || null,
310
+ task_list_id: row["task_list_id"] || null,
291
311
  metadata: JSON.parse(row["metadata"] || "{}"),
292
312
  created_at: row["created_at"]
293
313
  };
@@ -297,8 +317,8 @@ function createRecording(input, db) {
297
317
  const id = crypto.randomUUID();
298
318
  const tagsJson = JSON.stringify(input.tags || []);
299
319
  const metadataJson = JSON.stringify(input.metadata || {});
300
- d.query(`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, metadata)
301
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, input.audio_path || null, input.raw_text, input.processed_text || null, input.processing_mode || "raw", input.model_used || "gpt-4o-mini-transcribe", input.enhancement_model || null, input.duration_ms || 0, input.language || null, tagsJson, input.agent_id || null, input.project_id || null, input.session_id || null, metadataJson);
320
+ d.query(`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, metadata)
321
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, input.audio_path || null, input.raw_text, input.processed_text || null, input.processing_mode || "raw", input.model_used || "gpt-4o-mini-transcribe", input.enhancement_model || null, input.duration_ms || 0, input.language || null, tagsJson, input.agent_id || null, input.project_id || null, input.session_id || null, input.goal || null, input.role || null, input.task_list_id || null, metadataJson);
302
322
  if (input.tags && input.tags.length > 0) {
303
323
  const insertTag = d.query("INSERT OR IGNORE INTO recording_tags (recording_id, tag) VALUES (?, ?)");
304
324
  for (const tag of input.tags) {
@@ -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,gBA0B5B,CAAC;AAEF,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAmEhE;AAgBD,wBAAgB,UAAU,IAAI,MAAM,CAanC;AA0BD,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,gBA0B5B,CAAC;AAEF,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAqEhE;AAgBD,wBAAgB,UAAU,IAAI,MAAM,CA4BnC;AA0BD,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAU5D"}
package/dist/mcp/index.js CHANGED
@@ -3994,7 +3994,7 @@ var coerce = {
3994
3994
  };
3995
3995
  var NEVER = INVALID;
3996
3996
  // src/lib/config.ts
3997
- import { existsSync, readFileSync } from "fs";
3997
+ import { existsSync, readFileSync, mkdirSync, cpSync } from "fs";
3998
3998
  import { join } from "path";
3999
3999
  import { homedir } from "os";
4000
4000
  var DEFAULT_CONFIG = {
@@ -4052,7 +4052,9 @@ function loadConfig(configPath) {
4052
4052
  if (process.env.RECORDINGS_LANGUAGE) {
4053
4053
  config.language = process.env.RECORDINGS_LANGUAGE;
4054
4054
  }
4055
- if (process.env.RECORDINGS_DB_PATH) {
4055
+ if (process.env.HASNA_RECORDINGS_DB_PATH) {
4056
+ config.db_path = process.env.HASNA_RECORDINGS_DB_PATH;
4057
+ } else if (process.env.RECORDINGS_DB_PATH) {
4056
4058
  config.db_path = process.env.RECORDINGS_DB_PATH;
4057
4059
  }
4058
4060
  if (process.env.RECORDINGS_AUDIO_DIR) {
@@ -4101,7 +4103,16 @@ function getDataDir() {
4101
4103
  break;
4102
4104
  dir = parent;
4103
4105
  }
4104
- return join(homedir(), ".recordings");
4106
+ const home = homedir();
4107
+ const newDir = join(home, ".hasna", "recordings");
4108
+ const oldDir = join(home, ".recordings");
4109
+ if (!existsSync(newDir) && existsSync(oldDir)) {
4110
+ try {
4111
+ mkdirSync(join(home, ".hasna"), { recursive: true });
4112
+ cpSync(oldDir, newDir, { recursive: true });
4113
+ } catch {}
4114
+ }
4115
+ return newDir;
4105
4116
  }
4106
4117
  function loadSecretKey(keyName) {
4107
4118
  const secretsPath = join(homedir(), ".secrets");
@@ -4122,16 +4133,16 @@ function loadSecretKey(keyName) {
4122
4133
  return "";
4123
4134
  }
4124
4135
  function ensureDataDir(config) {
4125
- const { mkdirSync } = __require("fs");
4126
- mkdirSync(config.audio_dir, { recursive: true });
4136
+ const { mkdirSync: mkdirSync2 } = __require("fs");
4137
+ mkdirSync2(config.audio_dir, { recursive: true });
4127
4138
  const dbDir = config.db_path.substring(0, config.db_path.lastIndexOf("/"));
4128
4139
  if (dbDir)
4129
- mkdirSync(dbDir, { recursive: true });
4140
+ mkdirSync2(dbDir, { recursive: true });
4130
4141
  }
4131
4142
 
4132
4143
  // src/db/database.ts
4133
4144
  import { Database } from "bun:sqlite";
4134
- import { mkdirSync } from "fs";
4145
+ import { mkdirSync as mkdirSync2 } from "fs";
4135
4146
  import { dirname } from "path";
4136
4147
  var _db = null;
4137
4148
  var MIGRATIONS = [
@@ -4203,7 +4214,7 @@ function getDatabase(dbPath) {
4203
4214
  return _db;
4204
4215
  const path = dbPath || loadConfig().db_path;
4205
4216
  const dir = dirname(path);
4206
- mkdirSync(dir, { recursive: true });
4217
+ mkdirSync2(dir, { recursive: true });
4207
4218
  _db = new Database(path, { create: true });
4208
4219
  _db.run("PRAGMA journal_mode = WAL");
4209
4220
  _db.run("PRAGMA busy_timeout = 5000");
@@ -12,6 +12,9 @@ export interface Recording {
12
12
  agent_id: string | null;
13
13
  project_id: string | null;
14
14
  session_id: string | null;
15
+ goal: string | null;
16
+ role: string | null;
17
+ task_list_id: string | null;
15
18
  metadata: Record<string, unknown>;
16
19
  created_at: string;
17
20
  }
@@ -29,6 +32,9 @@ export interface CreateRecordingInput {
29
32
  agent_id?: string;
30
33
  project_id?: string;
31
34
  session_id?: string;
35
+ goal?: string;
36
+ role?: string;
37
+ task_list_id?: string;
32
38
  metadata?: Record<string, unknown>;
33
39
  }
34
40
  export interface RecordingFilter {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/recordings",
3
- "version": "0.1.4",
3
+ "version": "0.1.7",
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
  "main": "dist/index.js",
@@ -38,9 +38,9 @@
38
38
  "typescript": "^5.8.2"
39
39
  },
40
40
  "publishConfig": {
41
- "access": "restricted",
42
- "registry": "https://registry.npmjs.org/"
41
+ "registry": "https://registry.npmjs.org",
42
+ "access": "public"
43
43
  },
44
- "license": "MIT",
44
+ "license": "Apache-2.0",
45
45
  "author": "Hasna <andrei@hasna.com>"
46
46
  }
@@ -207,7 +207,7 @@ describe("getDataDir", () => {
207
207
  test("returns a string", () => {
208
208
  const dir = getDataDir();
209
209
  expect(typeof dir).toBe("string");
210
- expect(dir).toContain(".recordings");
210
+ expect(dir).toContain("recordings");
211
211
  });
212
212
  });
213
213