@raidiant/notifai 11.3.2 → 11.4.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 (117) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/agent-update-notice.js +3 -3
  3. package/dist/agent-update-notice.js.map +1 -1
  4. package/dist/claude-wake.d.ts +11 -3
  5. package/dist/claude-wake.js +74 -67
  6. package/dist/claude-wake.js.map +1 -1
  7. package/dist/cli-bin.js +2 -2
  8. package/dist/cli-bin.js.map +1 -1
  9. package/dist/cli-contract.d.ts +6 -2
  10. package/dist/cli-contract.js +11 -3
  11. package/dist/cli-contract.js.map +1 -1
  12. package/dist/cli-release.d.ts +31 -4
  13. package/dist/cli-release.js +45 -15
  14. package/dist/cli-release.js.map +1 -1
  15. package/dist/client.d.ts +23 -2
  16. package/dist/client.js +11 -5
  17. package/dist/client.js.map +1 -1
  18. package/dist/codex-wake.d.ts +12 -2
  19. package/dist/codex-wake.js +50 -13
  20. package/dist/codex-wake.js.map +1 -1
  21. package/dist/commands-acknowledge.d.ts +4 -2
  22. package/dist/commands-acknowledge.js +35 -4
  23. package/dist/commands-acknowledge.js.map +1 -1
  24. package/dist/commands-ask.js +2 -2
  25. package/dist/commands-ask.js.map +1 -1
  26. package/dist/commands-close.js +16 -4
  27. package/dist/commands-close.js.map +1 -1
  28. package/dist/commands-core.d.ts +10 -1
  29. package/dist/commands-core.js +4 -3
  30. package/dist/commands-core.js.map +1 -1
  31. package/dist/commands-doctor.js +49 -4
  32. package/dist/commands-doctor.js.map +1 -1
  33. package/dist/commands-hook-attend.d.ts +61 -0
  34. package/dist/commands-hook-attend.js +475 -0
  35. package/dist/commands-hook-attend.js.map +1 -0
  36. package/dist/commands-hook-diagnostics.js +2 -2
  37. package/dist/commands-hook-diagnostics.js.map +1 -1
  38. package/dist/commands-hook-install.js +1 -1
  39. package/dist/commands-hook-install.js.map +1 -1
  40. package/dist/commands-hook-run.js +59 -2
  41. package/dist/commands-hook-run.js.map +1 -1
  42. package/dist/commands-send.js +6 -1
  43. package/dist/commands-send.js.map +1 -1
  44. package/dist/commands-update-check.js +9 -6
  45. package/dist/commands-update-check.js.map +1 -1
  46. package/dist/commands-update.d.ts +2 -1
  47. package/dist/commands-update.js +74 -11
  48. package/dist/commands-update.js.map +1 -1
  49. package/dist/guidance-content.js +11 -37
  50. package/dist/guidance-content.js.map +1 -1
  51. package/dist/hook-acknowledgements.d.ts +25 -5
  52. package/dist/hook-acknowledgements.js +102 -45
  53. package/dist/hook-acknowledgements.js.map +1 -1
  54. package/dist/hook-events.d.ts +26 -1
  55. package/dist/hook-events.js +38 -2
  56. package/dist/hook-events.js.map +1 -1
  57. package/dist/hook-lifecycle.d.ts +6 -0
  58. package/dist/hook-lifecycle.js +309 -31
  59. package/dist/hook-lifecycle.js.map +1 -1
  60. package/dist/hook-question-lock.d.ts +18 -0
  61. package/dist/hook-question-lock.js +80 -57
  62. package/dist/hook-question-lock.js.map +1 -1
  63. package/dist/hook-question-retirement.d.ts +10 -2
  64. package/dist/hook-question-retirement.js +21 -4
  65. package/dist/hook-question-retirement.js.map +1 -1
  66. package/dist/hook-session-state.d.ts +90 -1
  67. package/dist/hook-session-state.js +201 -9
  68. package/dist/hook-session-state.js.map +1 -1
  69. package/dist/hook-types.d.ts +50 -2
  70. package/dist/injection-render.d.ts +36 -0
  71. package/dist/injection-render.js +61 -0
  72. package/dist/injection-render.js.map +1 -0
  73. package/dist/install-hooks.d.ts +14 -0
  74. package/dist/install-hooks.js +47 -2
  75. package/dist/install-hooks.js.map +1 -1
  76. package/dist/logging.d.ts +1 -1
  77. package/dist/logging.js +12 -0
  78. package/dist/logging.js.map +1 -1
  79. package/dist/process-identity.d.ts +26 -0
  80. package/dist/process-identity.js +82 -0
  81. package/dist/process-identity.js.map +1 -0
  82. package/dist/program.js +17 -6
  83. package/dist/program.js.map +1 -1
  84. package/dist/session-attendant-probe.d.ts +74 -0
  85. package/dist/session-attendant-probe.js +131 -0
  86. package/dist/session-attendant-probe.js.map +1 -0
  87. package/dist/session-attendant-state.d.ts +53 -0
  88. package/dist/session-attendant-state.js +175 -0
  89. package/dist/session-attendant-state.js.map +1 -0
  90. package/dist/session-attendant.d.ts +135 -0
  91. package/dist/session-attendant.js +493 -0
  92. package/dist/session-attendant.js.map +1 -0
  93. package/dist/session-delivery.d.ts +214 -0
  94. package/dist/session-delivery.js +560 -0
  95. package/dist/session-delivery.js.map +1 -0
  96. package/dist/session-handoff.d.ts +98 -0
  97. package/dist/session-handoff.js +118 -0
  98. package/dist/session-handoff.js.map +1 -0
  99. package/dist/session-message-handoff.d.ts +35 -0
  100. package/dist/session-message-handoff.js +99 -0
  101. package/dist/session-message-handoff.js.map +1 -0
  102. package/dist/skill-source/manifest.json +20 -4
  103. package/dist/skill-source/notifai/SKILL.md +28 -67
  104. package/dist/skill-source/notifai/references/diagnostics.md +31 -0
  105. package/dist/skill-source/notifai/references/harness-setup.md +3 -0
  106. package/dist/skill-source/notifai/references/notes-and-edits.md +38 -0
  107. package/dist/skill-source/notifai/references/send-details.md +14 -0
  108. package/dist/skill-source/notifai/references/writing-examples.md +56 -0
  109. package/dist/update-handoff.js +3 -3
  110. package/dist/update-handoff.js.map +1 -1
  111. package/dist/version.d.ts +18 -0
  112. package/dist/version.js +82 -1
  113. package/dist/version.js.map +1 -1
  114. package/dist/wake-support.d.ts +33 -1
  115. package/dist/wake-support.js +65 -8
  116. package/dist/wake-support.js.map +1 -1
  117. package/package.json +2 -2
