opencode-termux-notify 0.1.1-dev.0 → 0.1.1-dev.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.
package/dist/audio.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  import type { ResolvedOpts } from "./types.js";
2
+ export declare function getAccessibleDir(): string;
3
+ export declare function ensureAccessibleAudio(source: string, file: string): Promise<string>;
2
4
  export declare function resolveAudioPath(file: string): string;
3
5
  export declare function playAudio(soundName: string, opts: ResolvedOpts): Promise<void>;
4
6
  //# sourceMappingURL=audio.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBrD;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBpF"}
1
+ {"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAK9C,wBAAgB,gBAAgB,IAAI,MAAM,CASzC;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBzF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBrD;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBpF"}
package/dist/audio.js CHANGED
@@ -1,8 +1,42 @@
1
1
  import { existsSync } from "node:fs";
2
+ import { copyFile, mkdir, chmod } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
2
4
  import { spawn } from "node:child_process";
3
5
  import { join, dirname } from "node:path";
4
6
  import { fileURLToPath } from "node:url";
5
7
  import { SOUND_FILES } from "./constants.js";
8
+ const TERMUX_USR_TMP = "/data/data/com.termux/files/usr/tmp";
9
+ const TERMUX_FILES_PREFIX = "/data/data/com.termux/files/";
10
+ export function getAccessibleDir() {
11
+ const envTmp = process.env.TMPDIR;
12
+ if (envTmp && envTmp.startsWith(TERMUX_FILES_PREFIX) && existsSync(envTmp)) {
13
+ return join(envTmp, "termux-notify-audio");
14
+ }
15
+ if (existsSync(TERMUX_USR_TMP)) {
16
+ return join(TERMUX_USR_TMP, "termux-notify-audio");
17
+ }
18
+ return join(tmpdir(), "termux-notify-audio");
19
+ }
20
+ export async function ensureAccessibleAudio(source, file) {
21
+ if (source.startsWith(TERMUX_FILES_PREFIX))
22
+ return source;
23
+ const dir = getAccessibleDir();
24
+ try {
25
+ await mkdir(dir, { recursive: true });
26
+ const dest = join(dir, file);
27
+ if (!existsSync(dest)) {
28
+ await copyFile(source, dest);
29
+ try {
30
+ await chmod(dest, 0o644);
31
+ }
32
+ catch { }
33
+ }
34
+ return dest;
35
+ }
36
+ catch {
37
+ return source;
38
+ }
39
+ }
6
40
  export function resolveAudioPath(file) {
7
41
  try {
8
42
  const here = dirname(fileURLToPath(import.meta.url));
@@ -29,11 +63,12 @@ export async function playAudio(soundName, opts) {
29
63
  const file = SOUND_FILES[soundName];
30
64
  if (!file)
31
65
  return;
32
- const path = resolveAudioPath(file);
33
- if (!existsSync(path)) {
34
- console.warn(`[termux-notify] audio file not found: ${path} for ${soundName}`);
66
+ const source = resolveAudioPath(file);
67
+ if (!existsSync(source)) {
68
+ console.warn(`[termux-notify] audio file not found: ${source} for ${soundName}`);
35
69
  return;
36
70
  }
71
+ const path = await ensureAccessibleAudio(source, file);
37
72
  const bin = existsSync(opts.mediaBin) ? opts.mediaBin : "termux-media-player";
38
73
  await new Promise((resolve) => {
39
74
  const p = spawn(bin, ["play", path], { stdio: "ignore" });
package/dist/audio.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"audio.js","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAG5C,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QACpD,MAAM,UAAU,GAAG;YACjB,IAAI,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,CAAC;YACnC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC;YAChC,IAAI,CAAC,IAAI,EAAE,oBAAoB,EAAE,IAAI,CAAC;YACtC,IAAI,CAAC,IAAI,EAAE,qBAAqB,EAAE,IAAI,CAAC;YACvC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC;YACzC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,kBAAkB,EAAE,IAAI,CAAC;SAC9C,CAAA;QACD,KAAK,MAAM,CAAC,IAAI,UAAU;YAAE,IAAI,UAAU,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,CAAA;QACvD,OAAO,UAAU,CAAC,CAAC,CAAE,CAAA;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,SAAiB,EAAE,IAAkB;IACnE,IAAI,CAAC,IAAI,CAAC,SAAS;QAAE,OAAM;IAC3B,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC,CAAA;IACnC,IAAI,CAAC,IAAI;QAAE,OAAM;IACjB,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;IACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,yCAAyC,IAAI,QAAQ,SAAS,EAAE,CAAC,CAAA;QAC9E,OAAM;IACR,CAAC;IACD,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAA;IAC7E,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QACzD,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACpB,OAAO,CAAC,KAAK,CAAC,yCAAyC,SAAS,GAAG,EAAG,GAAa,CAAC,OAAO,CAAC,CAAA;YAC5F,OAAO,EAAE,CAAA;QACX,CAAC,CAAC,CAAA;QACF,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;QAC9B,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC;gBACH,CAAC;gBAAC,CAAS,CAAC,KAAK,EAAE,EAAE,CAAA;YACvB,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YACV,OAAO,EAAE,CAAA;QACX,CAAC,EAAE,IAAI,CAAC,CAAA;IACV,CAAC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"audio.js","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "opencode-termux-notify",
4
- "version": "0.1.1-dev.0",
4
+ "version": "0.1.1-dev.1",
5
5
  "description": "Termux-native notifications for OpenCode — 6 attention sounds (default/question/permission/error/done/subagent_done) via termux-notification + termux-media-player, with cross-instance deduplication.",
6
6
  "type": "module",
7
7
  "keywords": [
package/src/audio.ts CHANGED
@@ -1,10 +1,44 @@
1
1
  import { existsSync } from "node:fs"
2
+ import { copyFile, mkdir, chmod } from "node:fs/promises"
3
+ import { tmpdir } from "node:os"
2
4
  import { spawn } from "node:child_process"
3
5
  import { join, dirname } from "node:path"
4
6
  import { fileURLToPath } from "node:url"
5
7
  import { SOUND_FILES } from "./constants.js"
6
8
  import type { ResolvedOpts } from "./types.js"
7
9
 
10
+ const TERMUX_USR_TMP = "/data/data/com.termux/files/usr/tmp"
11
+ const TERMUX_FILES_PREFIX = "/data/data/com.termux/files/"
12
+
13
+ export function getAccessibleDir(): string {
14
+ const envTmp = process.env.TMPDIR
15
+ if (envTmp && envTmp.startsWith(TERMUX_FILES_PREFIX) && existsSync(envTmp)) {
16
+ return join(envTmp, "termux-notify-audio")
17
+ }
18
+ if (existsSync(TERMUX_USR_TMP)) {
19
+ return join(TERMUX_USR_TMP, "termux-notify-audio")
20
+ }
21
+ return join(tmpdir(), "termux-notify-audio")
22
+ }
23
+
24
+ export async function ensureAccessibleAudio(source: string, file: string): Promise<string> {
25
+ if (source.startsWith(TERMUX_FILES_PREFIX)) return source
26
+ const dir = getAccessibleDir()
27
+ try {
28
+ await mkdir(dir, { recursive: true })
29
+ const dest = join(dir, file)
30
+ if (!existsSync(dest)) {
31
+ await copyFile(source, dest)
32
+ try {
33
+ await chmod(dest, 0o644)
34
+ } catch {}
35
+ }
36
+ return dest
37
+ } catch {
38
+ return source
39
+ }
40
+ }
41
+
8
42
  export function resolveAudioPath(file: string): string {
9
43
  try {
10
44
  const here = dirname(fileURLToPath(import.meta.url))
@@ -27,11 +61,12 @@ export async function playAudio(soundName: string, opts: ResolvedOpts): Promise<
27
61
  if (!opts.playSound) return
28
62
  const file = SOUND_FILES[soundName]
29
63
  if (!file) return
30
- const path = resolveAudioPath(file)
31
- if (!existsSync(path)) {
32
- console.warn(`[termux-notify] audio file not found: ${path} for ${soundName}`)
64
+ const source = resolveAudioPath(file)
65
+ if (!existsSync(source)) {
66
+ console.warn(`[termux-notify] audio file not found: ${source} for ${soundName}`)
33
67
  return
34
68
  }
69
+ const path = await ensureAccessibleAudio(source, file)
35
70
  const bin = existsSync(opts.mediaBin) ? opts.mediaBin : "termux-media-player"
36
71
  await new Promise<void>((resolve) => {
37
72
  const p = spawn(bin, ["play", path], { stdio: "ignore" })