@raidiant/notifai 5.0.0 → 6.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 (104) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +2 -2
  3. package/dist/client.d.ts +8 -3
  4. package/dist/client.js +24 -3
  5. package/dist/client.js.map +1 -1
  6. package/dist/commands-auth.d.ts +14 -0
  7. package/dist/commands-auth.js +154 -0
  8. package/dist/commands-auth.js.map +1 -0
  9. package/dist/commands-config.d.ts +31 -0
  10. package/dist/commands-config.js +246 -0
  11. package/dist/commands-config.js.map +1 -0
  12. package/dist/commands-core.d.ts +102 -0
  13. package/dist/commands-core.js +135 -0
  14. package/dist/commands-core.js.map +1 -0
  15. package/dist/commands-devices.d.ts +31 -0
  16. package/dist/commands-devices.js +124 -0
  17. package/dist/commands-devices.js.map +1 -0
  18. package/dist/commands-doctor.d.ts +24 -0
  19. package/dist/commands-doctor.js +1011 -0
  20. package/dist/commands-doctor.js.map +1 -0
  21. package/dist/commands-harness-context.d.ts +61 -0
  22. package/dist/commands-harness-context.js +93 -0
  23. package/dist/commands-harness-context.js.map +1 -0
  24. package/dist/commands-hook-shape.d.ts +17 -0
  25. package/dist/commands-hook-shape.js +37 -0
  26. package/dist/commands-hook-shape.js.map +1 -0
  27. package/dist/commands-hooks.d.ts +115 -0
  28. package/dist/commands-hooks.js +1225 -0
  29. package/dist/commands-hooks.js.map +1 -0
  30. package/dist/commands-init.d.ts +35 -0
  31. package/dist/commands-init.js +580 -0
  32. package/dist/commands-init.js.map +1 -0
  33. package/dist/commands-io.d.ts +2 -0
  34. package/dist/commands-io.js +110 -0
  35. package/dist/commands-io.js.map +1 -0
  36. package/dist/commands-logs.d.ts +30 -0
  37. package/dist/commands-logs.js +201 -0
  38. package/dist/commands-logs.js.map +1 -0
  39. package/dist/commands-send-support.d.ts +44 -0
  40. package/dist/commands-send-support.js +180 -0
  41. package/dist/commands-send-support.js.map +1 -0
  42. package/dist/commands-send.d.ts +33 -0
  43. package/dist/commands-send.js +519 -0
  44. package/dist/commands-send.js.map +1 -0
  45. package/dist/commands-setup-proof.d.ts +15 -0
  46. package/dist/commands-setup-proof.js +53 -0
  47. package/dist/commands-setup-proof.js.map +1 -0
  48. package/dist/commands-skill.d.ts +10 -0
  49. package/dist/commands-skill.js +71 -0
  50. package/dist/commands-skill.js.map +1 -0
  51. package/dist/commands.d.ts +12 -387
  52. package/dist/commands.js +12 -4536
  53. package/dist/commands.js.map +1 -1
  54. package/dist/config-schema.js +1 -1
  55. package/dist/config-schema.js.map +1 -1
  56. package/dist/config.d.ts +1 -1
  57. package/dist/config.js +3 -1
  58. package/dist/config.js.map +1 -1
  59. package/dist/credentials.js +13 -3
  60. package/dist/credentials.js.map +1 -1
  61. package/dist/hooks.d.ts +2 -2
  62. package/dist/hooks.js +127 -99
  63. package/dist/hooks.js.map +1 -1
  64. package/dist/interactive.js +4 -4
  65. package/dist/interactive.js.map +1 -1
  66. package/dist/logging.js +1 -0
  67. package/dist/logging.js.map +1 -1
  68. package/dist/main.js +1 -1
  69. package/dist/main.js.map +1 -1
  70. package/dist/readiness.d.ts +3 -1
  71. package/dist/readiness.js.map +1 -1
  72. package/package.json +2 -2
  73. package/src/client.test.ts +90 -1
  74. package/src/client.ts +35 -2
  75. package/src/commands-auth.ts +174 -0
  76. package/src/commands-config.ts +307 -0
  77. package/src/commands-core.ts +240 -0
  78. package/src/commands-devices.ts +150 -0
  79. package/src/commands-doctor.ts +1209 -0
  80. package/src/commands-harness-context.ts +126 -0
  81. package/src/commands-hook-shape.ts +53 -0
  82. package/src/commands-hooks.ts +1586 -0
  83. package/src/commands-init.ts +721 -0
  84. package/src/commands-io.ts +108 -0
  85. package/src/commands-logs.ts +243 -0
  86. package/src/commands-send-support.ts +224 -0
  87. package/src/commands-send.ts +623 -0
  88. package/src/commands-setup-proof.ts +71 -0
  89. package/src/commands-skill.ts +84 -0
  90. package/src/commands.test.ts +493 -39
  91. package/src/commands.ts +58 -5614
  92. package/src/config-schema.ts +1 -1
  93. package/src/config.test.ts +9 -0
  94. package/src/config.ts +7 -2
  95. package/src/credentials.test.ts +25 -1
  96. package/src/credentials.ts +13 -3
  97. package/src/hooks.test.ts +351 -11
  98. package/src/hooks.ts +145 -97
  99. package/src/interactive.test.ts +19 -1
  100. package/src/interactive.ts +4 -4
  101. package/src/logging.test.ts +15 -2
  102. package/src/logging.ts +1 -0
  103. package/src/main.ts +1 -1
  104. package/src/readiness.ts +3 -1