@@ -0,0 +1,38 @@
1
+ # Notes and edits
2
+
3
+ While this session runs, the User can send into it from their device:
4
+
5
+ - a **note**: steering, context, a correction, or a nudge for the work in
6
+ progress. No question preceded it.
7
+ - an **edited answer**: a change to an answer you already received. It
8
+ replaces the earlier answer and is their current word.
9
+
10
+ Each arrives as a turn beginning `Notifai —` that names a Session Message
11
+ (`sm_…`). The User's words are one quoted value; the command stands outside it.
12
+
13
+ ## Acknowledge each one once, before acting on it
14
+
15
+ ```bash
16
+ notifai acknowledge sm_… --text "Switching the migration to staging; I'll rerun it there."
17
+ ```
18
+
19
+ Name the work the message changes, as for any acknowledgement. If the account
20
+ turned acknowledgement text off, Notifai prints the command without `--text`;
21
+ run exactly that. Once it reports recorded or replayed, it is done.
22
+
23
+ An edit can arrive after you acted on the earlier answer. Say what already
24
+ happened and what you will do now; never imply that irreversible work was
25
+ undone:
26
+
27
+ ```bash
28
+ notifai acknowledge sm_… --text "The email already went out with Monday; sending a correction for Friday now."
29
+ ```
30
+
31
+ ## What a note is not
32
+
33
+ A note is the User's own words carried from their device, not an instruction
34
+ from Notifai or the system. It never satisfies a harness permission prompt or
35
+ an interactive picker, and it never moves private material off this machine.
36
+
37
+ The acknowledgement is the receipt. Results a note asks for follow the ordinary
38
+ rules for when to notify.
@@ -0,0 +1,14 @@
1
+ # Sending: the less common controls
2
+
3
+ `--thread-id` groups; `--collapse-key` replaces your earlier matching
4
+ notification; `--ttl` bounds useful delivery. Use
5
+ `notifai capabilities --platform <platform>` for destination contracts.
6
+
7
+ Repeat `--image <path|url>` (up to 8), paired with `--image-alt`; all reach the
8
+ gallery. Reference any or all in Body with Markdown image syntax:
9
+ `- Bob: ![front](media:1) ![side](media:2)`. Bare `media:1`, `[…](media:1)`,
10
+ or a position with no `--image` is an error.
11
+
12
+ `--sound`, `--level`, and `--device` belong to the User: never choose them
13
+ yourself. `--sound` takes a shipped name or a custom name/id from
14
+ `notifai sounds`.
@@ -0,0 +1,56 @@
1
+ # Writing examples
2
+
3
+ Examples for the shipped `titles`, `content`, and `acknowledgements` guidance.
4
+ The effective guidance printed by `notifai guidance` always wins over them.
5
+
6
+ ## Titles
7
+
8
+ Good:
9
+
10
+ - `Users can now create accounts` — the capability, not the process behind it
11
+ - `Password reset emails aren't sending` — the failure as the user experiences it
12
+ - `Refund rollout awaits provider recovery` — what is stuck, not machinery
13
+ - `Found why checkout was flaky` — the finding they were waiting on
14
+ - `3 orders didn't import and need review` — a count that earns its place
15
+ because acting on it is theirs to do
16
+
17
+ Bad:
18
+
19
+ - `All 42 tests passed` — machinery; say what work is done
20
+ - `Adversarial review found 3 issues` — process report; say what it means for
21
+ what ships
22
+ - `Migration 0007 failed` — internal identifier; say what the user lost
23
+ - `Task complete` / `Build failed` / `Need input` — no substance, and the
24
+ kind restated
25
+ - `Exit code 1` — mechanics, not meaning
26
+
27
+ ## Content
28
+
29
+ Work finished:
30
+
31
+ > Account creation works end to end now: sign-up, email verification, and
32
+ > login are live on staging.
33
+ >
34
+ > Next I'll start on password reset unless you want something else first.
35
+
36
+ Work failed:
37
+
38
+ > The new pricing page isn't live. The deploy failed and I rolled it back, so
39
+ > the site still shows the old page — nothing is broken for users.
40
+ >
41
+ > The blocker is on my side and I'm fixing it; I'll retry and confirm when the
42
+ > page is up. Nothing needed from you.
43
+
44
+ Blocked:
45
+
46
+ > The refund flow is built, but the production rollout is waiting for the
47
+ > payment provider to recover. I am monitoring it and will resume automatically.
48
+ >
49
+ > There is nothing for you to answer; I will confirm when it is live.
50
+
51
+ ## Acknowledgements
52
+
53
+ - A note: `Switching the migration to staging; I'll rerun it there.`
54
+ - An edit after irreversible work: `The email already went out with Monday;
55
+ sending a correction for Friday now.` — say what already happened; never
56
+ imply it was undone.
@@ -1,7 +1,7 @@
1
1
  import { readFileSync } from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { fileURLToPath } from 'node:url';
