@raidiant/notifai 11.4.0 → 11.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -0
- package/README.md +7 -3
- package/dist/codex-tool-messages.d.ts +17 -0
- package/dist/codex-tool-messages.js +142 -0
- package/dist/codex-tool-messages.js.map +1 -0
- package/dist/commands-acknowledge.js +8 -0
- package/dist/commands-acknowledge.js.map +1 -1
- package/dist/commands-ask.js +14 -2
- package/dist/commands-ask.js.map +1 -1
- package/dist/commands-doctor.js +140 -36
- package/dist/commands-doctor.js.map +1 -1
- package/dist/commands-harness-context.js +3 -0
- package/dist/commands-harness-context.js.map +1 -1
- package/dist/commands-hook-attend.d.ts +10 -6
- package/dist/commands-hook-attend.js +80 -32
- package/dist/commands-hook-attend.js.map +1 -1
- package/dist/commands-hook-diagnostics.d.ts +11 -1
- package/dist/commands-hook-diagnostics.js +40 -1
- package/dist/commands-hook-diagnostics.js.map +1 -1
- package/dist/commands-hook-install.js +162 -21
- package/dist/commands-hook-install.js.map +1 -1
- package/dist/commands-hook-run.js +223 -10
- package/dist/commands-hook-run.js.map +1 -1
- package/dist/commands-hook-shape.d.ts +4 -3
- package/dist/commands-hook-shape.js +5 -4
- package/dist/commands-hook-shape.js.map +1 -1
- package/dist/commands-send.d.ts +1 -0
- package/dist/commands-send.js +146 -8
- package/dist/commands-send.js.map +1 -1
- package/dist/commands-update.js +22 -7
- package/dist/commands-update.js.map +1 -1
- package/dist/harnesses.d.ts +8 -9
- package/dist/harnesses.js +25 -7
- package/dist/harnesses.js.map +1 -1
- package/dist/hermes-plugin.d.ts +11 -0
- package/dist/hermes-plugin.js +161 -0
- package/dist/hermes-plugin.js.map +1 -0
- package/dist/hook-acknowledgements.d.ts +5 -1
- package/dist/hook-acknowledgements.js +28 -2
- package/dist/hook-acknowledgements.js.map +1 -1
- package/dist/hook-events.d.ts +9 -2
- package/dist/hook-events.js +16 -6
- package/dist/hook-events.js.map +1 -1
- package/dist/hook-lifecycle.js +15 -2
- package/dist/hook-lifecycle.js.map +1 -1
- package/dist/hook-session-state.d.ts +4 -1
- package/dist/hook-session-state.js +16 -4
- package/dist/hook-session-state.js.map +1 -1
- package/dist/hook-types.d.ts +26 -0
- package/dist/install-hooks.js +51 -4
- package/dist/install-hooks.js.map +1 -1
- package/dist/openclaw-continuation-bridge.d.ts +7 -0
- package/dist/openclaw-continuation-bridge.js +64 -0
- package/dist/openclaw-continuation-bridge.js.map +1 -0
- package/dist/openclaw-gateway-readiness.d.ts +1 -0
- package/dist/openclaw-gateway-readiness.js +24 -0
- package/dist/openclaw-gateway-readiness.js.map +1 -0
- package/dist/openclaw-generation.d.ts +17 -0
- package/dist/openclaw-generation.js +93 -0
- package/dist/openclaw-generation.js.map +1 -0
- package/dist/openclaw-pending.d.ts +8 -0
- package/dist/openclaw-pending.js +52 -0
- package/dist/openclaw-pending.js.map +1 -0
- package/dist/openclaw-plugin.d.ts +22 -4
- package/dist/openclaw-plugin.js +701 -87
- package/dist/openclaw-plugin.js.map +1 -1
- package/dist/openclaw-session-access.d.ts +10 -0
- package/dist/openclaw-session-access.js +69 -0
- package/dist/openclaw-session-access.js.map +1 -0
- package/dist/program.js +8 -7
- package/dist/program.js.map +1 -1
- package/dist/session-activation.js +4 -4
- package/dist/session-activation.js.map +1 -1
- package/dist/session-attendant-probe.d.ts +10 -0
- package/dist/session-attendant-probe.js +31 -0
- package/dist/session-attendant-probe.js.map +1 -1
- package/dist/session-attendant-state.d.ts +8 -4
- package/dist/session-attendant-state.js +17 -10
- package/dist/session-attendant-state.js.map +1 -1
- package/dist/session-delivery.d.ts +3 -1
- package/dist/session-delivery.js +6 -2
- package/dist/session-delivery.js.map +1 -1
- package/dist/session-handoff.d.ts +1 -1
- package/dist/session-message-handoff.d.ts +2 -0
- package/dist/session-message-handoff.js +2 -0
- package/dist/session-message-handoff.js.map +1 -1
- package/dist/skill-source/manifest.json +6 -6
- package/dist/skill-source/notifai/SKILL.md +2 -2
- package/dist/skill-source/notifai/references/harness-setup.md +51 -18
- package/dist/skill-source/notifai/references/notes-and-edits.md +6 -1
- package/dist/skill-source/notifai/references/updates.md +6 -6
- package/dist/update-handoff.d.ts +1 -1
- package/dist/update-handoff.js +1 -0
- package/dist/update-handoff.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/** Gateway service inventory: only identity and timing, never question text. */
|
|
2
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { stateDir, loadConfig } from './config.js';
|
|
5
|
+
import { readSessionState, sessionHasEnded, sessionStatePath, readSessionIncarnation } from './hook-session-state.js';
|
|
6
|
+
import { readOpenclawGeneration } from './openclaw-generation.js';
|
|
7
|
+
import { projectBinding, projectEnabled } from './project-enablement.js';
|
|
8
|
+
/** Scan CLI-owned state so a Gateway restart finds unanswered questions. */
|
|
9
|
+
export function listPendingOpenclawSessions(env) {
|
|
10
|
+
const directory = path.join(stateDir(env), 'sessions');
|
|
11
|
+
if (!existsSync(directory))
|
|
12
|
+
return [];
|
|
13
|
+
const sessions = [];
|
|
14
|
+
for (const name of readdirSync(directory)) {
|
|
15
|
+
if (!name.endsWith('.json'))
|
|
16
|
+
continue;
|
|
17
|
+
try {
|
|
18
|
+
const parsed = JSON.parse(readFileSync(path.join(directory, name), 'utf8'));
|
|
19
|
+
if (typeof parsed !== 'object' || parsed === null)
|
|
20
|
+
continue;
|
|
21
|
+
const raw = parsed;
|
|
22
|
+
const sessionKey = raw['session_id'];
|
|
23
|
+
if (typeof sessionKey !== 'string' ||
|
|
24
|
+
path.basename(sessionStatePath(sessionKey, env)) !== name)
|
|
25
|
+
continue;
|
|
26
|
+
const state = readSessionState(sessionKey, env);
|
|
27
|
+
const cwd = state.activation_cwd;
|
|
28
|
+
if (state.harness !== 'openclaw' || typeof cwd !== 'string' ||
|
|
29
|
+
!path.isAbsolute(cwd) || sessionHasEnded(sessionKey, env))
|
|
30
|
+
continue;
|
|
31
|
+
const generation = readOpenclawGeneration(sessionKey, env);
|
|
32
|
+
if (generation === null || generation.ended || !generation.activated ||
|
|
33
|
+
readSessionIncarnation(sessionKey, env)?.openclaw_generation !== generation.id)
|
|
34
|
+
continue;
|
|
35
|
+
const config = loadConfig({ cwd, env, sessionId: sessionKey });
|
|
36
|
+
if (!projectEnabled(projectBinding(cwd, env, config.project.value)))
|
|
37
|
+
continue;
|
|
38
|
+
const stopped = state.last_stop_at;
|
|
39
|
+
if (stopped === undefined ||
|
|
40
|
+
!((state.pending ?? []).some((entry) => (entry.asked_at ?? Infinity) <= stopped) ||
|
|
41
|
+
(state.accepted !== undefined && state.accepted.delivered_at === undefined)))
|
|
42
|
+
continue;
|
|
43
|
+
sessions.push({ session_key: sessionKey, cwd, generation: generation.id,
|
|
44
|
+
...(generation.sessionId === undefined ? {} : { session_id: generation.sessionId }) });
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Corrupt or unreadable state never authorizes a continuation.
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return sessions;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=openclaw-pending.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-pending.js","sourceRoot":"","sources":["../src/openclaw-pending.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type JSONPath } from 'jsonc-parser';
|
|
1
2
|
import { type HookHostPlatform } from './hook-adapter.js';
|
|
2
3
|
/**
|
|
3
4
|
* The OpenClaw adapter.
|
|
@@ -7,14 +8,16 @@ import { type HookHostPlatform } from './hook-adapter.js';
|
|
|
7
8
|
* commands every other harness invokes, so presence, activation, and
|
|
8
9
|
* retirement stay in the CLI.
|
|
9
10
|
*
|
|
10
|
-
*
|
|
11
|
+
* session_start -> openclaw-lifecycle (generation observation)
|
|
12
|
+
* before_reset -> openclaw-lifecycle (retire the old generation)
|
|
13
|
+
* before_prompt_build -> session-start / subagent-start (context once per generation)
|
|
11
14
|
* message_received -> user-prompt-submit (User is present)
|
|
12
15
|
* agent_end -> stop (the turn ended)
|
|
13
16
|
* session_end -> session-end (retire local state)
|
|
14
17
|
* resolve_exec_env -> NOTIFAI_ACTIVE_* markers (exact Source Context)
|
|
15
18
|
*
|
|
16
|
-
* `command:stop` is a User abort and is deliberately not wired.
|
|
17
|
-
*
|
|
19
|
+
* `command:stop` is a User abort and is deliberately not wired. The Gateway
|
|
20
|
+
* service owns answer continuation after agent_end records its turn boundary.
|
|
18
21
|
*/
|
|
19
22
|
export declare const OPENCLAW_PLUGIN_MARKER = "// notifai managed openclaw plugin";
|
|
20
23
|
export declare const OPENCLAW_PLUGIN_ID = "notifai";
|
|
@@ -44,7 +47,22 @@ export declare function openclawPluginTarget(contents: string): {
|
|
|
44
47
|
timeoutSeconds?: number;
|
|
45
48
|
nodePath?: string;
|
|
46
49
|
} | null;
|
|
47
|
-
export declare function parseOpenclawConfig(source: string): Record<string, unknown>;
|
|
50
|
+
export declare function parseOpenclawConfig(source: string, configFile?: string): Record<string, unknown>;
|
|
51
|
+
/** Apply one JSONC edit while leaving unrelated source ranges intact. */
|
|
52
|
+
export declare function editOpenclawConfigText(source: string, configFile: string, location: JSONPath, value: unknown): string;
|
|
53
|
+
/** Install or refresh Notifai's entry with a JSONC parser edit. */
|
|
54
|
+
export declare function enableOpenclawNotifaiConfigText(source: string, configFile: string): string;
|
|
55
|
+
/** Remove only the entry and explicit load path owned by this installation. */
|
|
56
|
+
export declare function removeOpenclawNotifaiConfigText(source: string, configFile: string, pluginDir: string): string;
|
|
57
|
+
/** Remove one older Project load path while leaving the shared entry alone. */
|
|
58
|
+
export declare function removeOpenclawLoadPathConfigText(source: string, configFile: string, pluginDir: string): string;
|
|
59
|
+
export interface OpenclawPluginLoadBlocker {
|
|
60
|
+
key: 'plugins.allow' | 'plugins.deny';
|
|
61
|
+
action: 'add' | 'remove';
|
|
62
|
+
}
|
|
63
|
+
export declare function openclawPluginLoadBlockers(config: Record<string, unknown>): OpenclawPluginLoadBlocker[];
|
|
64
|
+
export declare function openclawPluginLoadRemedy(blocker: OpenclawPluginLoadBlocker): string;
|
|
65
|
+
export declare function openclawPluginLoadWarning(blockers: OpenclawPluginLoadBlocker[]): string | null;
|
|
48
66
|
export declare function mergeOpenclawNotifaiEntry(config: Record<string, unknown>): Record<string, unknown>;
|
|
49
67
|
/**
|
|
50
68
|
* Drop a Project-scoped plugin directory from OpenClaw's explicit load paths,
|