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 +2 -0
- package/dist/audio.d.ts.map +1 -1
- package/dist/audio.js +38 -3
- package/dist/audio.js.map +1 -1
- package/package.json +1 -1
- package/src/audio.ts +38 -3
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
|
package/dist/audio.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"
|
|
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
|
|
33
|
-
if (!existsSync(
|
|
34
|
-
console.warn(`[termux-notify] audio file not found: ${
|
|
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,
|
|
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.
|
|
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
|
|
31
|
-
if (!existsSync(
|
|
32
|
-
console.warn(`[termux-notify] audio file not found: ${
|
|
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" })
|