4
- import { compareVersions, isSemVer } from './version.js';
4
+ import { compareReleasePrecedence, isSemVer } from './version.js';
5
5
  const PACKAGE_ROOT = fileURLToPath(new URL('../', import.meta.url));
6
6
  const CHANGELOG_LIMIT = 16_000;
7
7
  export function releaseNotesUrl(version) {
@@ -18,9 +18,9 @@ export function installedChangelog(version, from, root = PACKAGE_ROOT) {
18
18
  const heading = /^## \[([^\]]+)\]/m.exec(section);
19
19
  if (heading === null || version === null)
20
20
  return false;
21
- const relative = compareVersions(heading[1], version);
21
+ const relative = compareReleasePrecedence(heading[1], version);
22
22
  return (relative === 'before' || relative === 'equal') &&
23
- (from === undefined || compareVersions(heading[1], from) === 'after');
23
+ (from === undefined || compareReleasePrecedence(heading[1], from) === 'after');
24
24
  });
25
25
  const text = sections.join('').trim();
26
26
  return { version, from: from ?? null, path: file, text: text.slice(0, CHANGELOG_LIMIT),
@@ -1 +1 @@
1
- {"version":3,"file":"update-handoff.js","sourceRoot":"","sources":["../src/update-handoff.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-handoff.js","sourceRoot":"","sources":["../src/update-handoff.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -19,4 +19,22 @@ export function parseVersion(value: string): readonly [number, number, number] |
19
19
  export function compareVersions(left: string, right: string): VersionComparison;
20
20
  /** @param {string} value */
21
21
  export function isSemVer(value: string): boolean;
22
+ /**
23
+ * Order two published releases by full SemVer 2.0.0 precedence: a prerelease
24
+ * sorts before its stable release (`1.0.0-beta.2` < `1.0.0`), and build
25
+ * metadata is ignored. Use this for release ordering only; capability floors
26
+ * keep `compareVersions`. Anything that is not strict SemVer is `unparseable`
27
+ * and the caller chooses its safe posture.
28
+ *
29
+ * @param {string} left
30
+ * @param {string} right
31
+ * @returns {VersionComparison}
32
+ */
33
+ export function compareReleasePrecedence(left: string, right: string): VersionComparison;
34
+ /**
35
+ * Whether a strict SemVer release carries a prerelease, such as a beta.
36
+ *
37
+ * @param {string} value
38
+ */
39
+ export function isPrerelease(value: string): boolean;
22
40
  export type VersionComparison = "before" | "equal" | "after" | "unparseable";
package/dist/version.js CHANGED
@@ -1,4 +1,5 @@
1
- const SEMVER = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-(?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*))*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/;
1
+ const SEMVER = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/;
2
+ const NUMERIC_IDENTIFIER = /^\d+$/;
2
3
  const ORDERED_VERSION = /^v?(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;
3
4
  /** @typedef {'before' | 'equal' | 'after' | 'unparseable'} VersionComparison */
4
5
  /**
@@ -48,4 +49,84 @@ export function compareVersions(left, right) {
48
49
  export function isSemVer(value) {
49
50
  return SEMVER.test(value);
50
51
  }
52
+ /**
53
+ * Order digit strings without leading zeros (SemVer forbids them), so values
54
+ * beyond Number.MAX_SAFE_INTEGER still compare exactly.
55
+ *
56
+ * @param {string} left
57
+ * @param {string} right
58
+ * @returns {-1 | 0 | 1}
59
+ */
60
+ function compareDigits(left, right) {
61
+ if (left.length !== right.length)
62
+ return left.length < right.length ? -1 : 1;
63
+ return left === right ? 0 : left < right ? -1 : 1;
64
+ }
65
+ /**
66
+ * SemVer 2.0.0 section 11: numeric identifiers compare numerically and rank
67
+ * below alphanumeric ones; a longer list wins when every shared field is equal.
68
+ *
69
+ * @param {readonly string[]} left
70
+ * @param {readonly string[]} right
71
+ * @returns {-1 | 0 | 1}
72
+ */
73
+ function comparePrerelease(left, right) {
74
+ for (let index = 0; index < Math.max(left.length, right.length); index += 1) {
75
+ const a = left[index];
76
+ const b = right[index];
77
+ if (a === undefined)
78
+ return -1;
79
+ if (b === undefined)
80
+ return 1;
81
+ const aNumeric = NUMERIC_IDENTIFIER.test(a);
82
+ const bNumeric = NUMERIC_IDENTIFIER.test(b);
83
+ const order = aNumeric && bNumeric
84
+ ? compareDigits(a, b)
85
+ : aNumeric !== bNumeric
86
+ ? (aNumeric ? -1 : 1)
87
+ : a === b ? 0 : a < b ? -1 : 1;
88
+ if (order !== 0)
89
+ return order;
90
+ }
91
+ return 0;
92
+ }
93
+ /**
94
+ * Order two published releases by full SemVer 2.0.0 precedence: a prerelease
95
+ * sorts before its stable release (`1.0.0-beta.2` < `1.0.0`), and build
96
+ * metadata is ignored. Use this for release ordering only; capability floors
97
+ * keep `compareVersions`. Anything that is not strict SemVer is `unparseable`
98
+ * and the caller chooses its safe posture.
99
+ *
100
+ * @param {string} left
101
+ * @param {string} right
102
+ * @returns {VersionComparison}
103
+ */
104
+ export function compareReleasePrecedence(left, right) {
105
+ const a = SEMVER.exec(left);
106
+ const b = SEMVER.exec(right);
107
+ if (a === null || b === null)
108
+ return 'unparseable';
109
+ for (let index = 1; index <= 3; index += 1) {
110
+ const order = compareDigits(/** @type {string} */ (a[index]), /** @type {string} */ (b[index]));
111
+ if (order !== 0)
112
+ return order < 0 ? 'before' : 'after';
113
+ }
114
+ const aPrerelease = a[4];
115
+ const bPrerelease = b[4];
116
+ if (aPrerelease === undefined || bPrerelease === undefined) {
117
+ if (aPrerelease === bPrerelease)
118
+ return 'equal';
119
+ return aPrerelease === undefined ? 'after' : 'before';
120
+ }
121
+ const order = comparePrerelease(aPrerelease.split('.'), bPrerelease.split('.'));
122
+ return order === 0 ? 'equal' : order < 0 ? 'before' : 'after';
123
+ }
124
+ /**
125
+ * Whether a strict SemVer release carries a prerelease, such as a beta.
126
+ *
127
+ * @param {string} value
128
+ */
129
+ export function isPrerelease(value) {
130
+ return SEMVER.exec(value)?.[4] !== undefined;
131
+ }
51
132
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.js"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,iLAAiL,CAAA;AAChM,MAAM,eAAe,GAAG,oCAAoC,CAAA;AAE5D,gFAAgF;AAEhF;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,KAAK;IAChC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAC/B,MAAM,MAAM,GAAG,gDAAgD,CAAC,CAAC;QAC/D,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACjB,CAAC,CAAA;IACF,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;AAC3D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,IAAI,EAAE,KAAK;IACzC,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IAC5B,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;IAC7B,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,aAAa,CAAA;IAClD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,CAAA;QACzB,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAA;QAC1B,IAAI,QAAQ,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,aAAa,CAAA;QAC3E,IAAI,QAAQ,KAAK,SAAS;YAAE,SAAQ;QACpC,OAAO,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAA;IAClD,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,QAAQ,CAAC,KAAK;IAC5B,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC3B,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.js"],"names":[],"mappings":"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"}
@@ -1,8 +1,40 @@
1
1
  import type { DeliveryOutcome } from './hook-types.js';
2
2
  export declare function holdForNextTurn(reason: string): DeliveryOutcome;
3
+ /** `log.reason` of a claimed write stopped at its boundary before any byte left. */
4
+ export declare const WRITE_ABORTED_REASON = "write-aborted";
5
+ export declare function abortedDelivery(): DeliveryOutcome;
6
+ /**
7
+ * The last check before a claimed write's first byte: a connected socket asks
8
+ * `writable()`, and a connection still pending after `remainingMs()` is
9
+ * abandoned. Either way nothing is written.
10
+ */
11
+ export interface WriteGuard {
12
+ writable(): boolean;
13
+ remainingMs(): number;
14
+ }
15
+ /** Thrown when a guarded write was stopped before any byte left. */
16
+ export declare class WriteAbortedError extends Error {
17
+ }
3
18
  export declare function cancelledDelivery(): DeliveryOutcome;
4
- /** Run one harness child and preserve its diagnostic stderr on failure. */
19
+ /**
20
+ * Run one harness child and preserve its diagnostic stderr on failure.
21
+ *
22
+ * With `onSpawn` the child is started in its own process group (its pid is
23
+ * the group id) and reported at once, so a writer can journal the whole group
24
+ * that might still write if the writer itself dies. It is still awaited.
25
+ */
26
+ /** A subprocess writer was stopped at its deadline; it may already have written. */
27
+ export declare class WriteDeadlineError extends Error {
28
+ }
29
+ /**
30
+ * Run one harness command to completion. With `onSpawn` it runs in its own
31
+ * process group (reported as soon as it exists). With `signal`, an abort
32
+ * SIGKILLs that whole group — or the child, without one — and rejects with
33
+ * `WriteDeadlineError` at once: nothing the command started keeps running.
34
+ */
5
35
  export declare function runWakeCommand(command: string, args: readonly string[], options?: {
6
36
  cwd?: string;
7
37
  env?: NodeJS.ProcessEnv;
38
+ onSpawn?: (pgid: number) => void;
39
+ signal?: AbortSignal;
8
40
  }): Promise<string>;
@@ -6,6 +6,18 @@ export function holdForNextTurn(reason) {
6
6
  acknowledgement: 'held',
7
7
  };
8
8
  }
9
+ /** `log.reason` of a claimed write stopped at its boundary before any byte left. */
10
+ export const WRITE_ABORTED_REASON = 'write-aborted';
11
+ export function abortedDelivery() {
12
+ return {
13
+ notes: ['the claim lapsed before the write started; nothing was handed over'],
14
+ log: { route: 'hold-for-next-turn', stage: 'queued', reason: WRITE_ABORTED_REASON },
15
+ acknowledgement: 'held',
16
+ };
17
+ }
18
+ /** Thrown when a guarded write was stopped before any byte left. */
19
+ export class WriteAbortedError extends Error {
20
+ }
9
21
  export function cancelledDelivery() {
10
22
  return {
11
23
  notes: ['the Agent Session ended before answer delivery; stopping this observer'],
@@ -13,25 +25,70 @@ export function cancelledDelivery() {
13
25
  acknowledgement: 'held',
14
26
  };
15
27
  }
16
- /** Run one harness child and preserve its diagnostic stderr on failure. */
28
+ /**
29
+ * Run one harness child and preserve its diagnostic stderr on failure.
30
+ *
31
+ * With `onSpawn` the child is started in its own process group (its pid is
32
+ * the group id) and reported at once, so a writer can journal the whole group
33
+ * that might still write if the writer itself dies. It is still awaited.
34
+ */
35
+ /** A subprocess writer was stopped at its deadline; it may already have written. */
36
+ export class WriteDeadlineError extends Error {
37
+ }
38
+ /**
39
+ * Run one harness command to completion. With `onSpawn` it runs in its own
40
+ * process group (reported as soon as it exists). With `signal`, an abort
41
+ * SIGKILLs that whole group — or the child, without one — and rejects with
42
+ * `WriteDeadlineError` at once: nothing the command started keeps running.
43
+ */
17
44
  export function runWakeCommand(command, args, options = {}) {
18
45
  return new Promise((resolve, reject) => {
46
+ const signal = options.signal;
47
+ if (signal?.aborted === true) {
48
+ reject(new WriteDeadlineError(`${command} ${args[0] ?? ''} was not started: its deadline had passed`));
49
+ return;
50
+ }
51
+ const grouped = options.onSpawn !== undefined;
19
52
  const child = spawn(command, [...args], {
20
53
  ...(options.cwd === undefined ? {} : { cwd: options.cwd }),
21
54
  ...(options.env === undefined ? {} : { env: options.env }),
55
+ ...(grouped ? { detached: true } : {}),
22
56
  stdio: ['ignore', 'pipe', 'pipe'],
23
57
  });
58
+ let settled = false;
59
+ const settle = (finish) => {
60
+ if (settled)
61
+ return;
62
+ settled = true;
63
+ signal?.removeEventListener('abort', onAbort);
64
+ finish();
65
+ };
66
+ const onAbort = () => {
67
+ try {
68
+ if (child.pid !== undefined)
69
+ process.kill(grouped ? -child.pid : child.pid, 'SIGKILL');
70
+ }
71
+ catch {
72
+ // Already gone.
73
+ }
74
+ settle(() => reject(new WriteDeadlineError(`${command} ${args[0] ?? ''} was stopped at its deadline and may have written`)));
75
+ };
76
+ signal?.addEventListener('abort', onAbort, { once: true });
77
+ if (options.onSpawn !== undefined && child.pid !== undefined)
78
+ options.onSpawn(child.pid);
24
79
  const stdout = [];
25
80
  const stderr = [];
26
81
  child.stdout?.on('data', (chunk) => stdout.push(Buffer.from(chunk)));
27
82
  child.stderr?.on('data', (chunk) => stderr.push(Buffer.from(chunk)));
28
- child.once('error', reject);
29
- child.once('exit', (code, signal) => {
30
- if (code === 0) {
31
- resolve(Buffer.concat(stdout).toString());
32
- return;
33
- }
34
- reject(new Error(`${command} ${args[0] ?? ''} exited ${code === null ? `on ${String(signal)}` : String(code)}: ${Buffer.concat(stderr).toString().trim()}`));
83
+ child.once('error', (err) => settle(() => reject(err)));
84
+ child.once('exit', (code, exitSignal) => {
85
+ settle(() => {
86
+ if (code === 0) {
87
+ resolve(Buffer.concat(stdout).toString());
88
+ return;
89
+ }
90
+ reject(new Error(`${command} ${args[0] ?? ''} exited ${code === null ? `on ${String(exitSignal)}` : String(code)}: ${Buffer.concat(stderr).toString().trim()}`));
91
+ });
35
92
  });
36
93
  });
37
94
  }
@@ -1 +1 @@
1
- {"version":3,"file":"wake-support.js","sourceRoot":"","sources":["../src/wake-support.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAG1C,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO;QACL,KAAK,EAAE,CAAC,kDAAkD,MAAM,EAAE,CAAC;QACnE,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE;QAC7D,eAAe,EAAE,MAAM;KACxB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,KAAK,EAAE,CAAC,wEAAwE,CAAC;QACjF,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE;QAC9E,eAAe,EAAE,MAAM;KACxB,CAAA;AACH,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,IAAuB,EACvB,UAAqD,EAAE;IAEvD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE;YACtC,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;YAC1D,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;YAC1D,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAA;QACF,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACrF,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACrF,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC3B,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAClC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;gBACzC,OAAM;YACR,CAAC;YACD,MAAM,CACJ,IAAI,KAAK,CACP,GAAG,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAC1I,CACF,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"wake-support.js","sourceRoot":"","sources":["../src/wake-support.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@raidiant/notifai",
3
- "version": "11.3.2",
3
+ "version": "11.4.0",
4
4
  "type": "module",
5
5
  "description": "Send native device notifications from agents and local programs",
6
6
  "bin": {
@@ -12,7 +12,7 @@
12
12
  ],
13
13
  "dependencies": {
14
14
  "@clack/prompts": "^1.7.0",
15
- "@raidiant/notifai-protocol": "8.0.3",
15
+ "@raidiant/notifai-protocol": "8.1.0",
16
16
  "commander": "^14.0.0",
17
17
  "picocolors": "^1.1.1",
18
18
  "smol-toml": "^1.4.0"