@raidiant/notifai 1.0.1 → 2.0.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.
- package/CHANGELOG.md +50 -0
- package/README.md +17 -7
- package/dist/client.d.ts +5 -1
- package/dist/client.js +2 -0
- package/dist/client.js.map +1 -1
- package/dist/commands.d.ts +10 -1
- package/dist/commands.js +151 -54
- package/dist/commands.js.map +1 -1
- package/dist/config.d.ts +2 -2
- package/dist/config.js +5 -9
- package/dist/config.js.map +1 -1
- package/dist/credentials.d.ts +54 -3
- package/dist/credentials.js +237 -18
- package/dist/credentials.js.map +1 -1
- package/dist/file-lock.js +15 -6
- package/dist/file-lock.js.map +1 -1
- package/dist/hook-adapter.d.ts +6 -2
- package/dist/hook-adapter.js +110 -29
- package/dist/hook-adapter.js.map +1 -1
- package/dist/hooks.d.ts +15 -1
- package/dist/hooks.js +183 -12
- package/dist/hooks.js.map +1 -1
- package/dist/install-hooks.d.ts +50 -21
- package/dist/install-hooks.js +141 -57
- package/dist/install-hooks.js.map +1 -1
- package/dist/logging.d.ts +1 -1
- package/dist/logging.js +4 -0
- package/dist/logging.js.map +1 -1
- package/dist/main.js +14 -3
- package/dist/main.js.map +1 -1
- package/dist/native-skills.js +5 -10
- package/dist/native-skills.js.map +1 -1
- package/dist/opencode-plugin.d.ts +7 -2
- package/dist/opencode-plugin.js +142 -4
- package/dist/opencode-plugin.js.map +1 -1
- package/dist/platform.d.ts +73 -0
- package/dist/platform.js +143 -0
- package/dist/platform.js.map +1 -0
- package/dist/ui/config-view.js +5 -1
- package/dist/ui/config-view.js.map +1 -1
- package/package.json +11 -10
- package/src/client.test.ts +53 -0
- package/src/client.ts +24 -0
- package/src/commands.test.ts +351 -30
- package/src/commands.ts +207 -49
- package/src/config.ts +11 -9
- package/src/credentials.test.ts +291 -0
- package/src/credentials.ts +274 -17
- package/src/file-lock.ts +34 -9
- package/src/hook-adapter.test.ts +136 -0
- package/src/hook-adapter.ts +120 -28
- package/src/hooks.test.ts +175 -1
- package/src/hooks.ts +241 -12
- package/src/install-hooks.test.ts +174 -33
- package/src/install-hooks.ts +186 -54
- package/src/logging.ts +4 -0
- package/src/main.ts +17 -2
- package/src/native-skills.ts +5 -10
- package/src/opencode-plugin.ts +148 -3
- package/src/platform.test.ts +152 -0
- package/src/platform.ts +173 -0
- package/src/skill.test.ts +32 -1
- package/src/ui/config-view.ts +5 -5
package/dist/platform.js
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
/** Drive letter or UNC. MSYS `/c/Users/…` is not a Windows account home. */
|
|
5
|
+
export function isWindowsAbsolute(value) {
|
|
6
|
+
return /^[A-Za-z]:[\\/]/.test(value) || value.startsWith('\\\\');
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* The account home used for Notifai's own defaults.
|
|
10
|
+
*
|
|
11
|
+
* On Windows, Git Bash and MSYS overwrite `HOME` with a POSIX path that is not
|
|
12
|
+
* a usable NTFS root. Those values are ignored; a Windows-absolute
|
|
13
|
+
* `USERPROFILE` or `os.homedir()` wins. A Windows-absolute `HOME` is still
|
|
14
|
+
* honoured. POSIX keeps `HOME` as the override it has always been.
|
|
15
|
+
*/
|
|
16
|
+
export function accountHome(env = process.env, platform = process.platform) {
|
|
17
|
+
if (platform === 'win32') {
|
|
18
|
+
const home = env['HOME'];
|
|
19
|
+
if (typeof home === 'string' && isWindowsAbsolute(home))
|
|
20
|
+
return home;
|
|
21
|
+
const profile = env['USERPROFILE'];
|
|
22
|
+
if (typeof profile === 'string' && isWindowsAbsolute(profile))
|
|
23
|
+
return profile;
|
|
24
|
+
return os.homedir();
|
|
25
|
+
}
|
|
26
|
+
const home = env['HOME'];
|
|
27
|
+
if (typeof home === 'string' && home !== '')
|
|
28
|
+
return home;
|
|
29
|
+
return os.homedir();
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Directory that contains the `notifai/` configuration folder.
|
|
33
|
+
*
|
|
34
|
+
* An explicit `XDG_CONFIG_HOME` always wins, including on Windows. Otherwise
|
|
35
|
+
* Windows uses `%APPDATA%` and POSIX uses `~/.config`.
|
|
36
|
+
*/
|
|
37
|
+
export function configHome(env = process.env, platform = process.platform) {
|
|
38
|
+
const xdg = env['XDG_CONFIG_HOME'];
|
|
39
|
+
if (typeof xdg === 'string' && xdg !== '')
|
|
40
|
+
return xdg;
|
|
41
|
+
if (platform === 'win32') {
|
|
42
|
+
const appdata = env['APPDATA'];
|
|
43
|
+
if (typeof appdata === 'string' && appdata !== '')
|
|
44
|
+
return appdata;
|
|
45
|
+
}
|
|
46
|
+
return path.join(accountHome(env, platform), '.config');
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Directory that contains the `notifai/` machine-local state folder.
|
|
50
|
+
*
|
|
51
|
+
* An explicit `XDG_STATE_HOME` always wins. Otherwise Windows uses
|
|
52
|
+
* `%LOCALAPPDATA%` and POSIX uses `~/.local/state`.
|
|
53
|
+
*/
|
|
54
|
+
export function stateHome(env = process.env, platform = process.platform) {
|
|
55
|
+
const xdg = env['XDG_STATE_HOME'];
|
|
56
|
+
if (typeof xdg === 'string' && xdg !== '')
|
|
57
|
+
return xdg;
|
|
58
|
+
if (platform === 'win32') {
|
|
59
|
+
const local = env['LOCALAPPDATA'];
|
|
60
|
+
if (typeof local === 'string' && local !== '')
|
|
61
|
+
return local;
|
|
62
|
+
}
|
|
63
|
+
return path.join(accountHome(env, platform), '.local', 'state');
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Open a pairing or support URL.
|
|
67
|
+
*
|
|
68
|
+
* Windows goes through `rundll32` so the URL is one CreateProcess argument and
|
|
69
|
+
* `cmd` never reparses `?a=1&b=2`. `windowsHide` keeps the helper from flashing
|
|
70
|
+
* a console. macOS and Linux stay best-effort `open` / `xdg-open`.
|
|
71
|
+
*/
|
|
72
|
+
export function urlOpenLaunch(url, platform = process.platform) {
|
|
73
|
+
if (platform === 'darwin') {
|
|
74
|
+
return { file: 'open', args: [url], options: { stdio: 'ignore', detached: true } };
|
|
75
|
+
}
|
|
76
|
+
if (platform === 'win32') {
|
|
77
|
+
return {
|
|
78
|
+
file: 'rundll32.exe',
|
|
79
|
+
args: ['url.dll,FileProtocolHandler', url],
|
|
80
|
+
options: { stdio: 'ignore', detached: true, windowsHide: true },
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
return { file: 'xdg-open', args: [url], options: { stdio: 'ignore', detached: true } };
|
|
84
|
+
}
|
|
85
|
+
/** Best-effort browser open. Failure is silent: the URL is printed either way. */
|
|
86
|
+
export function openUrl(url, platform = process.platform) {
|
|
87
|
+
try {
|
|
88
|
+
const launch = urlOpenLaunch(url, platform);
|
|
89
|
+
spawn(launch.file, launch.args, launch.options).unref();
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// The caller already printed the URL.
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Quote one cmd.exe argument so it cannot start a second command.
|
|
97
|
+
*
|
|
98
|
+
* `%` expands even inside quotes, so it is doubled. Quotes themselves are
|
|
99
|
+
* doubled. Everything else is inert once quoted, including `& | > < ^`.
|
|
100
|
+
*/
|
|
101
|
+
export function quoteCmdArgument(value) {
|
|
102
|
+
return `"${value.replace(/%/g, '%%').replace(/"/g, '""')}"`;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* A single `/c` argument for `cmd /d /s /c`.
|
|
106
|
+
*
|
|
107
|
+
* `/s` strips the first and last quote when both ends are quotes, so the
|
|
108
|
+
* payload is wrapped once more around the already-quoted argv. What cmd then
|
|
109
|
+
* runs is `"npx.cmd" "-y" …` with no unquoted metacharacters.
|
|
110
|
+
*/
|
|
111
|
+
export function cmdScript(command, args) {
|
|
112
|
+
return `"${[command, ...args].map(quoteCmdArgument).join(' ')}"`;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Launch `npx` so Windows can run the `.cmd` shim.
|
|
116
|
+
*
|
|
117
|
+
* `spawn('npx', …)` is CreateProcess of a file named `npx`, which does not
|
|
118
|
+
* exist — npm installs `npx.cmd`. cmd.exe can run that shim; CreateProcess
|
|
119
|
+
* cannot. Arguments stay in one quoted `/c` string rather than `shell: true`.
|
|
120
|
+
*/
|
|
121
|
+
export function npxLaunch(args, options) {
|
|
122
|
+
const platform = options.platform ?? process.platform;
|
|
123
|
+
const stdio = options.stdio ?? 'inherit';
|
|
124
|
+
if (platform === 'win32') {
|
|
125
|
+
return {
|
|
126
|
+
file: options.env['ComSpec'] && options.env['ComSpec'] !== '' ? options.env['ComSpec'] : 'cmd.exe',
|
|
127
|
+
args: ['/d', '/s', '/v:off', '/c', cmdScript('npx.cmd', args)],
|
|
128
|
+
options: {
|
|
129
|
+
cwd: options.cwd,
|
|
130
|
+
env: options.env,
|
|
131
|
+
stdio,
|
|
132
|
+
windowsHide: true,
|
|
133
|
+
windowsVerbatimArguments: true,
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
file: 'npx',
|
|
139
|
+
args: [...args],
|
|
140
|
+
options: { cwd: options.cwd, env: options.env, stdio },
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/config-view.js
CHANGED
|
@@ -47,7 +47,11 @@ export function renderConfigList(config, options = {}) {
|
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
lines.push('');
|
|
50
|
-
|
|
50
|
+
const command = 'notifai config explain <key>';
|
|
51
|
+
const help = `${glyph.arrow} ${command} for what one of these means and how to change it.`;
|
|
52
|
+
for (const line of wrap(help, columns)) {
|
|
53
|
+
lines.push(style.dim(line.replace(command, style.code(command))));
|
|
54
|
+
}
|
|
51
55
|
return lines;
|
|
52
56
|
}
|
|
53
57
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-view.js","sourceRoot":"","sources":["../../src/ui/config-view.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"config-view.js","sourceRoot":"","sources":["../../src/ui/config-view.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@raidiant/notifai",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Send native phone notifications from agents and local programs",
|
|
6
6
|
"bin": {
|
|
@@ -12,9 +12,16 @@
|
|
|
12
12
|
"tsconfig.json",
|
|
13
13
|
"CHANGELOG.md"
|
|
14
14
|
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "node ../../scripts/clean-dist.mjs && tsc -p tsconfig.json",
|
|
17
|
+
"pretest": "pnpm run build",
|
|
18
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
19
|
+
"test": "node ../../scripts/run-cli-tests.mjs",
|
|
20
|
+
"prepack": "pnpm run build"
|
|
21
|
+
},
|
|
15
22
|
"dependencies": {
|
|
16
23
|
"@clack/prompts": "^1.7.0",
|
|
17
|
-
"@raidiant/notifai-protocol": "0.
|
|
24
|
+
"@raidiant/notifai-protocol": "0.4.0",
|
|
18
25
|
"commander": "^14.0.0",
|
|
19
26
|
"picocolors": "^1.1.1",
|
|
20
27
|
"smol-toml": "^1.4.0"
|
|
@@ -49,11 +56,5 @@
|
|
|
49
56
|
"ai",
|
|
50
57
|
"claude",
|
|
51
58
|
"codex"
|
|
52
|
-
]
|
|
53
|
-
|
|
54
|
-
"build": "node ../../scripts/clean-dist.mjs && tsc -p tsconfig.json",
|
|
55
|
-
"pretest": "pnpm run build",
|
|
56
|
-
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
57
|
-
"test": "vitest run"
|
|
58
|
-
}
|
|
59
|
-
}
|
|
59
|
+
]
|
|
60
|
+
}
|
package/src/client.test.ts
CHANGED
|
@@ -80,6 +80,59 @@ describe('a server that never answers', () => {
|
|
|
80
80
|
expect(result.replies).toEqual([])
|
|
81
81
|
})
|
|
82
82
|
|
|
83
|
+
it('puts and fetches Agent Acknowledgements on the encoded request path', async () => {
|
|
84
|
+
const seen: { method?: string; url?: string; body?: unknown }[] = []
|
|
85
|
+
const baseUrl = await serving((request, response) => {
|
|
86
|
+
let raw = ''
|
|
87
|
+
request.on('data', (chunk) => {
|
|
88
|
+
raw += String(chunk)
|
|
89
|
+
})
|
|
90
|
+
request.on('end', () => {
|
|
91
|
+
seen.push({
|
|
92
|
+
method: request.method,
|
|
93
|
+
url: request.url,
|
|
94
|
+
...(raw === '' ? {} : { body: JSON.parse(raw) as unknown }),
|
|
95
|
+
})
|
|
96
|
+
response.setHeader('content-type', 'application/json')
|
|
97
|
+
if (request.method === 'PUT') {
|
|
98
|
+
response.end(
|
|
99
|
+
JSON.stringify({
|
|
100
|
+
status: 'recorded',
|
|
101
|
+
agent_acknowledgement: {
|
|
102
|
+
text: 'I will deploy.',
|
|
103
|
+
created_at: '2026-08-13T12:01:00.000Z',
|
|
104
|
+
},
|
|
105
|
+
}),
|
|
106
|
+
)
|
|
107
|
+
} else {
|
|
108
|
+
response.end(
|
|
109
|
+
JSON.stringify({
|
|
110
|
+
request_id: 'req/encoded',
|
|
111
|
+
agent_acknowledgement_required: true,
|
|
112
|
+
agent_acknowledgement: null,
|
|
113
|
+
}),
|
|
114
|
+
)
|
|
115
|
+
}
|
|
116
|
+
})
|
|
117
|
+
})
|
|
118
|
+
const client = createClient(baseUrl, 'Bearer test')
|
|
119
|
+
|
|
120
|
+
await client.putAgentAcknowledgement('req/encoded', { text: 'I will deploy.' })
|
|
121
|
+
await client.agentAcknowledgement('req/encoded', { waitSeconds: 25 })
|
|
122
|
+
|
|
123
|
+
expect(seen).toEqual([
|
|
124
|
+
{
|
|
125
|
+
method: 'PUT',
|
|
126
|
+
url: '/api/v1/notifications/req%2Fencoded/agent-acknowledgement',
|
|
127
|
+
body: { text: 'I will deploy.' },
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
method: 'GET',
|
|
131
|
+
url: '/api/v1/notifications/req%2Fencoded/agent-acknowledgement?wait_seconds=25',
|
|
132
|
+
},
|
|
133
|
+
])
|
|
134
|
+
})
|
|
135
|
+
|
|
83
136
|
it('treats a truncated body as a transport failure, not a crash', async () => {
|
|
84
137
|
// A body that stops mid-JSON used to escape as a raw parse error outside
|
|
85
138
|
// the retry path, so nothing backed off and retried it.
|
package/src/client.ts
CHANGED
|
@@ -6,10 +6,13 @@ import type {
|
|
|
6
6
|
CreateMediaUploadRequestT,
|
|
7
7
|
CreateMediaUploadResponse,
|
|
8
8
|
EvidenceSnapshot,
|
|
9
|
+
GetAgentAcknowledgementResponse,
|
|
9
10
|
ListDevicesResponse,
|
|
10
11
|
ListRepliesResponse,
|
|
11
12
|
Platform,
|
|
12
13
|
PollPairingResponse,
|
|
14
|
+
PutAgentAcknowledgementRequestT,
|
|
15
|
+
PutAgentAcknowledgementResponse,
|
|
13
16
|
SubmissionReceipt,
|
|
14
17
|
SubmitNotificationRequestT,
|
|
15
18
|
} from '@raidiant/notifai-protocol'
|
|
@@ -72,6 +75,14 @@ export interface ApiClient {
|
|
|
72
75
|
): Promise<ListRepliesResponse>
|
|
73
76
|
/** Retire a question and return the replies committed before the close fence. */
|
|
74
77
|
closeReplies(requestId: string): Promise<ListRepliesResponse>
|
|
78
|
+
putAgentAcknowledgement(
|
|
79
|
+
requestId: string,
|
|
80
|
+
body: PutAgentAcknowledgementRequestT,
|
|
81
|
+
): Promise<PutAgentAcknowledgementResponse>
|
|
82
|
+
agentAcknowledgement(
|
|
83
|
+
requestId: string,
|
|
84
|
+
options: { waitSeconds: number },
|
|
85
|
+
): Promise<GetAgentAcknowledgementResponse>
|
|
75
86
|
createMediaUpload(body: CreateMediaUploadRequestT): Promise<CreateMediaUploadResponse>
|
|
76
87
|
uploadMedia(grant: CreateMediaUploadResponse, bytes: Uint8Array): Promise<void>
|
|
77
88
|
health(): Promise<boolean>
|
|
@@ -223,6 +234,19 @@ export function createClient(
|
|
|
223
234
|
'POST',
|
|
224
235
|
`/api/v1/notifications/${encodeURIComponent(requestId)}/replies/close`,
|
|
225
236
|
),
|
|
237
|
+
putAgentAcknowledgement: (requestId, body) =>
|
|
238
|
+
call<PutAgentAcknowledgementResponse>(
|
|
239
|
+
'PUT',
|
|
240
|
+
`/api/v1/notifications/${encodeURIComponent(requestId)}/agent-acknowledgement`,
|
|
241
|
+
body,
|
|
242
|
+
),
|
|
243
|
+
agentAcknowledgement: (requestId, { waitSeconds }) =>
|
|
244
|
+
call<GetAgentAcknowledgementResponse>(
|
|
245
|
+
'GET',
|
|
246
|
+
`/api/v1/notifications/${encodeURIComponent(requestId)}/agent-acknowledgement?wait_seconds=${waitSeconds}`,
|
|
247
|
+
undefined,
|
|
248
|
+
waitSeconds,
|
|
249
|
+
),
|
|
226
250
|
createMediaUpload: (body) => call('POST', '/api/v1/media', body),
|
|
227
251
|
uploadMedia: async (grant, bytes) => {
|
|
228
252
|
let response: Response
|