@raidiant/notifai 0.5.1 → 1.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 +165 -0
- package/README.md +11 -4
- package/dist/commands.d.ts +16 -1
- package/dist/commands.js +371 -157
- package/dist/commands.js.map +1 -1
- package/dist/config-schema.d.ts +1 -1
- package/dist/config-schema.js +2 -14
- package/dist/config-schema.js.map +1 -1
- package/dist/config.d.ts +19 -8
- package/dist/config.js +50 -7
- package/dist/config.js.map +1 -1
- package/dist/harnesses.d.ts +1 -0
- package/dist/harnesses.js +6 -0
- package/dist/harnesses.js.map +1 -1
- package/dist/hook-adapter.d.ts +10 -1
- package/dist/hook-adapter.js +79 -10
- package/dist/hook-adapter.js.map +1 -1
- package/dist/install-hooks.d.ts +54 -17
- package/dist/install-hooks.js +258 -97
- package/dist/install-hooks.js.map +1 -1
- package/dist/interactive.d.ts +32 -1
- package/dist/interactive.js +163 -47
- package/dist/interactive.js.map +1 -1
- package/dist/main.js +8 -8
- package/dist/main.js.map +1 -1
- package/dist/native-skills.d.ts +1 -1
- package/dist/native-skills.js +23 -58
- package/dist/native-skills.js.map +1 -1
- package/dist/pack-feedback-slice.d.ts +35 -0
- package/dist/pack-feedback-slice.js +126 -0
- package/dist/pack-feedback-slice.js.map +1 -0
- package/dist/readiness.d.ts +20 -0
- package/dist/readiness.js +24 -0
- package/dist/readiness.js.map +1 -1
- package/package.json +3 -2
- package/src/commands.test.ts +364 -31
- package/src/commands.ts +450 -177
- package/src/config-schema.ts +2 -17
- package/src/config.test.ts +29 -4
- package/src/config.ts +67 -11
- package/src/harnesses.ts +7 -0
- package/src/hook-adapter.test.ts +43 -1
- package/src/hook-adapter.ts +83 -11
- package/src/hooks.test.ts +4 -5
- package/src/install-hooks.test.ts +154 -2
- package/src/install-hooks.ts +231 -44
- package/src/interactive.test.ts +338 -0
- package/src/interactive.ts +221 -49
- package/src/main.ts +8 -8
- package/src/native-skills.test.ts +75 -0
- package/src/native-skills.ts +31 -75
- package/src/pack-feedback-slice.test.ts +212 -0
- package/src/pack-feedback-slice.ts +187 -0
- package/src/readiness.test.ts +25 -0
- package/src/readiness.ts +38 -0
- package/src/skill.test.ts +43 -0
- package/src/ui/config-view.test.ts +5 -4
package/dist/native-skills.js
CHANGED
|
@@ -23,51 +23,28 @@ function readLock(scope, cwd, env) {
|
|
|
23
23
|
return {};
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
|
-
function
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const key = Object.keys(lock.skills ?? {}).find((candidate) => candidate.toLowerCase().replace(/[\s_]+/g, '-') === normalized);
|
|
32
|
-
return key === undefined ? undefined : lock.skills?.[key];
|
|
33
|
-
}
|
|
34
|
-
function jsonArray(stdout) {
|
|
35
|
-
const start = stdout.indexOf('[');
|
|
36
|
-
const end = stdout.lastIndexOf(']');
|
|
37
|
-
if (start < 0 || end < start)
|
|
38
|
-
return null;
|
|
39
|
-
try {
|
|
40
|
-
const parsed = JSON.parse(stdout.slice(start, end + 1));
|
|
41
|
-
return Array.isArray(parsed) ? parsed : null;
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
26
|
+
function conventionalSkillPath(scope, name, cwd, env) {
|
|
27
|
+
if (scope === 'project')
|
|
28
|
+
return path.join(cwd, '.agents', 'skills', name);
|
|
29
|
+
const home = env['HOME'] ?? env['USERPROFILE'] ?? os.homedir();
|
|
30
|
+
return path.join(home, '.agents', 'skills', name);
|
|
46
31
|
}
|
|
47
|
-
function
|
|
48
|
-
const entries = jsonArray(stdout);
|
|
49
|
-
if (entries === null)
|
|
50
|
-
return null;
|
|
32
|
+
function skillsFromLock(scope, cwd, env) {
|
|
51
33
|
const lock = readLock(scope, cwd, env);
|
|
52
|
-
return entries.flatMap((entry) => {
|
|
34
|
+
return Object.entries(lock.skills ?? {}).flatMap(([name, entry]) => {
|
|
53
35
|
if (entry === null || typeof entry !== 'object')
|
|
54
36
|
return [];
|
|
55
|
-
const value = entry;
|
|
56
|
-
if (typeof value.name !== 'string' ||
|
|
57
|
-
typeof value.path !== 'string' ||
|
|
58
|
-
value.scope !== scope) {
|
|
59
|
-
return [];
|
|
60
|
-
}
|
|
61
|
-
const lockEntry = lockEntryFor(lock, value.name);
|
|
62
37
|
return [
|
|
63
38
|
{
|
|
64
|
-
name
|
|
39
|
+
name,
|
|
65
40
|
scope,
|
|
66
|
-
path:
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
41
|
+
path: typeof entry.skillPath === 'string' && entry.skillPath !== ''
|
|
42
|
+
? entry.skillPath
|
|
43
|
+
: conventionalSkillPath(scope, name, cwd, env),
|
|
44
|
+
source: typeof entry.source === 'string' ? entry.source : null,
|
|
45
|
+
sourceType: typeof entry.sourceType === 'string' ? entry.sourceType : null,
|
|
46
|
+
sourceUrl: typeof entry.sourceUrl === 'string' ? entry.sourceUrl : null,
|
|
47
|
+
ref: typeof entry.ref === 'string' ? entry.ref : null,
|
|
71
48
|
},
|
|
72
49
|
];
|
|
73
50
|
});
|
|
@@ -77,19 +54,10 @@ function run(args, options) {
|
|
|
77
54
|
const child = spawn('npx', args, {
|
|
78
55
|
cwd: options.cwd,
|
|
79
56
|
env: options.env,
|
|
80
|
-
stdio:
|
|
57
|
+
stdio: 'inherit',
|
|
81
58
|
});
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
child.stdout?.on('data', (chunk) => {
|
|
85
|
-
stdout += chunk.toString();
|
|
86
|
-
});
|
|
87
|
-
child.on('error', () => resolve({ code: 1, stdout }));
|
|
88
|
-
child.on('exit', (code) => resolve({ code: code ?? 1, stdout }));
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
child.on('error', () => resolve({ code: 1, stdout: '' }));
|
|
92
|
-
child.on('exit', (code) => resolve({ code: code ?? 1, stdout: '' }));
|
|
59
|
+
child.on('error', () => resolve(1));
|
|
60
|
+
child.on('exit', (code) => resolve(code ?? 1));
|
|
93
61
|
});
|
|
94
62
|
}
|
|
95
63
|
/** The only process/filesystem adapter Notifai needs for the external installer. */
|
|
@@ -102,16 +70,13 @@ export const nativeSkills = {
|
|
|
102
70
|
// remaining installer prompts non-interactive after the scope is chosen.
|
|
103
71
|
if (options.scope !== undefined)
|
|
104
72
|
args.push('--yes');
|
|
105
|
-
return
|
|
73
|
+
return run(args, { cwd: options.cwd, env: options.env });
|
|
106
74
|
},
|
|
107
75
|
async list(scope, cwd, env) {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
return skills === null
|
|
113
|
-
? { skills: [], error: 'npx skills list returned invalid JSON' }
|
|
114
|
-
: { skills };
|
|
76
|
+
// Presence is already on disk. `npx skills list` takes seconds and cannot
|
|
77
|
+
// change whether the notifai skill is installed — the lock file is what
|
|
78
|
+
// the installer itself consults.
|
|
79
|
+
return { skills: skillsFromLock(scope, cwd, env) };
|
|
115
80
|
},
|
|
116
81
|
};
|
|
117
82
|
//# sourceMappingURL=native-skills.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-skills.js","sourceRoot":"","sources":["../src/native-skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"native-skills.js","sourceRoot":"","sources":["../src/native-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type LogQuery, type LogRecord } from './logging.js';
|
|
2
|
+
export declare const FEEDBACK_SLICE_UNCOMPRESSED_CAP: number;
|
|
3
|
+
export declare const FEEDBACK_SLICE_COMPRESSED_CAP: number;
|
|
4
|
+
export declare const FEEDBACK_SLICE_DEFAULT_WINDOW_MS: number;
|
|
5
|
+
export interface PackFeedbackSliceOptions extends LogQuery {
|
|
6
|
+
/** Epoch ms. Defaults to now. Tests freeze the window with this. */
|
|
7
|
+
now?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface PackedFeedbackSlice {
|
|
10
|
+
records: LogRecord[];
|
|
11
|
+
jsonl: string;
|
|
12
|
+
gzip?: Buffer;
|
|
13
|
+
uncompressed_bytes: number;
|
|
14
|
+
compressed_bytes: number;
|
|
15
|
+
record_count: number;
|
|
16
|
+
truncated: boolean;
|
|
17
|
+
since: number;
|
|
18
|
+
until: number;
|
|
19
|
+
schema_version: number;
|
|
20
|
+
consentSummary: string;
|
|
21
|
+
}
|
|
22
|
+
export interface FeedbackSliceWire {
|
|
23
|
+
encoding: 'gzip+base64';
|
|
24
|
+
bytes: string;
|
|
25
|
+
uncompressed_bytes: number;
|
|
26
|
+
compressed_bytes: number;
|
|
27
|
+
record_count: number;
|
|
28
|
+
truncated: boolean;
|
|
29
|
+
since: string;
|
|
30
|
+
until: string;
|
|
31
|
+
schema_version: number;
|
|
32
|
+
}
|
|
33
|
+
/** Wire form. Empty slices have nothing to encode. */
|
|
34
|
+
export declare function encodeFeedbackSlice(slice: PackedFeedbackSlice): FeedbackSliceWire | undefined;
|
|
35
|
+
export declare function packFeedbackSlice(env?: NodeJS.ProcessEnv, options?: PackFeedbackSliceOptions): PackedFeedbackSlice;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consented, bounded slice of the local log for a later feedback send.
|
|
3
|
+
*
|
|
4
|
+
* This module packs. It does not upload. A caller that wants a report on
|
|
5
|
+
* the wire asks here for the bytes and the consent copy, then decides
|
|
6
|
+
* whether to send them.
|
|
7
|
+
*/
|
|
8
|
+
import { gzipSync } from 'node:zlib';
|
|
9
|
+
import { LOG_SCHEMA_VERSION, readLogRecords, } from './logging.js';
|
|
10
|
+
export const FEEDBACK_SLICE_UNCOMPRESSED_CAP = 256 * 1024;
|
|
11
|
+
export const FEEDBACK_SLICE_COMPRESSED_CAP = 128 * 1024;
|
|
12
|
+
export const FEEDBACK_SLICE_DEFAULT_WINDOW_MS = 24 * 60 * 60 * 1000;
|
|
13
|
+
/** High enough that on-disk rotation, not this number, bounds a full-window read. */
|
|
14
|
+
const FULL_WINDOW_READ_LIMIT = 1_000_000;
|
|
15
|
+
/** Wire form. Empty slices have nothing to encode. */
|
|
16
|
+
export function encodeFeedbackSlice(slice) {
|
|
17
|
+
if (slice.gzip === undefined)
|
|
18
|
+
return undefined;
|
|
19
|
+
return {
|
|
20
|
+
encoding: 'gzip+base64',
|
|
21
|
+
bytes: slice.gzip.toString('base64'),
|
|
22
|
+
uncompressed_bytes: slice.uncompressed_bytes,
|
|
23
|
+
compressed_bytes: slice.compressed_bytes,
|
|
24
|
+
record_count: slice.record_count,
|
|
25
|
+
truncated: slice.truncated,
|
|
26
|
+
since: new Date(slice.since).toISOString(),
|
|
27
|
+
until: new Date(slice.until).toISOString(),
|
|
28
|
+
schema_version: slice.schema_version,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export function packFeedbackSlice(env = process.env, options = {}) {
|
|
32
|
+
const { now, since: sinceOption, limit, ...filters } = options;
|
|
33
|
+
const until = now ?? Date.now();
|
|
34
|
+
const since = sinceOption ?? until - FEEDBACK_SLICE_DEFAULT_WINDOW_MS;
|
|
35
|
+
const { records } = readLogRecords(env, {
|
|
36
|
+
...filters,
|
|
37
|
+
since,
|
|
38
|
+
limit: limit ?? FULL_WINDOW_READ_LIMIT,
|
|
39
|
+
});
|
|
40
|
+
if (records.length === 0) {
|
|
41
|
+
return emptySlice(since, until);
|
|
42
|
+
}
|
|
43
|
+
const packed = fitToCaps(records);
|
|
44
|
+
if (packed === null) {
|
|
45
|
+
return emptySlice(since, until);
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
records: packed.records,
|
|
49
|
+
jsonl: packed.jsonl,
|
|
50
|
+
gzip: packed.gzip,
|
|
51
|
+
uncompressed_bytes: packed.uncompressedBytes,
|
|
52
|
+
compressed_bytes: packed.gzip.length,
|
|
53
|
+
record_count: packed.records.length,
|
|
54
|
+
truncated: packed.truncated,
|
|
55
|
+
since,
|
|
56
|
+
until,
|
|
57
|
+
schema_version: LOG_SCHEMA_VERSION,
|
|
58
|
+
consentSummary: consentSummary({
|
|
59
|
+
since,
|
|
60
|
+
until,
|
|
61
|
+
recordCount: packed.records.length,
|
|
62
|
+
uncompressedBytes: packed.uncompressedBytes,
|
|
63
|
+
compressedBytes: packed.gzip.length,
|
|
64
|
+
}),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function fitToCaps(records) {
|
|
68
|
+
const lines = records.map((record) => JSON.stringify(record));
|
|
69
|
+
let start = 0;
|
|
70
|
+
let truncated = false;
|
|
71
|
+
while (start < lines.length) {
|
|
72
|
+
const jsonl = toJsonl(lines.slice(start));
|
|
73
|
+
const uncompressedBytes = Buffer.byteLength(jsonl);
|
|
74
|
+
if (uncompressedBytes > FEEDBACK_SLICE_UNCOMPRESSED_CAP) {
|
|
75
|
+
start += 1;
|
|
76
|
+
truncated = true;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const gzip = gzipSync(jsonl);
|
|
80
|
+
if (gzip.length <= FEEDBACK_SLICE_COMPRESSED_CAP) {
|
|
81
|
+
return {
|
|
82
|
+
records: records.slice(start),
|
|
83
|
+
jsonl,
|
|
84
|
+
gzip,
|
|
85
|
+
uncompressedBytes,
|
|
86
|
+
truncated,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
start += 1;
|
|
90
|
+
truncated = true;
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
function emptySlice(since, until) {
|
|
95
|
+
return {
|
|
96
|
+
records: [],
|
|
97
|
+
jsonl: '',
|
|
98
|
+
uncompressed_bytes: 0,
|
|
99
|
+
compressed_bytes: 0,
|
|
100
|
+
record_count: 0,
|
|
101
|
+
truncated: false,
|
|
102
|
+
since,
|
|
103
|
+
until,
|
|
104
|
+
schema_version: LOG_SCHEMA_VERSION,
|
|
105
|
+
consentSummary: consentSummary({
|
|
106
|
+
since,
|
|
107
|
+
until,
|
|
108
|
+
recordCount: 0,
|
|
109
|
+
uncompressedBytes: 0,
|
|
110
|
+
compressedBytes: 0,
|
|
111
|
+
}),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function toJsonl(lines) {
|
|
115
|
+
if (lines.length === 0)
|
|
116
|
+
return '';
|
|
117
|
+
return `${lines.join('\n')}\n`;
|
|
118
|
+
}
|
|
119
|
+
function consentSummary(input) {
|
|
120
|
+
const from = new Date(input.since).toISOString();
|
|
121
|
+
const to = new Date(input.until).toISOString();
|
|
122
|
+
return (`About to send ${String(input.recordCount)} log records from ${from} to ${to} ` +
|
|
123
|
+
`(${String(input.uncompressedBytes)} bytes uncompressed, ${String(input.compressedBytes)} bytes compressed). ` +
|
|
124
|
+
'Credentials are already removed. Notification titles and the user\'s answers are in the log.');
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=pack-feedback-slice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack-feedback-slice.js","sourceRoot":"","sources":["../src/pack-feedback-slice.ts"],"names":[],"mappings":"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"}
|
package/dist/readiness.d.ts
CHANGED
|
@@ -85,3 +85,23 @@ export declare function firstBlocker(readiness: Readiness): ReadinessState | nul
|
|
|
85
85
|
export declare function isReady(readiness: Readiness): boolean;
|
|
86
86
|
/** Everything that could still be done, blocking or not, in dependency order. */
|
|
87
87
|
export declare function openItems(readiness: Readiness): ReadinessState[];
|
|
88
|
+
/**
|
|
89
|
+
* Work an assessment can do.
|
|
90
|
+
*
|
|
91
|
+
* `local` is this machine's files: project config, hook installs, skill lock
|
|
92
|
+
* files. `remote` is everything that leaves the process — the keychain, the
|
|
93
|
+
* service, the account, devices, and delivery evidence. The split exists so a
|
|
94
|
+
* redraw after a settings change does not pay for a health check.
|
|
95
|
+
*/
|
|
96
|
+
export type ReadinessRefresh = 'local' | 'remote';
|
|
97
|
+
/**
|
|
98
|
+
* After a menu action, which readiness work is worth doing.
|
|
99
|
+
*
|
|
100
|
+
* `null` means keep the assessment already in hand. Doctor is the report, not
|
|
101
|
+
* a mutation: the check it just ran is the redraw. A test send and a device
|
|
102
|
+
* list cannot change setup. Settings and hook wiring stay on this machine
|
|
103
|
+
* unless the caller says the service URL itself moved.
|
|
104
|
+
*/
|
|
105
|
+
export declare function refreshAfterMenuAction(action: 'setup' | 'account' | 'test' | 'devices' | 'settings' | 'routing' | 'doctor', changed: boolean, options?: {
|
|
106
|
+
remote?: boolean;
|
|
107
|
+
}): readonly ReadinessRefresh[] | null;
|
package/dist/readiness.js
CHANGED
|
@@ -37,4 +37,28 @@ export function isReady(readiness) {
|
|
|
37
37
|
export function openItems(readiness) {
|
|
38
38
|
return readiness.states.filter((s) => s.status === 'gap' || s.status === 'optional-gap');
|
|
39
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* After a menu action, which readiness work is worth doing.
|
|
42
|
+
*
|
|
43
|
+
* `null` means keep the assessment already in hand. Doctor is the report, not
|
|
44
|
+
* a mutation: the check it just ran is the redraw. A test send and a device
|
|
45
|
+
* list cannot change setup. Settings and hook wiring stay on this machine
|
|
46
|
+
* unless the caller says the service URL itself moved.
|
|
47
|
+
*/
|
|
48
|
+
export function refreshAfterMenuAction(action, changed, options = {}) {
|
|
49
|
+
switch (action) {
|
|
50
|
+
case 'doctor':
|
|
51
|
+
case 'test':
|
|
52
|
+
case 'devices':
|
|
53
|
+
return null;
|
|
54
|
+
case 'setup':
|
|
55
|
+
case 'account':
|
|
56
|
+
return changed ? ['local', 'remote'] : null;
|
|
57
|
+
case 'settings':
|
|
58
|
+
case 'routing':
|
|
59
|
+
if (!changed)
|
|
60
|
+
return null;
|
|
61
|
+
return options.remote === true ? ['local', 'remote'] : ['local'];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
40
64
|
//# sourceMappingURL=readiness.js.map
|
package/dist/readiness.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readiness.js","sourceRoot":"","sources":["../src/readiness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAgDH,oEAAoE;AACpE,MAAM,UAAU,YAAY,CAAC,SAAoB;IAC/C,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,IAAI,CAAA;AACjE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,SAAoB;IAC1C,OAAO,YAAY,CAAC,SAAS,CAAC,KAAK,IAAI,CAAA;AACzC,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,SAAS,CAAC,SAAoB;IAC5C,OAAO,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,CAAC,MAAM,KAAK,cAAc,CAAC,CAAA;AAC1F,CAAC"}
|
|
1
|
+
{"version":3,"file":"readiness.js","sourceRoot":"","sources":["../src/readiness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAgDH,oEAAoE;AACpE,MAAM,UAAU,YAAY,CAAC,SAAoB;IAC/C,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,IAAI,CAAA;AACjE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,SAAoB;IAC1C,OAAO,YAAY,CAAC,SAAS,CAAC,KAAK,IAAI,CAAA;AACzC,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,SAAS,CAAC,SAAoB;IAC5C,OAAO,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,CAAC,MAAM,KAAK,cAAc,CAAC,CAAA;AAC1F,CAAC;AAYD;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAoF,EACpF,OAAgB,EAChB,UAAgC,EAAE;IAElC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM,CAAC;QACZ,KAAK,SAAS;YACZ,OAAO,IAAI,CAAA;QACb,KAAK,OAAO,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAC7C,KAAK,UAAU,CAAC;QAChB,KAAK,SAAS;YACZ,IAAI,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAA;YACzB,OAAO,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IACpE,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@raidiant/notifai",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Send native phone notifications from agents and local programs",
|
|
6
6
|
"bin": {
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
"files": [
|
|
10
10
|
"dist",
|
|
11
11
|
"src",
|
|
12
|
-
"tsconfig.json"
|
|
12
|
+
"tsconfig.json",
|
|
13
|
+
"CHANGELOG.md"
|
|
13
14
|
],
|
|
14
15
|
"dependencies": {
|
|
15
16
|
"@clack/prompts": "^1.7.0",
|