@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.
Files changed (57) hide show
  1. package/CHANGELOG.md +165 -0
  2. package/README.md +11 -4
  3. package/dist/commands.d.ts +16 -1
  4. package/dist/commands.js +371 -157
  5. package/dist/commands.js.map +1 -1
  6. package/dist/config-schema.d.ts +1 -1
  7. package/dist/config-schema.js +2 -14
  8. package/dist/config-schema.js.map +1 -1
  9. package/dist/config.d.ts +19 -8
  10. package/dist/config.js +50 -7
  11. package/dist/config.js.map +1 -1
  12. package/dist/harnesses.d.ts +1 -0
  13. package/dist/harnesses.js +6 -0
  14. package/dist/harnesses.js.map +1 -1
  15. package/dist/hook-adapter.d.ts +10 -1
  16. package/dist/hook-adapter.js +79 -10
  17. package/dist/hook-adapter.js.map +1 -1
  18. package/dist/install-hooks.d.ts +54 -17
  19. package/dist/install-hooks.js +258 -97
  20. package/dist/install-hooks.js.map +1 -1
  21. package/dist/interactive.d.ts +32 -1
  22. package/dist/interactive.js +163 -47
  23. package/dist/interactive.js.map +1 -1
  24. package/dist/main.js +8 -8
  25. package/dist/main.js.map +1 -1
  26. package/dist/native-skills.d.ts +1 -1
  27. package/dist/native-skills.js +23 -58
  28. package/dist/native-skills.js.map +1 -1
  29. package/dist/pack-feedback-slice.d.ts +35 -0
  30. package/dist/pack-feedback-slice.js +126 -0
  31. package/dist/pack-feedback-slice.js.map +1 -0
  32. package/dist/readiness.d.ts +20 -0
  33. package/dist/readiness.js +24 -0
  34. package/dist/readiness.js.map +1 -1
  35. package/package.json +3 -2
  36. package/src/commands.test.ts +364 -31
  37. package/src/commands.ts +450 -177
  38. package/src/config-schema.ts +2 -17
  39. package/src/config.test.ts +29 -4
  40. package/src/config.ts +67 -11
  41. package/src/harnesses.ts +7 -0
  42. package/src/hook-adapter.test.ts +43 -1
  43. package/src/hook-adapter.ts +83 -11
  44. package/src/hooks.test.ts +4 -5
  45. package/src/install-hooks.test.ts +154 -2
  46. package/src/install-hooks.ts +231 -44
  47. package/src/interactive.test.ts +338 -0
  48. package/src/interactive.ts +221 -49
  49. package/src/main.ts +8 -8
  50. package/src/native-skills.test.ts +75 -0
  51. package/src/native-skills.ts +31 -75
  52. package/src/pack-feedback-slice.test.ts +212 -0
  53. package/src/pack-feedback-slice.ts +187 -0
  54. package/src/readiness.test.ts +25 -0
  55. package/src/readiness.ts +38 -0
  56. package/src/skill.test.ts +43 -0
  57. package/src/ui/config-view.test.ts +5 -4
@@ -23,51 +23,28 @@ function readLock(scope, cwd, env) {
23
23
  return {};
24
24
  }
25
25
  }
26
- function lockEntryFor(lock, name) {
27
- const direct = lock.skills?.[name];
28
- if (direct)
29
- return direct;
30
- const normalized = name.toLowerCase().replace(/[\s_]+/g, '-');
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 managedSkills(stdout, scope, cwd, env) {
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: value.name,
39
+ name,
65
40
  scope,
66
- path: value.path,
67
- source: typeof value.source === 'string' ? value.source : null,
68
- sourceType: typeof value.sourceType === 'string' ? value.sourceType : null,
69
- sourceUrl: typeof value.sourceUrl === 'string' ? value.sourceUrl : null,
70
- ref: typeof lockEntry?.ref === 'string' ? lockEntry.ref : null,
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: options.stdio === 'inherit' ? 'inherit' : ['ignore', 'pipe', 'ignore'],
57
+ stdio: 'inherit',
81
58
  });
82
- if (options.stdio === 'capture') {
83
- let stdout = '';
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 (await run(args, { cwd: options.cwd, env: options.env, stdio: 'inherit' })).code;
73
+ return run(args, { cwd: options.cwd, env: options.env });
106
74
  },
107
75
  async list(scope, cwd, env) {
108
- const result = await run(['-y', 'skills', 'list', '--json', ...(scope === 'global' ? ['--global'] : [])], { cwd, env, stdio: 'capture' });
109
- if (result.code !== 0)
110
- return { skills: [], error: `npx skills list exited with code ${result.code}` };
111
- const skills = managedSkills(result.stdout, scope, cwd, env);
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":"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"}
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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"}
@@ -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
@@ -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.5.1",
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",