@raidiant/notifai 10.1.7 → 11.0.2

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 (154) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +23 -13
  3. package/dist/claude-wake.d.ts +1 -2
  4. package/dist/claude-wake.js +15 -61
  5. package/dist/claude-wake.js.map +1 -1
  6. package/dist/cli-bin.js +3 -14
  7. package/dist/cli-bin.js.map +1 -1
  8. package/dist/cli-contract.d.ts +12 -0
  9. package/dist/cli-contract.js +19 -0
  10. package/dist/cli-contract.js.map +1 -0
  11. package/dist/cli-release.d.ts +0 -1
  12. package/dist/cli-release.js +5 -21
  13. package/dist/cli-release.js.map +1 -1
  14. package/dist/client.d.ts +2 -2
  15. package/dist/codex-wake.d.ts +1 -1
  16. package/dist/codex-wake.js +8 -36
  17. package/dist/codex-wake.js.map +1 -1
  18. package/dist/command-session.js +2 -1
  19. package/dist/command-session.js.map +1 -1
  20. package/dist/commands-acknowledge.d.ts +13 -0
  21. package/dist/commands-acknowledge.js +67 -0
  22. package/dist/commands-acknowledge.js.map +1 -0
  23. package/dist/commands-ask.d.ts +63 -0
  24. package/dist/commands-ask.js +407 -0
  25. package/dist/commands-ask.js.map +1 -0
  26. package/dist/commands-close.d.ts +6 -0
  27. package/dist/commands-close.js +197 -0
  28. package/dist/commands-close.js.map +1 -0
  29. package/dist/commands-config.js +2 -2
  30. package/dist/commands-config.js.map +1 -1
  31. package/dist/commands-core.js +2 -2
  32. package/dist/commands-core.js.map +1 -1
  33. package/dist/commands-doctor.js +61 -120
  34. package/dist/commands-doctor.js.map +1 -1
  35. package/dist/commands-harness-context.d.ts +0 -1
  36. package/dist/commands-harness-context.js +2 -4
  37. package/dist/commands-harness-context.js.map +1 -1
  38. package/dist/commands-hook-diagnostics.d.ts +27 -0
  39. package/dist/commands-hook-diagnostics.js +97 -0
  40. package/dist/commands-hook-diagnostics.js.map +1 -0
  41. package/dist/commands-hook-install.d.ts +26 -0
  42. package/dist/commands-hook-install.js +551 -0
  43. package/dist/commands-hook-install.js.map +1 -0
  44. package/dist/commands-hook-run.d.ts +29 -0
  45. package/dist/commands-hook-run.js +517 -0
  46. package/dist/commands-hook-run.js.map +1 -0
  47. package/dist/commands-init.d.ts +2 -7
  48. package/dist/commands-init.js +59 -92
  49. package/dist/commands-init.js.map +1 -1
  50. package/dist/commands-send.js +35 -3
  51. package/dist/commands-send.js.map +1 -1
  52. package/dist/commands-skill.js +5 -5
  53. package/dist/commands-skill.js.map +1 -1
  54. package/dist/commands-update.js +17 -31
  55. package/dist/commands-update.js.map +1 -1
  56. package/dist/commands.d.ts +11 -6
  57. package/dist/commands.js +9 -4
  58. package/dist/commands.js.map +1 -1
  59. package/dist/config.d.ts +14 -4
  60. package/dist/config.js +35 -9
  61. package/dist/config.js.map +1 -1
  62. package/dist/file-lock.d.ts +3 -0
  63. package/dist/file-lock.js +33 -17
  64. package/dist/file-lock.js.map +1 -1
  65. package/dist/guidance-content.js +30 -15
  66. package/dist/guidance-content.js.map +1 -1
  67. package/dist/hook-acknowledgements.d.ts +42 -0
  68. package/dist/hook-acknowledgements.js +316 -0
  69. package/dist/hook-acknowledgements.js.map +1 -0
  70. package/dist/hook-events.d.ts +6 -0
  71. package/dist/hook-events.js +22 -0
  72. package/dist/hook-events.js.map +1 -0
  73. package/dist/hook-gates.d.ts +7 -0
  74. package/dist/hook-gates.js +21 -0
  75. package/dist/hook-gates.js.map +1 -0
  76. package/dist/hook-lifecycle.d.ts +93 -0
  77. package/dist/{hooks.js → hook-lifecycle.js} +61 -1359
  78. package/dist/hook-lifecycle.js.map +1 -0
  79. package/dist/hook-project-sessions.d.ts +28 -0
  80. package/dist/hook-project-sessions.js +141 -0
  81. package/dist/hook-project-sessions.js.map +1 -0
  82. package/dist/hook-question-lock.d.ts +7 -0
  83. package/dist/hook-question-lock.js +173 -0
  84. package/dist/hook-question-lock.js.map +1 -0
  85. package/dist/hook-question-retirement.d.ts +57 -0
  86. package/dist/hook-question-retirement.js +261 -0
  87. package/dist/hook-question-retirement.js.map +1 -0
  88. package/dist/hook-question-state.d.ts +45 -0
  89. package/dist/hook-question-state.js +196 -0
  90. package/dist/hook-question-state.js.map +1 -0
  91. package/dist/hook-session-state.d.ts +31 -0
  92. package/dist/hook-session-state.js +249 -0
  93. package/dist/hook-session-state.js.map +1 -0
  94. package/dist/{hooks.d.ts → hook-types.d.ts} +17 -236
  95. package/dist/hook-types.js +4 -0
  96. package/dist/hook-types.js.map +1 -0
  97. package/dist/install-hooks.d.ts +75 -60
  98. package/dist/install-hooks.js +299 -209
  99. package/dist/install-hooks.js.map +1 -1
  100. package/dist/interactive.d.ts +3 -16
  101. package/dist/interactive.js +19 -95
  102. package/dist/interactive.js.map +1 -1
  103. package/dist/local-path.d.ts +7 -0
  104. package/dist/local-path.js +27 -0
  105. package/dist/local-path.js.map +1 -0
  106. package/dist/node-floor.js +3 -10
  107. package/dist/node-floor.js.map +1 -1
  108. package/dist/npm-invocation.d.ts +34 -0
  109. package/dist/npm-invocation.js +53 -0
  110. package/dist/npm-invocation.js.map +1 -0
  111. package/dist/openclaw-plugin.d.ts +12 -3
  112. package/dist/openclaw-plugin.js +42 -16
  113. package/dist/openclaw-plugin.js.map +1 -1
  114. package/dist/opencode-plugin.d.ts +2 -2
  115. package/dist/opencode-plugin.js +4 -6
  116. package/dist/opencode-plugin.js.map +1 -1
  117. package/dist/program.js +11 -13
  118. package/dist/program.js.map +1 -1
  119. package/dist/project-enablement.d.ts +6 -0
  120. package/dist/project-enablement.js +11 -27
  121. package/dist/project-enablement.js.map +1 -1
  122. package/dist/question-settlement-process.d.ts +1 -1
  123. package/dist/readiness.d.ts +0 -2
  124. package/dist/readiness.js +0 -4
  125. package/dist/readiness.js.map +1 -1
  126. package/dist/send.d.ts +8 -4
  127. package/dist/send.js +145 -26
  128. package/dist/send.js.map +1 -1
  129. package/dist/session-activation.d.ts +3 -1
  130. package/dist/session-activation.js +16 -0
  131. package/dist/session-activation.js.map +1 -1
  132. package/dist/skill-source/manifest.json +4 -4
  133. package/dist/skill-source/notifai/SKILL.md +60 -60
  134. package/dist/skill-source/notifai/references/harness-setup.md +42 -16
  135. package/dist/ui/config-view.d.ts +0 -2
  136. package/dist/ui/config-view.js +1 -5
  137. package/dist/ui/config-view.js.map +1 -1
  138. package/dist/ui/theme.d.ts +0 -3
  139. package/dist/ui/theme.js +0 -1
  140. package/dist/ui/theme.js.map +1 -1
  141. package/dist/version.d.ts +22 -0
  142. package/dist/version.js +51 -0
  143. package/dist/version.js.map +1 -0
  144. package/dist/wake-support.d.ts +8 -0
  145. package/dist/wake-support.js +38 -0
  146. package/dist/wake-support.js.map +1 -0
  147. package/package.json +2 -2
  148. package/dist/cli-update-contract.d.ts +0 -7
  149. package/dist/cli-update-contract.js +0 -10
  150. package/dist/cli-update-contract.js.map +0 -1
  151. package/dist/commands-hooks.d.ts +0 -160
  152. package/dist/commands-hooks.js +0 -1800
  153. package/dist/commands-hooks.js.map +0 -1
  154. package/dist/hooks.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"codex-wake.js","sourceRoot":"","sources":["../src/codex-wake.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex-wake.js","sourceRoot":"","sources":["../src/codex-wake.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { resolveActiveHarness } from './commands-harness-context.js';
2
- import { findOwningSession, readProjectSession } from './hooks.js';
2
+ import { readProjectSession } from './hook-project-sessions.js';
3
+ import { findOwningSession } from './hook-session-state.js';
3
4
  /**
4
5
  * Resolve only Question Routing lifecycle ownership.
5
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"command-session.js","sourceRoot":"","sources":["../src/command-session.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AACpE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAOlE;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAiB,EACjB,QAAiB;IAEjB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;QACnD,IAAI,KAAK,CAAC,SAAS;YAAE,OAAO,IAAI,CAAA;QAChC,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI;YAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,CAAA;IAC1F,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAA;IACpC,MAAM,UAAU,GAAG,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAChE,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IAChD,IACE,UAAU,CAAC,MAAM,EAAE,SAAS,KAAK,SAAS;QAC1C,UAAU,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EACjC,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,CAAA;IAC5E,CAAC;IACD,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC3D,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAA;AACpF,CAAC"}
1
+ {"version":3,"file":"command-session.js","sourceRoot":"","sources":["../src/command-session.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAO3D;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAiB,EACjB,QAAiB;IAEjB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;QACnD,IAAI,KAAK,CAAC,SAAS;YAAE,OAAO,IAAI,CAAA;QAChC,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI;YAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,CAAA;IAC1F,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAA;IACpC,MAAM,UAAU,GAAG,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAChE,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IAChD,IACE,UAAU,CAAC,MAAM,EAAE,SAAS,KAAK,SAAS;QAC1C,UAAU,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EACjC,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,CAAA;IAC5E,CAAC;IACD,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC3D,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAA;AACpF,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { type CommandDeps } from './commands-core.js';
2
+ /**
3
+ * Record the one Agent Acknowledgement associated with a replied-to request.
4
+ *
5
+ * `--text` is optional here because the acknowledgement is not: an account may
6
+ * turn the agent's written reply off, and the receipt must still be recorded so
7
+ * the user sees that an agent read the answer. The service holds the account's
8
+ * snapshot, so it — not this process — decides whether text was owed.
9
+ */
10
+ export declare function acknowledgeCommand(deps: CommandDeps, requestId: string, flags: {
11
+ text?: string;
12
+ json?: boolean;
13
+ }): Promise<number>;
@@ -0,0 +1,67 @@
1
+ /** Agent-authored acknowledgement submission and local obligation clearing. */
2
+ import { AGENT_ACKNOWLEDGEMENT_MAX_LENGTH } from '@raidiant/notifai-protocol';
3
+ import { resolveCommandSession } from './command-session.js';
4
+ import { EXIT, authedClient, loadLoggedConfig, log, reportError, } from './commands-core.js';
5
+ import { clearAcknowledgementObligation } from './hook-acknowledgements.js';
6
+ /**
7
+ * Record the one Agent Acknowledgement associated with a replied-to request.
8
+ *
9
+ * `--text` is optional here because the acknowledgement is not: an account may
10
+ * turn the agent's written reply off, and the receipt must still be recorded so
11
+ * the user sees that an agent read the answer. The service holds the account's
12
+ * snapshot, so it — not this process — decides whether text was owed.
13
+ */
14
+ export async function acknowledgeCommand(deps, requestId, flags) {
15
+ const text = flags.text?.trim() ?? '';
16
+ if (flags.text !== undefined && text.length === 0) {
17
+ deps.io.err('--text must contain non-whitespace text. Drop it to acknowledge without text.');
18
+ return EXIT.usage;
19
+ }
20
+ if (text.length > AGENT_ACKNOWLEDGEMENT_MAX_LENGTH) {
21
+ deps.io.err(`--text must be at most ${AGENT_ACKNOWLEDGEMENT_MAX_LENGTH} characters after trimming. Shorten it: an acknowledgement is a receipt, not a report.`);
22
+ return EXIT.usage;
23
+ }
24
+ const logger = log(deps);
25
+ const lifecycleSession = resolveCommandSession(deps, requestId);
26
+ const config = loadLoggedConfig(deps, {
27
+ cwd: deps.cwd,
28
+ env: deps.env,
29
+ ...(lifecycleSession === null ? {} : { sessionId: lifecycleSession.sessionId }),
30
+ });
31
+ logger.info('acknowledgement.attempted', {
32
+ request_id: requestId,
33
+ characters: text.length,
34
+ });
35
+ const authed = authedClient(deps, config);
36
+ if (!authed)
37
+ return EXIT.auth;
38
+ try {
39
+ const result = await authed.client.putAgentAcknowledgement(requestId, text.length > 0 ? { text } : {});
40
+ const output = {
41
+ request_id: requestId,
42
+ outcome: result.status,
43
+ acknowledgement: result.agent_acknowledgement,
44
+ agent_acknowledgement_required: true,
45
+ };
46
+ logger.info('acknowledgement.outcome', {
47
+ request_id: requestId,
48
+ outcome: result.status,
49
+ text_chars: result.agent_acknowledgement.text.length,
50
+ created_at: result.agent_acknowledgement.created_at,
51
+ agent_acknowledgement_required: true,
52
+ });
53
+ if (lifecycleSession !== null) {
54
+ clearAcknowledgementObligation(lifecycleSession.sessionId, deps.env, requestId);
55
+ }
56
+ if (flags.json)
57
+ deps.io.out(JSON.stringify(output, null, 2));
58
+ else {
59
+ deps.io.out(`Agent Acknowledgement ${result.status} for ${requestId} at ${result.agent_acknowledgement.created_at}.`);
60
+ }
61
+ return EXIT.ok;
62
+ }
63
+ catch (err) {
64
+ return reportError(deps, err, { operation: 'agent_acknowledgement', request_id: requestId });
65
+ }
66
+ }
67
+ //# sourceMappingURL=commands-acknowledge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands-acknowledge.js","sourceRoot":"","sources":["../src/commands-acknowledge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /** Validation and durable registration for the agent-facing ask command. */
2
+ import { type QuestionT } from '@raidiant/notifai-protocol';
3
+ import { type CommandDeps } from './commands-core.js';
4
+ export interface AskFlags {
5
+ /** Emit the registration and its turn obligation as one JSON object. */
6
+ json?: boolean;
7
+ choice?: string[];
8
+ /** The single question is multi-select: several answers may be chosen. */
9
+ multi?: boolean;
10
+ /** Optional standalone Markdown Body for focused detail. */
11
+ body?: string;
12
+ /** Allow visible backslash-n sequences in `--body`. */
13
+ literalBackslashN?: boolean;
14
+ /** Raw JSON for a multi-question form; replaces the positional question. */
15
+ form?: string;
16
+ image?: string[];
17
+ imageAlt?: string[];
18
+ project?: string;
19
+ sessionLabel?: string;
20
+ }
21
+ export interface AskFailure {
22
+ ok: false;
23
+ registered: false;
24
+ code: string;
25
+ check_id: string;
26
+ exit_code: number;
27
+ remedy: string;
28
+ message: string;
29
+ user_action?: {
30
+ code: string;
31
+ harness: string;
32
+ action: string;
33
+ message: string;
34
+ };
35
+ }
36
+ /** One stable failure contract for every machine-readable ask refusal. */
37
+ export declare function reportAskFailure(deps: CommandDeps, flags: Pick<AskFlags, 'json'>, failure: Omit<AskFailure, 'ok' | 'registered'>): number;
38
+ export interface BuiltQuestions {
39
+ questions: QuestionT[];
40
+ /** Purpose-written plain text for the collapsed banner and list surfaces. */
41
+ summary: string;
42
+ /** Optional standalone Markdown Body for focused detail. */
43
+ body?: string;
44
+ }
45
+ /**
46
+ * Turn ask input into questions plus authored presentation content. Everything is
47
+ * validated at registration because a later hook failure is easy to miss.
48
+ */
49
+ export declare function buildQuestions(flags: AskFlags, question: string | undefined): {
50
+ ok: true;
51
+ questions: QuestionT[];
52
+ summary: string;
53
+ body?: string;
54
+ } | {
55
+ ok: false;
56
+ error: string;
57
+ };
58
+ /**
59
+ * Registers a question for turn-end routing. Returns immediately so the agent
60
+ * can ask in prose and end its turn; the terminal keeps the question to itself
61
+ * for `ask_grace_seconds` before it reaches any device.
62
+ */
63
+ export declare function askCommand(deps: CommandDeps, question: string | undefined, flags: AskFlags): number | Promise<number>;
@@ -0,0 +1,407 @@
1
+ /** Validation and durable registration for the agent-facing ask command. */
2
+ import { CAPABILITIES_V1, QUESTION_TEXT_MAX_LENGTH, REPLY_MAX_QUESTIONS, validateDraft, } from '@raidiant/notifai-protocol';
3
+ import { EXIT, authedClient, log } from './commands-core.js';
4
+ import { resolveActiveHarness } from './commands-harness-context.js';
5
+ import { CODEX_FRESH_SESSION_USER_ACTION, CODEX_HOOK_APPROVAL_USER_ACTION, CODEX_STALE_STOP_DEFINITION_PROBLEM, CODEX_STOP_DEFINITION_NOT_SINGULAR_PROBLEM, activeQuestionRouteProblems, } from './commands-hook-diagnostics.js';
6
+ import { resolveDraftInvocation, uploadImage } from './commands-send-support.js';
7
+ import { loadConfig } from './config.js';
8
+ import { HERMES_QUESTION_ROUTING_UNAVAILABLE, isHookInstallableHarness } from './harnesses.js';
9
+ import { registerQuestion } from './hook-lifecycle.js';
10
+ import { readSessionState } from './hook-session-state.js';
11
+ import { codexTrustProblems, findInstallations } from './install-hooks.js';
12
+ import { inferInvocationContext } from './invocation-context.js';
13
+ import { enableProject, projectBinding } from './project-enablement.js';
14
+ import { CHOICE_USAGE, buildDraft, parseChoices, rejectAccidentalEscapedNewlines, slugify, validateMediaInputs, } from './send.js';
15
+ /** One stable failure contract for every machine-readable ask refusal. */
16
+ export function reportAskFailure(deps, flags, failure) {
17
+ log(deps).error('cli.error', {
18
+ kind: 'ask_admission',
19
+ code: failure.code,
20
+ check_id: failure.check_id,
21
+ exit: failure.exit_code,
22
+ });
23
+ if (flags.json === true) {
24
+ deps.io.out(JSON.stringify({ ok: false, registered: false, ...failure }, null, 2));
25
+ }
26
+ else {
27
+ deps.io.err(failure.message);
28
+ deps.io.err(`next: ${failure.remedy}`);
29
+ }
30
+ return failure.exit_code;
31
+ }
32
+ function askFailure(deps, flags, code, checkId, message, remedy, exitCode = EXIT.usage, details = {}) {
33
+ return reportAskFailure(deps, flags, {
34
+ code,
35
+ check_id: checkId,
36
+ exit_code: exitCode,
37
+ remedy,
38
+ message,
39
+ ...details,
40
+ });
41
+ }
42
+ /**
43
+ * Turn ask input into questions plus authored presentation content. Everything is
44
+ * validated at registration because a later hook failure is easy to miss.
45
+ */
46
+ export function buildQuestions(flags, question) {
47
+ if (flags.form !== undefined) {
48
+ if (question !== undefined || flags.choice?.length || flags.multi) {
49
+ return { ok: false, error: '--form replaces the positional question, --choice, and --multi.' };
50
+ }
51
+ let parsed;
52
+ try {
53
+ parsed = JSON.parse(flags.form);
54
+ }
55
+ catch {
56
+ return {
57
+ ok: false,
58
+ error: '--form must be JSON: {"summary": "...", "questions": [{"text", "choices"?, "multi"?}], "body"?}.',
59
+ };
60
+ }
61
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
62
+ return { ok: false, error: `--form needs a "questions" array (1-${REPLY_MAX_QUESTIONS} entries).` };
63
+ }
64
+ const record = parsed;
65
+ const unknownKeys = Object.keys(record).filter((key) => key !== 'summary' && key !== 'questions' && key !== 'body');
66
+ if (unknownKeys.length > 0) {
67
+ return {
68
+ ok: false,
69
+ error: `Unknown --form ${unknownKeys.length === 1 ? 'key' : 'keys'}: ${unknownKeys.join(', ')}.`,
70
+ };
71
+ }
72
+ if (!Array.isArray(record['questions'])) {
73
+ return { ok: false, error: `--form needs a "questions" array (1-${REPLY_MAX_QUESTIONS} entries).` };
74
+ }
75
+ if (typeof record['summary'] !== 'string' || record['summary'].trim() === '') {
76
+ return { ok: false, error: '--form needs a non-empty one-line "summary" string.' };
77
+ }
78
+ const formQuestions = record['questions'];
79
+ if (formQuestions.length < 1 || formQuestions.length > REPLY_MAX_QUESTIONS) {
80
+ return {
81
+ ok: false,
82
+ error: `A form asks 1-${REPLY_MAX_QUESTIONS} questions; this one has ${formQuestions.length}.`,
83
+ };
84
+ }
85
+ if (record['body'] !== undefined && typeof record['body'] !== 'string') {
86
+ return { ok: false, error: '"body" must be a Markdown string.' };
87
+ }
88
+ if (flags.body !== undefined && record['body'] !== undefined) {
89
+ return { ok: false, error: 'Pass the Markdown Body in either --body or the form "body" key, not both.' };
90
+ }
91
+ const questions = [];
92
+ const usedIds = new Set();
93
+ for (const [index, entry] of formQuestions.entries()) {
94
+ if (typeof entry !== 'object' || entry === null || typeof entry.text !== 'string') {
95
+ return { ok: false, error: `Question ${index + 1} needs a "text" string.` };
96
+ }
97
+ const spec = entry;
98
+ const built = buildOneQuestion(spec.text, spec.choices, spec.multi === true, index, usedIds);
99
+ if ('error' in built)
100
+ return { ok: false, error: `Question ${index + 1}: ${built.error}` };
101
+ questions.push(built.question);
102
+ }
103
+ const body = flags.body ?? record['body'];
104
+ return {
105
+ ok: true,
106
+ questions,
107
+ summary: record['summary'],
108
+ ...(body !== undefined ? { body } : {}),
109
+ };
110
+ }
111
+ if (question === undefined || question.trim() === '') {
112
+ return { ok: false, error: 'The question cannot be empty.' };
113
+ }
114
+ const built = buildOneQuestion(question, flags.choice, flags.multi === true, 0, new Set());
115
+ if ('error' in built)
116
+ return { ok: false, error: built.error };
117
+ return {
118
+ ok: true,
119
+ questions: [built.question],
120
+ summary: built.question.text,
121
+ ...(flags.body !== undefined ? { body: flags.body } : {}),
122
+ };
123
+ }
124
+ function buildOneQuestion(text, choiceLabels, multi, index, usedIds) {
125
+ const trimmed = text.trim();
126
+ if (trimmed === '')
127
+ return { error: 'the question text cannot be empty.' };
128
+ if ([...trimmed].length > QUESTION_TEXT_MAX_LENGTH) {
129
+ return {
130
+ error: `a question must be readable where it is answered: keep it within ` +
131
+ `${QUESTION_TEXT_MAX_LENGTH} characters and put the longer explanation in --body.`,
132
+ };
133
+ }
134
+ const choices = parseChoices(choiceLabels);
135
+ if (choices === 'invalid')
136
+ return { error: CHOICE_USAGE };
137
+ if (multi && choices === null) {
138
+ return { error: '--multi needs answers to select between; add --choice.' };
139
+ }
140
+ let id = slugify(trimmed);
141
+ if (id === '' || usedIds.has(id))
142
+ id = `q${index + 1}`;
143
+ usedIds.add(id);
144
+ return {
145
+ question: {
146
+ id,
147
+ text: trimmed,
148
+ ...(choices !== null ? { choices } : {}),
149
+ ...(multi ? { multi: true } : {}),
150
+ },
151
+ };
152
+ }
153
+ function buildAskDraft(config, built, flags, invocation, mediaIds) {
154
+ const result = buildDraft(config, {
155
+ title: built.questions[0].text,
156
+ summary: built.summary,
157
+ ...(built.body !== undefined ? { body: built.body } : {}),
158
+ ...(flags.project !== undefined ? { project: flags.project } : {}),
159
+ ...(mediaIds.length > 0 ? { image: mediaIds } : {}),
160
+ ...(flags.imageAlt !== undefined ? { imageAlt: flags.imageAlt } : {}),
161
+ reply: true,
162
+ questions: built.questions,
163
+ }, invocation);
164
+ if (!result.ok)
165
+ return result;
166
+ const capabilities = CAPABILITIES_V1.describe(result.platform);
167
+ if (capabilities === null)
168
+ return { ok: false, error: 'No iOS capability contract is available.' };
169
+ const validation = validateDraft(result.draft, capabilities);
170
+ if (!validation.ok) {
171
+ return {
172
+ ok: false,
173
+ error: validation.errors.map((issue) => `${issue.path}: ${issue.message}`).join('\n'),
174
+ };
175
+ }
176
+ return { ok: true, draft: result.draft };
177
+ }
178
+ function recordRegisteredQuestion(deps, sessionId, built, draft, json = false) {
179
+ let questionId;
180
+ try {
181
+ questionId = registerQuestion(sessionId, deps.env, {
182
+ question: built.questions[0].text,
183
+ summary: draft.presentation.summary,
184
+ questions: built.questions,
185
+ ...(draft.presentation.body !== undefined ? { body: draft.presentation.body } : {}),
186
+ ...(draft.project !== undefined ? { project: draft.project } : {}),
187
+ ...(draft.source !== undefined ? { source: draft.source } : {}),
188
+ ...(draft.presentation.media !== undefined ? { media: draft.presentation.media } : {}),
189
+ }, (deps.now ?? Date.now)());
190
+ }
191
+ catch (err) {
192
+ return askFailure(deps, { json }, 'registration_failed', 'question_registration', `Could not register the question: ${err instanceof Error ? err.message : String(err)}`, 'retire an older pending question if the limit was reached, then retry the same ask', EXIT.failed);
193
+ }
194
+ log(deps).info('ask.registered', {
195
+ ok: true,
196
+ session: sessionId,
197
+ question_id: questionId,
198
+ questions: built.questions.length,
199
+ text_chars: built.questions[0].text.length,
200
+ choices: built.questions[0].choices?.length ?? 0,
201
+ media: draft.presentation.media?.length ?? 0,
202
+ });
203
+ // The block below is the densest guidance this CLI prints, and until now it
204
+ // was prose only: an agent could not read back the choice ids it must branch
205
+ // on without asking the server for them. The JSON form carries the same
206
+ // obligation as data.
207
+ if (json) {
208
+ deps.io.out(JSON.stringify({
209
+ registered: true,
210
+ question_id: questionId,
211
+ state: 'local',
212
+ submitted: false,
213
+ request_id: null,
214
+ provider_acceptance: 'not_available',
215
+ questions: built.questions.map((entry) => ({
216
+ id: entry.id,
217
+ text: entry.text,
218
+ ...(entry.choices === undefined ? {} : { choices: entry.choices }),
219
+ ...(entry.multi === true ? { multi: true } : {}),
220
+ })),
221
+ status: `notifai status ${questionId}`,
222
+ close: `notifai close ${questionId}`,
223
+ next: {
224
+ end_turn: true,
225
+ in_this_turn: 'Ask the question in the conversation and say what concrete work each possible answer will make you resume, then end the turn.',
226
+ route_neutral: 'Never say where the answer must arrive; it returns by whatever route the harness supports.',
227
+ on_answer: 'Acknowledge it, then resume the committed work without asking the user to confirm again.',
228
+ answered_outside_notifai: `If they answer in the conversation instead, run \`notifai close ${questionId}\` before ending the turn so a later Stop will not send this question.`,
229
+ },
230
+ }, null, 2));
231
+ return EXIT.ok;
232
+ }
233
+ for (const [index, entry] of built.questions.entries()) {
234
+ const prefix = built.questions.length > 1 ? `${index + 1}. ` : '';
235
+ if (entry.choices !== undefined) {
236
+ const kind = entry.multi === true ? 'answers offered (several may be chosen)' : 'answers offered';
237
+ deps.io.out(`${prefix}${entry.text} — ${kind}: ${entry.choices.map((choice) => choice.label).join(' / ')}`);
238
+ }
239
+ else if (built.questions.length > 1) {
240
+ deps.io.out(`${prefix}${entry.text} — free text`);
241
+ }
242
+ }
243
+ deps.io.out(built.questions.length > 1
244
+ ? `${built.questions.length} questions registered locally as one form (${questionId}); they have not been submitted as a Notification Request and have no Provider Acceptance yet. Ask them in the conversation, state the concrete work you will resume for their answers, then end your turn.`
245
+ : `Question registered locally (${questionId}); it has not been submitted as a Notification Request and has no Provider Acceptance yet. Ask it in the conversation, state the concrete work you will resume when the answer arrives, then end your turn.`);
246
+ deps.io.out(`Question settlement runs after registration. Inspect the original identity with \`notifai status ${questionId}\`; never register a replacement to check whether this one was sent.`);
247
+ deps.io.out('Before ending this turn, pre-commit in your own words to the work you will resume:');
248
+ for (const [index, entry] of built.questions.entries()) {
249
+ const questionPrefix = built.questions.length > 1 ? `Question ${index + 1}, ` : '';
250
+ if (entry.choices !== undefined) {
251
+ for (const choice of entry.choices) {
252
+ deps.io.out(`- ${questionPrefix}If the answer is ${JSON.stringify(choice.label)}: state the concrete work you will resume.`);
253
+ }
254
+ deps.io.out(`- ${questionPrefix}For an unexpected typed answer: state how it will determine the concrete work you resume.`);
255
+ }
256
+ else {
257
+ deps.io.out(`- ${questionPrefix}For the free-text answer: state how its content will determine the concrete work you resume.`);
258
+ }
259
+ }
260
+ deps.io.out('When the answer arrives, resume the matching work without asking the user to confirm again. Frame this as work you will resume, not as approval you receive.');
261
+ deps.io.out('A Notifai answer cannot answer a harness permission prompt or interactive picker; leave those to the harness and user.');
262
+ deps.io.out(`If they answer in this conversation instead, retire it with \`notifai close ${questionId}\` so a later Stop will not send it.`);
263
+ return EXIT.ok;
264
+ }
265
+ async function uploadAskMedia(deps, config, sessionId, built, flags, invocation) {
266
+ const authed = authedClient(deps, config);
267
+ if (!authed) {
268
+ return askFailure(deps, flags, 'auth_required', 'credential', 'Question routing is not paired on this machine.', 'run `notifai init --json`', EXIT.auth);
269
+ }
270
+ const mediaIds = [];
271
+ for (const image of flags.image ?? []) {
272
+ if (image.startsWith('med_')) {
273
+ mediaIds.push(image);
274
+ continue;
275
+ }
276
+ const uploaded = await uploadImage(deps, authed.client, image, config.media_origins.value);
277
+ if (!uploaded.ok) {
278
+ if (uploaded.error !== null)
279
+ deps.io.err(uploaded.error);
280
+ return askFailure(deps, flags, 'media_upload_failed', 'media', uploaded.error ?? 'The image upload failed.', 'fix the reported image or network problem, then retry the same ask', uploaded.exit);
281
+ }
282
+ mediaIds.push(uploaded.mediaId);
283
+ }
284
+ const ready = buildAskDraft(config, built, flags, invocation, mediaIds);
285
+ if (!ready.ok) {
286
+ return askFailure(deps, flags, 'invalid_draft', 'draft', ready.error, 'fix the reported field and retry');
287
+ }
288
+ return recordRegisteredQuestion(deps, sessionId, built, ready.draft, flags.json === true);
289
+ }
290
+ /**
291
+ * Registers a question for turn-end routing. Returns immediately so the agent
292
+ * can ask in prose and end its turn; the terminal keeps the question to itself
293
+ * for `ask_grace_seconds` before it reaches any device.
294
+ */
295
+ export function askCommand(deps, question, flags) {
296
+ // Validate before route discovery. A malformed question belongs to the
297
+ // caller and should not be hidden behind whichever harness setup issue
298
+ // happens to exist on this machine.
299
+ const escapedBody = rejectAccidentalEscapedNewlines(flags.body, flags.literalBackslashN);
300
+ if (escapedBody !== null) {
301
+ return askFailure(deps, flags, 'invalid_input', 'body', escapedBody, 'fix the body and retry');
302
+ }
303
+ const built = buildQuestions(flags, question);
304
+ if (!built.ok) {
305
+ return askFailure(deps, flags, 'invalid_input', 'questions', built.error, 'fix the question input and retry');
306
+ }
307
+ const mediaInputError = validateMediaInputs(flags.image, flags.imageAlt);
308
+ if (mediaInputError !== null) {
309
+ return askFailure(deps, flags, 'invalid_input', 'media', mediaInputError, 'fix the media flags and retry');
310
+ }
311
+ let explicitUseConfig;
312
+ try {
313
+ explicitUseConfig = loadConfig({ cwd: deps.cwd, env: deps.env });
314
+ }
315
+ catch (err) {
316
+ return askFailure(deps, flags, 'config_invalid', 'configuration', `Question routing configuration is invalid: ${String(err)}`, 'fix the reported Notifai configuration and retry');
317
+ }
318
+ const explicitProject = flags.project ?? explicitUseConfig.project.value ?? inferInvocationContext(deps.cwd).project;
319
+ if (explicitProject !== null) {
320
+ const binding = projectBinding(deps.cwd, deps.env, explicitProject);
321
+ if (binding !== null)
322
+ enableProject(binding);
323
+ }
324
+ if (deps.store.load() === null) {
325
+ return askFailure(deps, flags, 'auth_required', 'credential', 'Question routing is not paired on this machine.', 'run `notifai init --json`', EXIT.auth);
326
+ }
327
+ // An agent calling this gets no hook payload. Harness-native environment
328
+ // markers identify the active owner, while UserPromptSubmit adds the hook's
329
+ // canonical id to the directory's concurrent-session index.
330
+ const now = (deps.now ?? Date.now)();
331
+ const { active, contested } = resolveActiveHarness(deps.env, deps.cwd, now);
332
+ let sessionId;
333
+ if (active !== null) {
334
+ if (contested.length > 1) {
335
+ return askFailure(deps, flags, 'session_identity_ambiguous', 'exact_session', `Several harness sessions could own this shell (${contested.map((candidate) => candidate.label).join(', ')}).`, 'run the ask from a shell with one exact active harness session');
336
+ }
337
+ if (!isHookInstallableHarness(active.harness)) {
338
+ const capability = HERMES_QUESTION_ROUTING_UNAVAILABLE;
339
+ return askFailure(deps, flags, 'question_routing_unavailable', 'hook_contract', `${active.label}: ${capability.deliveryContract}`, 'use a blocking `notifai send --reply` question');
340
+ }
341
+ const installations = findInstallations(deps.env, deps.hookAdapterHome, deps.hookPlatform);
342
+ const activeInstalled = installations.some((installation) => installation.harness === active.harness);
343
+ if (!activeInstalled) {
344
+ return askFailure(deps, flags, 'hooks_not_installed', 'hook_installation', `Notifai ${active.label} hooks are not installed in this active harness home.`, `run \`notifai init --json\` from this ${active.label} session`);
345
+ }
346
+ if (active.sessionId === undefined) {
347
+ return askFailure(deps, flags, 'session_identity_missing', 'exact_session', `The active ${active.label} shell does not expose an exact session id.`, 'use a blocking `notifai send --reply` question');
348
+ }
349
+ const matchingInstallations = installations.filter((installation) => installation.harness === active.harness);
350
+ const trustProblems = active.harness === 'codex'
351
+ ? codexTrustProblems(matchingInstallations, deps.env)
352
+ : [];
353
+ if (trustProblems.length > 0) {
354
+ return askFailure(deps, flags, 'codex_hook_approval_required', 'hook_trust', `Question routing is not ready: ${trustProblems.join('; ')}. This question was not registered. Do not replace it with a short \`notifai send --reply\` wait: that command cannot resume this Agent Session after its reply timeout.`, 'open `/hooks` in Codex and approve or enable the Notifai handlers', EXIT.usage, { user_action: CODEX_HOOK_APPROVAL_USER_ACTION });
355
+ }
356
+ const routeProblems = activeQuestionRouteProblems(deps, active, installations);
357
+ if (routeProblems.includes(CODEX_STOP_DEFINITION_NOT_SINGULAR_PROBLEM)) {
358
+ return askFailure(deps, flags, 'codex_stop_definition_invalid', 'hook_installation', `Question routing is not ready: ${CODEX_STOP_DEFINITION_NOT_SINGULAR_PROBLEM}. This question was not registered.`, 'run `notifai hooks install --harness codex`, then re-run `notifai doctor`');
359
+ }
360
+ if (routeProblems.includes(CODEX_STALE_STOP_DEFINITION_PROBLEM)) {
361
+ return askFailure(deps, flags, 'codex_fresh_session_required', 'stop_hook', `Question routing is not ready: ${CODEX_STALE_STOP_DEFINITION_PROBLEM}. This question was not registered.`, 'start one fresh Codex session, send one prompt in it, then retry `notifai ask --json`', EXIT.usage, { user_action: CODEX_FRESH_SESSION_USER_ACTION });
362
+ }
363
+ if (routeProblems.length > 0) {
364
+ return askFailure(deps, flags, 'question_routing_unavailable', 'hook_contract', `Question routing is not ready: ${routeProblems.join('; ')}`, 'run `notifai init --json` and follow its question-routing remedy');
365
+ }
366
+ const state = readSessionState(active.sessionId, deps.env);
367
+ if (state.harness !== active.harness || state.last_prompt_at === undefined) {
368
+ return askFailure(deps, flags, 'session_not_activated', 'user_prompt_submit', `This exact ${active.label} session has not fired UserPromptSubmit.`, `send one prompt in this ${active.label} session, then retry \`notifai ask --json\``);
369
+ }
370
+ sessionId = active.sessionId;
371
+ }
372
+ else {
373
+ return askFailure(deps, flags, 'session_identity_missing', 'exact_session', 'Could not prove which live Agent Session owns this command.', 'run it from a supported harness with exact Agent Session identity, or use a blocking `notifai send --reply` question');
374
+ }
375
+ if (!sessionId) {
376
+ return askFailure(deps, flags, 'session_identity_missing', 'exact_session', 'No exact active Agent Session is available.', 'use a blocking `notifai send --reply` question');
377
+ }
378
+ let routingConfig;
379
+ try {
380
+ routingConfig = loadConfig({ cwd: deps.cwd, env: deps.env, sessionId });
381
+ }
382
+ catch (err) {
383
+ return askFailure(deps, flags, 'config_invalid', 'configuration', `Question routing configuration is invalid: ${String(err)}`, 'fix the reported Notifai configuration and retry');
384
+ }
385
+ if (!routingConfig.ask_notifications.value) {
386
+ return askFailure(deps, flags, 'question_routing_disabled', 'ask_notifications', 'Question routing is disabled by ask_notifications=false.', 'enable question routing or use a blocking `notifai send --reply` question');
387
+ }
388
+ const source = resolveDraftInvocation(deps, flags, active);
389
+ if (!source.ok) {
390
+ return askFailure(deps, flags, 'invalid_source', 'source_context', source.error, 'remove the conflicting source override and retry');
391
+ }
392
+ if (source.invocation.source?.session_id !== sessionId) {
393
+ return askFailure(deps, flags, 'session_identity_mismatch', 'exact_session', `The inferred session does not match the exact active ${active.label} session.`, 'remove NOTIFAI_SESSION_ID and retry from the exact active session');
394
+ }
395
+ // Placeholders let every body, source, project, media, and payload limit fail
396
+ // before an upload starts. The real ids replace them only after this passes.
397
+ const placeholders = (flags.image ?? []).map((_, index) => `med_pending_${index + 1}`);
398
+ const preflight = buildAskDraft(routingConfig, built, flags, source.invocation, placeholders);
399
+ if (!preflight.ok) {
400
+ return askFailure(deps, flags, 'invalid_draft', 'draft', preflight.error, 'fix the reported field and retry');
401
+ }
402
+ if ((flags.image?.length ?? 0) > 0) {
403
+ return uploadAskMedia(deps, routingConfig, sessionId, built, flags, source.invocation);
404
+ }
405
+ return recordRegisteredQuestion(deps, sessionId, built, preflight.draft, flags.json === true);
406
+ }
407
+ //# sourceMappingURL=commands-ask.js.map