@@ -0,0 +1,580 @@
1
+ import { CAPABILITIES_V1, validateDraft, } from '@raidiant/notifai-protocol';
2
+ import { randomBytes } from 'node:crypto';
3
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
4
+ import path from 'node:path';
5
+ import { parse as parseToml, stringify as stringifyToml } from 'smol-toml';
6
+ import { ApiCallError, NetworkError } from './client.js';
7
+ import {} from './config.js';
8
+ import { projectSlugFrom as inferredProjectSlugFrom } from './invocation-context.js';
9
+ import { firstBlocker } from './readiness.js';
10
+ import { buildDraft, formatReceipt } from './send.js';
11
+ import { loginCommand } from './commands-auth.js';
12
+ import { EXIT, UPDATE_CLI_COMMAND, authedClient, loadLoggedConfig, reportError, } from './commands-core.js';
13
+ import { readyIosDevices, supportPageUrl } from './commands-devices.js';
14
+ import { assessReadiness, remedyLine } from './commands-doctor.js';
15
+ import { hooksInstallCommand, pickHarnessesToInstall } from './commands-hooks.js';
16
+ import { observedCompanionReceipt, readSetupProof, writeSetupProof } from './commands-setup-proof.js';
17
+ import { SKILLS_SOURCE } from './commands-skill.js';
18
+ // ---------------------------------------------------------------------------
19
+ // init
20
+ // ---------------------------------------------------------------------------
21
+ /** Derive a contract-valid project slug; init alone needs a non-empty fallback. */
22
+ export function projectSlugFrom(name) {
23
+ return inferredProjectSlugFrom(name) ?? 'project';
24
+ }
25
+ /** Long enough for a first TestFlight install; keep-waiting extends another budget. */
26
+ const DEVICE_BRIDGE_TIMEOUT_MS = 10 * 60 * 1000;
27
+ const DEVICE_BRIDGE_POLL_MS = 2_000;
28
+ const PROOF_TIMEOUT_MS = 30_000;
29
+ const PROOF_POLL_MS = 1_000;
30
+ function formatWaitBudget(milliseconds) {
31
+ const minutes = Math.round(milliseconds / 60_000);
32
+ return minutes === 1 ? '1 minute' : `${minutes} minutes`;
33
+ }
34
+ async function closeGap(deps, state, flags) {
35
+ if (state.id === 'project') {
36
+ const configPath = path.join(deps.cwd, '.notifai', 'config.toml');
37
+ const existing = existsSync(configPath)
38
+ ? parseToml(readFileSync(configPath, 'utf8'))
39
+ : {};
40
+ existing['project'] = projectSlugFrom(flags.projectId ?? path.basename(deps.cwd));
41
+ mkdirSync(path.dirname(configPath), { recursive: true });
42
+ writeFileSync(configPath, `${stringifyToml(existing)}\n`);
43
+ return 'closed';
44
+ }
45
+ if (state.id === 'hooks') {
46
+ const harnesses = await pickHarnessesToInstall(deps);
47
+ if (harnesses === null || harnesses.length === 0)
48
+ return 'failed';
49
+ let ok = true;
50
+ for (const harness of harnesses) {
51
+ if (hooksInstallCommand(deps, { harness }) !== EXIT.ok)
52
+ ok = false;
53
+ }
54
+ return ok ? 'closed' : 'failed';
55
+ }
56
+ if (state.id === 'skill') {
57
+ if (deps.nativeSkills === undefined) {
58
+ deps.io.err('Skill installation failed — the native `npx skills` flow is unavailable.');
59
+ return 'failed';
60
+ }
61
+ // Refuse rather than reach for a mutable ref: installing the skill from a
62
+ // moving branch is the one outcome the pin exists to prevent.
63
+ if (SKILLS_SOURCE === null) {
64
+ deps.io.err('Skill installation failed — this build cannot determine its own version, so there is no release tag to install from.');
65
+ return 'failed';
66
+ }
67
+ const scopeText = flags.skillsScope === undefined ? 'the scope you choose' : `${flags.skillsScope} scope`;
68
+ deps.io.out(`Starting the native npx skills setup for the notifai agent skill (${scopeText})...`);
69
+ const addOptions = {
70
+ source: SKILLS_SOURCE,
71
+ skill: 'notifai',
72
+ cwd: deps.cwd,
73
+ env: deps.env,
74
+ ...(flags.skillsScope === undefined ? {} : { scope: flags.skillsScope }),
75
+ };
76
+ const code = await deps.nativeSkills.add(addOptions);
77
+ if (code !== 0) {
78
+ deps.io.err('Skill installation failed — run it manually with:');
79
+ deps.io.err(` npx skills add ${SKILLS_SOURCE} --skill notifai${flags.skillsScope === 'global' ? ' --global' : ''}${flags.skillsScope === undefined ? '' : ' --yes'}`);
80
+ }
81
+ return code === 0 ? 'closed' : 'failed';
82
+ }
83
+ if (state.id === 'proof')
84
+ return await runSetupProof(deps);
85
+ return 'failed';
86
+ }
87
+ function deviceBridgeMessage(devices) {
88
+ if (devices.length === 0) {
89
+ return 'Waiting for the iPhone app to sign in and register…';
90
+ }
91
+ const denied = devices.find((device) => device.permission_status === 'denied');
92
+ if (denied)
93
+ return `Waiting for notifications to be allowed on ${denied.display_name}…`;
94
+ const undecided = devices.find((device) => device.permission_status === 'not_determined');
95
+ if (undecided)
96
+ return `Waiting for ${undecided.display_name} to allow the notification prompt…`;
97
+ return 'Waiting for an iPhone to become ready…';
98
+ }
99
+ /**
100
+ * Observe the supported Device Installation path while the user finishes the
101
+ * app-side work. The live bridge is the dashboard `/support` page (TestFlight
102
+ * steps). Interactive runs offer to open it so the user never types the URL;
103
+ * non-interactive/agent paths only print plain text and never wait on a prompt.
104
+ *
105
+ * The wait budget is stated up front. On expiry we say the *timer* expired —
106
+ * not the setup — and offer another budget when a human is present. Agents
107
+ * never hang: this whole path is gated on `io.interactive`, and keep-waiting
108
+ * uses `confirm` which resolves the safe default when not interactive.
109
+ */
110
+ async function waitForReadyDevice(deps, state) {
111
+ const remedy = state.remedy;
112
+ if (deps.io.interactive !== true || remedy?.by !== 'user-elsewhere')
113
+ return 'pending';
114
+ const config = loadLoggedConfig(deps, { cwd: deps.cwd, env: deps.env });
115
+ const authed = authedClient(deps, config);
116
+ if (!authed) {
117
+ deps.io.err('Could not start the companion-device wait: this machine is not signed in.');
118
+ return 'failed';
119
+ }
120
+ const budgetLabel = formatWaitBudget(DEVICE_BRIDGE_TIMEOUT_MS);
121
+ const supportUrl = supportPageUrl(authed.baseUrl);
122
+ await deps.io.note?.([
123
+ state.detail,
124
+ remedy.summary,
125
+ `Install steps (no typing): ${supportUrl}`,
126
+ `I will wait up to ${budgetLabel} for your iPhone to become ready.`,
127
+ ].join('\n'), 'Finish setup on your iPhone');
128
+ // Open the real support page so the user never has to type the URL. Decline
129
+ // is fine — the URL remains in the note and in the Next: line if they leave.
130
+ if (await deps.io.confirm('Open install instructions in your browser?', true)) {
131
+ deps.io.openUrl(supportUrl);
132
+ }
133
+ if (!(await deps.io.confirm('Wait here while you finish that on your device?', true))) {
134
+ deps.io.out(`OK — finish device setup when you can (install steps: ${supportUrl}), then re-run \`notifai init\`.`);
135
+ return 'pending';
136
+ }
137
+ const now = deps.now ?? Date.now;
138
+ const sleep = deps.sleep ??
139
+ ((milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)));
140
+ const spinner = await deps.io.spinner?.(`Waiting up to ${budgetLabel} for your iPhone…`);
141
+ let lastDevices = [];
142
+ let deadline = now() + DEVICE_BRIDGE_TIMEOUT_MS;
143
+ for (;;) {
144
+ while (now() < deadline) {
145
+ try {
146
+ const response = await authed.client.listDevices();
147
+ const iphoneDevices = response.devices.filter((device) => device.platform === 'ios');
148
+ lastDevices = iphoneDevices;
149
+ const ready = readyIosDevices(iphoneDevices)[0];
150
+ if (ready) {
151
+ spinner?.stop(`${ready.display_name} is ready to receive`);
152
+ return 'closed';
153
+ }
154
+ spinner?.message(deviceBridgeMessage(iphoneDevices));
155
+ }
156
+ catch (err) {
157
+ if (!(err instanceof NetworkError)) {
158
+ spinner?.error('Could not check companion readiness');
159
+ reportError(deps, err);
160
+ return 'failed';
161
+ }
162
+ spinner?.message('Connection lost — still watching…');
163
+ }
164
+ await sleep(Math.min(DEVICE_BRIDGE_POLL_MS, Math.max(0, deadline - now())));
165
+ }
166
+ // Timer expired — setup did not. Offer another budget only when a human
167
+ // can answer; confirm() already returns the fallback for agents, so this
168
+ // never hangs unattended even if interactive were mis-set.
169
+ spinner?.error(`The ${budgetLabel} wait timer expired`);
170
+ deps.io.err(`The ${budgetLabel} wait timer expired — setup is not finished, only this wait.`);
171
+ deps.io.err(deviceBridgeMessage(lastDevices).replace(/…$/, '.'));
172
+ deps.io.err(`Re-run \`notifai init\` later and it will pick up from here (install steps: ${supportUrl}).`);
173
+ const keepWaiting = await deps.io.confirm(`Keep waiting for another ${budgetLabel}?`, false);
174
+ if (!keepWaiting) {
175
+ deps.io.out('Stopping the wait. iPhone setup can continue; re-run `notifai init` when ready.');
176
+ return 'pending';
177
+ }
178
+ spinner?.message(`Waiting another ${budgetLabel} for your iPhone…`);
179
+ deadline = now() + DEVICE_BRIDGE_TIMEOUT_MS;
180
+ }
181
+ }
182
+ function setupProofDraft(config, device) {
183
+ const project = config.project.value;
184
+ return buildDraft(config, {
185
+ title: 'Notifai is ready',
186
+ body: project === null
187
+ ? 'This real notification completed setup verification.'
188
+ : `This real notification completed setup verification for ${project}.`,
189
+ event: 'setup_verified',
190
+ kind: 'update',
191
+ platform: 'ios',
192
+ device: [device.device_id],
193
+ sound: 'none',
194
+ level: 'passive',
195
+ collapseKey: 'notifai-setup-verification',
196
+ });
197
+ }
198
+ async function submitSetupProof(deps, client, config, device) {
199
+ const build = setupProofDraft(config, device);
200
+ if (!build.ok) {
201
+ deps.io.err(`Could not build the setup verification notification: ${build.error}`);
202
+ return null;
203
+ }
204
+ const capabilities = CAPABILITIES_V1.describe(build.platform);
205
+ if (!capabilities) {
206
+ deps.io.err(`No capability contract is available for ${build.platform}.`);
207
+ return null;
208
+ }
209
+ const validation = validateDraft(build.draft, capabilities);
210
+ if (!validation.ok) {
211
+ for (const issue of validation.errors) {
212
+ deps.io.err(`Setup verification ${issue.path}: ${issue.message}`);
213
+ }
214
+ return null;
215
+ }
216
+ try {
217
+ return await client.submit({
218
+ idempotency_key: `init-${randomBytes(12).toString('base64url')}`,
219
+ draft: build.draft,
220
+ }, config.wait_seconds.value);
221
+ }
222
+ catch (err) {
223
+ reportError(deps, err);
224
+ return null;
225
+ }
226
+ }
227
+ /**
228
+ * Send or resume one real setup probe, then wait for a Companion Receipt.
229
+ * Provider Acceptance is intentionally insufficient: it proves APNs accepted
230
+ * the push, not that a companion process received it.
231
+ */
232
+ async function runSetupProof(deps) {
233
+ const config = loadLoggedConfig(deps, { cwd: deps.cwd, env: deps.env });
234
+ const authed = authedClient(deps, config);
235
+ if (!authed)
236
+ return 'failed';
237
+ let devices;
238
+ try {
239
+ devices = (await authed.client.listDevices()).devices;
240
+ }
241
+ catch (err) {
242
+ reportError(deps, err);
243
+ return 'failed';
244
+ }
245
+ const candidates = readyIosDevices(devices);
246
+ const existing = readSetupProof(deps);
247
+ const target = candidates.find((device) => device.device_id === existing?.device_id && existing.project === config.project.value) ?? candidates[0];
248
+ if (!target) {
249
+ deps.io.err('Setup proof needs a receipt-capable iPhone.');
250
+ return 'pending';
251
+ }
252
+ let proof = existing?.device_id === target.device_id && existing.project === config.project.value
253
+ ? existing
254
+ : null;
255
+ if (proof === null) {
256
+ const receipt = await submitSetupProof(deps, authed.client, config, target);
257
+ if (receipt === null)
258
+ return 'failed';
259
+ if (receipt.overall === 'provider_rejected_all') {
260
+ deps.io.err(formatReceipt(receipt));
261
+ return 'failed';
262
+ }
263
+ proof = {
264
+ request_id: receipt.request_id,
265
+ device_id: target.device_id,
266
+ project: config.project.value,
267
+ started_at: new Date((deps.now ?? Date.now)()).toISOString(),
268
+ };
269
+ if (!writeSetupProof(deps, proof))
270
+ return 'failed';
271
+ deps.io.out(`Verification notification sent to ${target.display_name} (${proof.request_id}).`);
272
+ }
273
+ else {
274
+ deps.io.out(`Checking verification notification ${proof.request_id} again.`);
275
+ }
276
+ const now = deps.now ?? Date.now;
277
+ const sleep = deps.sleep ?? ((milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)));
278
+ const deadline = now() + PROOF_TIMEOUT_MS;
279
+ const spinner = deps.io.interactive === true
280
+ ? await deps.io.spinner?.("Waiting for a Companion Receipt (the app's delivery confirmation)…")
281
+ : null;
282
+ let lastError = null;
283
+ let replacedMissingProof = false;
284
+ for (;;) {
285
+ try {
286
+ const snapshot = await authed.client.evidence(proof.request_id);
287
+ const observed = observedCompanionReceipt(snapshot, proof.device_id);
288
+ if (observed) {
289
+ spinner?.stop(`Receipt observed from ${observed.delivery.device_name}`);
290
+ deps.io.out(`Companion Receipt (the app's delivery confirmation) observed from ${observed.delivery.device_name}.`);
291
+ return 'closed';
292
+ }
293
+ lastError = null;
294
+ }
295
+ catch (err) {
296
+ lastError = err;
297
+ if (err instanceof ApiCallError &&
298
+ err.code === 'not_found' &&
299
+ !replacedMissingProof) {
300
+ const receipt = await submitSetupProof(deps, authed.client, config, target);
301
+ if (receipt === null)
302
+ return 'failed';
303
+ if (receipt.overall === 'provider_rejected_all') {
304
+ deps.io.err(formatReceipt(receipt));
305
+ return 'failed';
306
+ }
307
+ proof = {
308
+ request_id: receipt.request_id,
309
+ device_id: target.device_id,
310
+ project: config.project.value,
311
+ started_at: new Date(now()).toISOString(),
312
+ };
313
+ if (!writeSetupProof(deps, proof))
314
+ return 'failed';
315
+ replacedMissingProof = true;
316
+ lastError = null;
317
+ deps.io.out(`The saved proof had expired; sent replacement ${proof.request_id}.`);
318
+ continue;
319
+ }
320
+ if (!(err instanceof NetworkError)) {
321
+ spinner?.error('Could not read Companion Receipt evidence');
322
+ reportError(deps, err);
323
+ return 'failed';
324
+ }
325
+ spinner?.message('Connection lost — still checking the same request…');
326
+ }
327
+ if (now() >= deadline)
328
+ break;
329
+ await sleep(Math.min(PROOF_POLL_MS, Math.max(0, deadline - now())));
330
+ }
331
+ spinner?.stop('Delivery confirmation not observed yet');
332
+ if (lastError instanceof NetworkError)
333
+ deps.io.err(lastError.message);
334
+ deps.io.out(`Provider accepted the notification; Companion Receipt (the app's delivery confirmation) for ${proof.request_id} was not observed within ${PROOF_TIMEOUT_MS / 1000}s. ` +
335
+ 'Proof may still arrive — re-run `notifai init` and it will re-check this same notification.');
336
+ return 'pending';
337
+ }
338
+ /** Closing a local gap cannot have changed the service, the keychain, or devices. */
339
+ function refreshAfterClose(id) {
340
+ return id === 'project' || id === 'hooks' || id === 'skill' || id === 'question-routing-settings'
341
+ ? ['local']
342
+ : undefined;
343
+ }
344
+ /** Whether an optional gap should be closed, given flags and who is watching. */
345
+ function wantsOptional(deps, state, flags) {
346
+ // Optional CLI updates are surfaced by doctor or when a missing feature is
347
+ // relevant. Init does not turn them into setup work.
348
+ if (state.id === 'contract')
349
+ return Promise.resolve(false);
350
+ // Naming the project is init's whole reason to touch the filesystem, costs
351
+ // nothing, and is undone by editing one line — so it is done rather than
352
+ // asked about, for a human and an agent alike.
353
+ if (state.id === 'project')
354
+ return Promise.resolve(true);
355
+ const explicit = state.id === 'hooks' ? flags.hooks : state.id === 'skill' ? flags.skills : undefined;
356
+ if (explicit !== undefined)
357
+ return Promise.resolve(explicit);
358
+ // An agent is never asked, and never assumed into a change it did not
359
+ // request: silence means no, and the summary says what was skipped.
360
+ if (deps.io.interactive !== true)
361
+ return Promise.resolve(false);
362
+ const question = state.id === 'hooks'
363
+ ? 'Install harness hooks, so questions reach your devices when you are away?'
364
+ : 'Install/update the agent guidance skill through the native npx skills flow?';
365
+ return deps.io.confirm(question, true);
366
+ }
367
+ /**
368
+ * Setup as one step at a time.
369
+ *
370
+ * The old version ran five steps in a fixed order and ended with a list of
371
+ * everything still outstanding. That is a report, and a report is the wrong
372
+ * output here: someone handed five things to do does none of them, and the
373
+ * order was the script's rather than the dependency graph's — it offered to
374
+ * install hooks after a sign-in that had just failed.
375
+ *
376
+ * So this closes what it can, then surfaces exactly one thing, the first that
377
+ * stands in the way. Re-running advances by one. Idempotence stops being a
378
+ * property to preserve and becomes the mechanism: every decision is derived
379
+ * from observed state, so a partial run, a second project, a fresh worktree
380
+ * and a revoked credential are the same code path arriving at different
381
+ * states rather than four branches to enumerate.
382
+ */
383
+ export async function initCommand(deps, flags) {
384
+ if (flags.skillsScope !== undefined &&
385
+ flags.skillsScope !== 'project' &&
386
+ flags.skillsScope !== 'global') {
387
+ deps.io.err('Invalid skill scope. Choose `project` or `global`.');
388
+ return EXIT.usage;
389
+ }
390
+ if (flags.skillsScope !== undefined && flags.skills !== true) {
391
+ deps.io.err('`--skills-scope` requires `--skills`. Choose project or global in the native installer.');
392
+ return EXIT.usage;
393
+ }
394
+ if (flags.skills === true &&
395
+ deps.io.interactive !== true &&
396
+ flags.skillsScope === undefined) {
397
+ deps.io.err('Unattended skill setup requires an explicit scope: `notifai init --skills --skills-scope project` or `... global`.');
398
+ return EXIT.usage;
399
+ }
400
+ await deps.io.intro?.('Notifai setup');
401
+ const skillOpts = flags.skillsScope === undefined ? {} : { skillScope: flags.skillsScope };
402
+ let readiness = await assessReadiness(deps, skillOpts);
403
+ const reassess = (refresh) => assessReadiness(deps, {
404
+ ...skillOpts,
405
+ ...(refresh === undefined ? {} : { previous: readiness, refresh }),
406
+ });
407
+ let failed = false;
408
+ const attempted = new Set();
409
+ // Re-assess after every successful action. This is how a browser approval or
410
+ // companion registration can unlock the next state while the user is still
411
+ // here, without copying the dependency graph into a second setup script.
412
+ for (;;) {
413
+ let advanced = false;
414
+ let stop = false;
415
+ for (const state of readiness.states) {
416
+ if (state.status === 'ready')
417
+ continue;
418
+ if (state.status === 'unknown') {
419
+ stop = true;
420
+ break;
421
+ }
422
+ const remedy = state.remedy;
423
+ if (remedy === undefined || attempted.has(state.id)) {
424
+ if (state.status === 'gap')
425
+ stop = true;
426
+ if (stop)
427
+ break;
428
+ continue;
429
+ }
430
+ if (state.status === 'optional-gap') {
431
+ if (remedy.by !== 'cli' || !(await wantsOptional(deps, state, flags)))
432
+ continue;
433
+ attempted.add(state.id);
434
+ const result = await closeGap(deps, state, flags);
435
+ if (result === 'failed')
436
+ failed = true;
437
+ if (result === 'failed' && state.status === 'optional-gap') {
438
+ readiness = await reassess(refreshAfterClose(state.id));
439
+ advanced = true;
440
+ break;
441
+ }
442
+ if (result !== 'closed') {
443
+ stop = true;
444
+ break;
445
+ }
446
+ readiness = await reassess(refreshAfterClose(state.id));
447
+ advanced = true;
448
+ break;
449
+ }
450
+ if (remedy.by === 'cli') {
451
+ attempted.add(state.id);
452
+ const result = await closeGap(deps, state, flags);
453
+ if (result === 'failed')
454
+ failed = true;
455
+ if (result !== 'closed') {
456
+ stop = true;
457
+ break;
458
+ }
459
+ readiness = await reassess(refreshAfterClose(state.id));
460
+ advanced = true;
461
+ break;
462
+ }
463
+ // Its to launch, theirs to complete. Running `init` is the consent; announce
464
+ // and open rather than re-asking. An agent never reaches this path.
465
+ if (remedy.by === 'user-here' &&
466
+ remedy.interactive === true &&
467
+ deps.io.interactive === true) {
468
+ attempted.add(state.id);
469
+ deps.io.out('Opening your browser to approve this machine — Ctrl-C to stop.');
470
+ if ((await loginCommand(deps, {})) !== EXIT.ok) {
471
+ failed = true;
472
+ stop = true;
473
+ break;
474
+ }
475
+ readiness = await reassess();
476
+ advanced = true;
477
+ break;
478
+ }
479
+ if (state.id === 'devices' &&
480
+ remedy.by === 'user-elsewhere' &&
481
+ deps.io.interactive === true) {
482
+ attempted.add(state.id);
483
+ const result = await waitForReadyDevice(deps, state);
484
+ if (result === 'failed')
485
+ failed = true;
486
+ if (result !== 'closed') {
487
+ stop = true;
488
+ break;
489
+ }
490
+ readiness = await reassess();
491
+ advanced = true;
492
+ break;
493
+ }
494
+ // A human-only remedy is the first blocker for an unattended agent.
495
+ stop = true;
496
+ break;
497
+ }
498
+ if (stop || !advanced)
499
+ break;
500
+ }
501
+ await printInitClose(deps, readiness, flags);
502
+ const blocker = firstBlocker(readiness);
503
+ if (blocker === null)
504
+ return failed ? EXIT.failed : EXIT.ok;
505
+ return failed || deps.io.interactive !== true ? EXIT.failed : EXIT.ok;
506
+ }
507
+ function isHookSubstate(id) {
508
+ return id === 'hooks' || id.startsWith('hooks-') || id === 'question-routing-settings';
509
+ }
510
+ function leftoverOptionals(readiness, flags) {
511
+ return readiness.states.filter((state) => {
512
+ if (state.status !== 'optional-gap')
513
+ return false;
514
+ if (isHookSubstate(state.id))
515
+ return false;
516
+ if (state.id === 'skill' && flags.skills === false)
517
+ return false;
518
+ return true;
519
+ });
520
+ }
521
+ function printOptionalLeftovers(deps, leftovers) {
522
+ for (const state of leftovers) {
523
+ deps.io.out(`Optional, not set up — ${remedyLine(state)}`);
524
+ }
525
+ }
526
+ function questionsWillRoute(readiness) {
527
+ const hooks = readiness.states.find((state) => state.id === 'hooks');
528
+ const settings = readiness.states.find((state) => state.id === 'question-routing-settings');
529
+ return hooks?.status === 'ready' && settings?.status !== 'gap';
530
+ }
531
+ async function printInitClose(deps, readiness, flags) {
532
+ const blocker = firstBlocker(readiness);
533
+ const canSend = readiness.states.find((state) => state.id === 'devices')?.status === 'ready';
534
+ const questions = questionsWillRoute(readiness);
535
+ const leftovers = leftoverOptionals(readiness, flags).filter((state) => state.id !== 'contract');
536
+ if (blocker?.id === 'contract') {
537
+ deps.io.out(blocker.detail);
538
+ deps.io.out(UPDATE_CLI_COMMAND);
539
+ await deps.io.outro?.('Update Notifai, then run init again');
540
+ return;
541
+ }
542
+ if (deps.io.interactive === true) {
543
+ if (blocker === null) {
544
+ const lines = [
545
+ canSend ? 'You can send notifications.' : 'You are signed in.',
546
+ questions
547
+ ? 'Questions will reach your devices.'
548
+ : 'Questions stay in the terminal until hooks are installed.',
549
+ ];
550
+ await deps.io.note?.(lines.join('\n'), 'Ready');
551
+ printOptionalLeftovers(deps, leftovers);
552
+ deps.io.out(questions
553
+ ? 'All set. Agents in this project can notify you and ask you questions.'
554
+ : 'All set. Agents in this project can notify you. Questions stay in the terminal until hooks are installed.');
555
+ await deps.io.outro?.('All set ✨');
556
+ return;
557
+ }
558
+ await deps.io.note?.(`${blocker.title} — ${blocker.detail}\n${remedyLine(blocker)}`, 'Next');
559
+ deps.io.out(`Next: ${blocker.title} — ${blocker.detail}`);
560
+ deps.io.out(` ${remedyLine(blocker)}`);
561
+ if (blocker.remedy?.by === 'user-elsewhere' || blocker.remedy?.by === 'user-here') {
562
+ deps.io.out(' Then re-run `notifai init` and it will pick up from here.');
563
+ }
564
+ await deps.io.outro?.('One step remains (above)');
565
+ return;
566
+ }
567
+ if (blocker === null) {
568
+ printOptionalLeftovers(deps, leftovers);
569
+ deps.io.out(questions
570
+ ? 'All set. Agents in this project can notify you and ask you questions.'
571
+ : 'All set. Agents in this project can notify you. Questions stay in the terminal until hooks are installed.');
572
+ return;
573
+ }
574
+ deps.io.out(`Next: ${blocker.title} — ${blocker.detail}`);
575
+ deps.io.out(` ${remedyLine(blocker)}`);
576
+ if (blocker.remedy?.by === 'user-elsewhere' || blocker.remedy?.by === 'user-here') {
577
+ deps.io.out(' Then re-run `notifai init` and it will pick up from here.');
578
+ }
579
+ }
580
+ //# sourceMappingURL=commands-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands-init.js","sourceRoot":"","sources":["../src/commands-init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { CommandIo } from './commands-core.js';
2
+ export declare function realIo(env?: NodeJS.ProcessEnv): CommandIo;