@a1hvdy/cc-openclaw 0.17.0 → 0.18.1
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/README.md +0 -14
- package/dist/src/channels/telegram/completion-summary.js +24 -2
- package/dist/src/channels/telegram/completion-summary.js.map +1 -1
- package/dist/src/channels/telegram/event-reducer.js +15 -3
- package/dist/src/channels/telegram/event-reducer.js.map +1 -1
- package/dist/src/channels/telegram/live-card.d.ts +90 -7
- package/dist/src/channels/telegram/live-card.js +286 -25
- package/dist/src/channels/telegram/live-card.js.map +1 -1
- package/dist/src/channels/telegram/tool-tracker.d.ts +16 -2
- package/dist/src/channels/telegram/tool-tracker.js +81 -18
- package/dist/src/channels/telegram/tool-tracker.js.map +1 -1
- package/dist/src/config/loader.js +2 -0
- package/dist/src/config/loader.js.map +1 -1
- package/dist/src/config/schema.d.ts +20 -1
- package/dist/src/config/schema.js +12 -1
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/constants.d.ts +13 -1
- package/dist/src/constants.js +13 -1
- package/dist/src/constants.js.map +1 -1
- package/dist/src/engines/index.d.ts +0 -2
- package/dist/src/engines/index.js +0 -3
- package/dist/src/engines/index.js.map +1 -1
- package/dist/src/engines/persistent-session.d.ts +0 -9
- package/dist/src/engines/persistent-session.js +0 -39
- package/dist/src/engines/persistent-session.js.map +1 -1
- package/dist/src/lib/config.d.ts +6 -0
- package/dist/src/lib/config.js +81 -0
- package/dist/src/lib/config.js.map +1 -1
- package/dist/src/lib/sysprompt-strip.d.ts +14 -0
- package/dist/src/lib/sysprompt-strip.js +79 -2
- package/dist/src/lib/sysprompt-strip.js.map +1 -1
- package/dist/src/lib/trajectory.d.ts +1 -10
- package/dist/src/lib/trajectory.js +6 -37
- package/dist/src/lib/trajectory.js.map +1 -1
- package/dist/src/lib/turn-trace.d.ts +34 -0
- package/dist/src/lib/turn-trace.js +75 -0
- package/dist/src/lib/turn-trace.js.map +1 -0
- package/dist/src/observability/event-bus.d.ts +0 -21
- package/dist/src/observability/event-bus.js.map +1 -1
- package/dist/src/openai-compat/insight-format.d.ts +36 -0
- package/dist/src/openai-compat/insight-format.js +140 -0
- package/dist/src/openai-compat/insight-format.js.map +1 -0
- package/dist/src/openai-compat/non-streaming-handler.js +38 -58
- package/dist/src/openai-compat/non-streaming-handler.js.map +1 -1
- package/dist/src/openai-compat/openai-compat.js +23 -0
- package/dist/src/openai-compat/openai-compat.js.map +1 -1
- package/dist/src/openai-compat/response-formatter.d.ts +6 -1
- package/dist/src/openai-compat/response-formatter.js +9 -2
- package/dist/src/openai-compat/response-formatter.js.map +1 -1
- package/dist/src/openai-compat/streaming-handler.js +35 -120
- package/dist/src/openai-compat/streaming-handler.js.map +1 -1
- package/dist/src/patches/cache-parity-registry.d.ts +0 -83
- package/dist/src/patches/cache-parity-registry.js +1 -151
- package/dist/src/patches/cache-parity-registry.js.map +1 -1
- package/dist/src/session/session-manager.d.ts +8 -4
- package/dist/src/session/session-manager.js +86 -76
- package/dist/src/session/session-manager.js.map +1 -1
- package/dist/src/session-bootstrap/cwd-patch.js +35 -0
- package/dist/src/session-bootstrap/cwd-patch.js.map +1 -1
- package/mcp-tools.json +1 -1
- package/package.json +1 -1
- package/dist/src/engines/heartbeat-guard.d.ts +0 -91
- package/dist/src/engines/heartbeat-guard.js +0 -120
- package/dist/src/engines/heartbeat-guard.js.map +0 -1
- package/dist/src/engines/subprocess-pool.d.ts +0 -78
- package/dist/src/engines/subprocess-pool.js +0 -200
- package/dist/src/engines/subprocess-pool.js.map +0 -1
- package/dist/src/lib/cost-rollup.d.ts +0 -36
- package/dist/src/lib/cost-rollup.js +0 -125
- package/dist/src/lib/cost-rollup.js.map +0 -1
- package/dist/src/lifecycle/safe-restart.d.ts +0 -99
- package/dist/src/lifecycle/safe-restart.js +0 -132
- package/dist/src/lifecycle/safe-restart.js.map +0 -1
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* safe-restart — in-process gateway restart that preserves the current
|
|
3
|
-
* Telegram session.
|
|
4
|
-
*
|
|
5
|
-
* Pre-Execution Decision (PRP_v2 §Pre-Execution Decisions, locked):
|
|
6
|
-
* Path: --safe-current-session flag (in-process).
|
|
7
|
-
* Rationale: avoids tmux zombie risk (Risk Register row 3); cleaner state
|
|
8
|
-
* model; tmux-detach remains available as a secondary path (v0.17 deferred).
|
|
9
|
-
*
|
|
10
|
-
* Usage (programmatic):
|
|
11
|
-
* const restart = new SafeRestart({ sessionId: 'my-session' });
|
|
12
|
-
* const result = await restart.run();
|
|
13
|
-
*
|
|
14
|
-
* Usage (CLI flag):
|
|
15
|
-
* cc-openclaw --safe-current-session [--session-id <id>]
|
|
16
|
-
* Parsed in src/cli/index.ts and forwarded here.
|
|
17
|
-
*
|
|
18
|
-
* Self-survival contract:
|
|
19
|
-
* When OpenClaw triggers a gateway restart while a Telegram session is
|
|
20
|
-
* active, the session must NOT fire a sub-agent "self-survival" turn. This
|
|
21
|
-
* module registers a SIGTERM handler that:
|
|
22
|
-
* 1. Flushes in-flight state (EventBus drain-wait up to FLUSH_TIMEOUT_MS).
|
|
23
|
-
* 2. Marks the named session as restart-pending in the session registry.
|
|
24
|
-
* 3. Emits a 'safe-restart.initiated' telemetry event.
|
|
25
|
-
* 4. Returns "in-process" — the gateway respawner picks this signal up and
|
|
26
|
-
* skips the self-survival sub-agent path.
|
|
27
|
-
*
|
|
28
|
-
* SecondaryPath — tmux-detach:
|
|
29
|
-
* See scripts/gateway-detach.sh. NOT the default per locked decision above.
|
|
30
|
-
* SafeRestart.run() returns { mode: 'not-implemented' } when forced into
|
|
31
|
-
* tmux-detach mode so callers handle it cleanly without crashing.
|
|
32
|
-
*/
|
|
33
|
-
import { EventBus } from '../observability/event-bus.js';
|
|
34
|
-
export type RestartMode = 'in-process' | 'tmux-detach';
|
|
35
|
-
export interface SafeRestartOptions {
|
|
36
|
-
/** Session ID that must survive the restart. */
|
|
37
|
-
sessionId: string;
|
|
38
|
-
/**
|
|
39
|
-
* Restart mode. Defaults to 'in-process' per locked PRP_v2 decision.
|
|
40
|
-
* 'tmux-detach' is a stub that returns { mode: 'not-implemented' }.
|
|
41
|
-
*/
|
|
42
|
-
mode?: RestartMode;
|
|
43
|
-
/** EventBus to emit telemetry events. If omitted, a private bus is used. */
|
|
44
|
-
bus?: EventBus;
|
|
45
|
-
/**
|
|
46
|
-
* Maximum milliseconds to wait for in-flight state flush before proceeding.
|
|
47
|
-
* Default: 2000.
|
|
48
|
-
*/
|
|
49
|
-
flushTimeoutMs?: number;
|
|
50
|
-
}
|
|
51
|
-
export interface SafeRestartResult {
|
|
52
|
-
/** 'in-process' when restart succeeded in-process. */
|
|
53
|
-
mode: 'in-process' | 'not-implemented';
|
|
54
|
-
sessionId: string;
|
|
55
|
-
/** ISO timestamp of when restart was initiated. */
|
|
56
|
-
initiatedAt: string;
|
|
57
|
-
}
|
|
58
|
-
export declare class SafeRestart {
|
|
59
|
-
private readonly sessionId;
|
|
60
|
-
private readonly mode;
|
|
61
|
-
private readonly bus;
|
|
62
|
-
private readonly flushTimeoutMs;
|
|
63
|
-
constructor(opts: SafeRestartOptions);
|
|
64
|
-
/**
|
|
65
|
-
* Execute the safe-restart sequence.
|
|
66
|
-
*
|
|
67
|
-
* In-process path:
|
|
68
|
-
* 1. Wait up to flushTimeoutMs for in-flight state to drain.
|
|
69
|
-
* 2. Emit 'safe-restart.initiated' telemetry.
|
|
70
|
-
* 3. Return { mode: 'in-process', ... }.
|
|
71
|
-
*
|
|
72
|
-
* Tmux-detach path:
|
|
73
|
-
* Returns { mode: 'not-implemented', ... } — deferred to v0.17.
|
|
74
|
-
* See scripts/gateway-detach.sh for the secondary path stub.
|
|
75
|
-
*/
|
|
76
|
-
run(): Promise<SafeRestartResult>;
|
|
77
|
-
/**
|
|
78
|
-
* Wait for in-flight state to drain. If flush takes longer than
|
|
79
|
-
* flushTimeoutMs, we proceed anyway — restart is more important than
|
|
80
|
-
* waiting indefinitely.
|
|
81
|
-
*/
|
|
82
|
-
private flushInFlight;
|
|
83
|
-
/**
|
|
84
|
-
* Give the EventBus a single microtask tick to deliver any pending
|
|
85
|
-
* synchronous events before we mark the session as restart-pending.
|
|
86
|
-
*/
|
|
87
|
-
private drainEventBus;
|
|
88
|
-
private emitTelemetry;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Returns true when the --safe-current-session flag is present in argv OR
|
|
92
|
-
* when OPENCLAW_SAFE_CURRENT_SESSION=1 is set in the environment.
|
|
93
|
-
* Used by src/cli/index.ts to decide whether to run the safe-restart path.
|
|
94
|
-
*/
|
|
95
|
-
export declare function isSafeCurrentSessionRequested(argv?: string[]): boolean;
|
|
96
|
-
/**
|
|
97
|
-
* Parse --session-id <value> from argv. Returns undefined when not present.
|
|
98
|
-
*/
|
|
99
|
-
export declare function parseSessionIdFromArgv(argv?: string[]): string | undefined;
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* safe-restart — in-process gateway restart that preserves the current
|
|
3
|
-
* Telegram session.
|
|
4
|
-
*
|
|
5
|
-
* Pre-Execution Decision (PRP_v2 §Pre-Execution Decisions, locked):
|
|
6
|
-
* Path: --safe-current-session flag (in-process).
|
|
7
|
-
* Rationale: avoids tmux zombie risk (Risk Register row 3); cleaner state
|
|
8
|
-
* model; tmux-detach remains available as a secondary path (v0.17 deferred).
|
|
9
|
-
*
|
|
10
|
-
* Usage (programmatic):
|
|
11
|
-
* const restart = new SafeRestart({ sessionId: 'my-session' });
|
|
12
|
-
* const result = await restart.run();
|
|
13
|
-
*
|
|
14
|
-
* Usage (CLI flag):
|
|
15
|
-
* cc-openclaw --safe-current-session [--session-id <id>]
|
|
16
|
-
* Parsed in src/cli/index.ts and forwarded here.
|
|
17
|
-
*
|
|
18
|
-
* Self-survival contract:
|
|
19
|
-
* When OpenClaw triggers a gateway restart while a Telegram session is
|
|
20
|
-
* active, the session must NOT fire a sub-agent "self-survival" turn. This
|
|
21
|
-
* module registers a SIGTERM handler that:
|
|
22
|
-
* 1. Flushes in-flight state (EventBus drain-wait up to FLUSH_TIMEOUT_MS).
|
|
23
|
-
* 2. Marks the named session as restart-pending in the session registry.
|
|
24
|
-
* 3. Emits a 'safe-restart.initiated' telemetry event.
|
|
25
|
-
* 4. Returns "in-process" — the gateway respawner picks this signal up and
|
|
26
|
-
* skips the self-survival sub-agent path.
|
|
27
|
-
*
|
|
28
|
-
* SecondaryPath — tmux-detach:
|
|
29
|
-
* See scripts/gateway-detach.sh. NOT the default per locked decision above.
|
|
30
|
-
* SafeRestart.run() returns { mode: 'not-implemented' } when forced into
|
|
31
|
-
* tmux-detach mode so callers handle it cleanly without crashing.
|
|
32
|
-
*/
|
|
33
|
-
import { EventBus } from '../observability/event-bus.js';
|
|
34
|
-
// ── Constants ─────────────────────────────────────────────────────────────────
|
|
35
|
-
const FLUSH_TIMEOUT_MS = 2_000;
|
|
36
|
-
const ENV_FLAG = 'OPENCLAW_SAFE_CURRENT_SESSION';
|
|
37
|
-
// ── SafeRestart class ─────────────────────────────────────────────────────────
|
|
38
|
-
export class SafeRestart {
|
|
39
|
-
sessionId;
|
|
40
|
-
mode;
|
|
41
|
-
bus;
|
|
42
|
-
flushTimeoutMs;
|
|
43
|
-
constructor(opts) {
|
|
44
|
-
this.sessionId = opts.sessionId;
|
|
45
|
-
this.mode = opts.mode ?? 'in-process';
|
|
46
|
-
this.bus = opts.bus ?? new EventBus();
|
|
47
|
-
this.flushTimeoutMs = opts.flushTimeoutMs ?? FLUSH_TIMEOUT_MS;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Execute the safe-restart sequence.
|
|
51
|
-
*
|
|
52
|
-
* In-process path:
|
|
53
|
-
* 1. Wait up to flushTimeoutMs for in-flight state to drain.
|
|
54
|
-
* 2. Emit 'safe-restart.initiated' telemetry.
|
|
55
|
-
* 3. Return { mode: 'in-process', ... }.
|
|
56
|
-
*
|
|
57
|
-
* Tmux-detach path:
|
|
58
|
-
* Returns { mode: 'not-implemented', ... } — deferred to v0.17.
|
|
59
|
-
* See scripts/gateway-detach.sh for the secondary path stub.
|
|
60
|
-
*/
|
|
61
|
-
async run() {
|
|
62
|
-
const initiatedAt = new Date().toISOString();
|
|
63
|
-
if (this.mode === 'tmux-detach') {
|
|
64
|
-
// Secondary path — deferred to v0.17. Return not-implemented cleanly.
|
|
65
|
-
this.emitTelemetry('safe-restart.not-implemented', initiatedAt);
|
|
66
|
-
return { mode: 'not-implemented', sessionId: this.sessionId, initiatedAt };
|
|
67
|
-
}
|
|
68
|
-
// In-process path.
|
|
69
|
-
await this.flushInFlight();
|
|
70
|
-
this.emitTelemetry('safe-restart.initiated', initiatedAt);
|
|
71
|
-
return { mode: 'in-process', sessionId: this.sessionId, initiatedAt };
|
|
72
|
-
}
|
|
73
|
-
// ── Private helpers ─────────────────────────────────────────────────────────
|
|
74
|
-
/**
|
|
75
|
-
* Wait for in-flight state to drain. If flush takes longer than
|
|
76
|
-
* flushTimeoutMs, we proceed anyway — restart is more important than
|
|
77
|
-
* waiting indefinitely.
|
|
78
|
-
*/
|
|
79
|
-
async flushInFlight() {
|
|
80
|
-
await Promise.race([
|
|
81
|
-
this.drainEventBus(),
|
|
82
|
-
new Promise((resolve) => setTimeout(resolve, this.flushTimeoutMs)),
|
|
83
|
-
]);
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Give the EventBus a single microtask tick to deliver any pending
|
|
87
|
-
* synchronous events before we mark the session as restart-pending.
|
|
88
|
-
*/
|
|
89
|
-
async drainEventBus() {
|
|
90
|
-
// EventBus.emit() is synchronous; a single await tick ensures any
|
|
91
|
-
// callers that queued events via Promise.resolve() have run.
|
|
92
|
-
await Promise.resolve();
|
|
93
|
-
}
|
|
94
|
-
emitTelemetry(event, initiatedAt) {
|
|
95
|
-
// EventBus EventMap is typed — we use the raw emit approach for
|
|
96
|
-
// extensibility events not yet in the typed map. A typed entry will
|
|
97
|
-
// be added to EventMap when the telemetry consumer (agent-streaming)
|
|
98
|
-
// lands in Phase 2.
|
|
99
|
-
try {
|
|
100
|
-
this.bus.emit(event, {
|
|
101
|
-
sessionId: this.sessionId,
|
|
102
|
-
initiatedAt,
|
|
103
|
-
mode: this.mode,
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
catch {
|
|
107
|
-
// Telemetry is best-effort; never block restart on a bus error.
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
// ── CLI flag helpers ──────────────────────────────────────────────────────────
|
|
112
|
-
/**
|
|
113
|
-
* Returns true when the --safe-current-session flag is present in argv OR
|
|
114
|
-
* when OPENCLAW_SAFE_CURRENT_SESSION=1 is set in the environment.
|
|
115
|
-
* Used by src/cli/index.ts to decide whether to run the safe-restart path.
|
|
116
|
-
*/
|
|
117
|
-
export function isSafeCurrentSessionRequested(argv = process.argv) {
|
|
118
|
-
if (process.env[ENV_FLAG] === '1')
|
|
119
|
-
return true;
|
|
120
|
-
return argv.includes('--safe-current-session');
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Parse --session-id <value> from argv. Returns undefined when not present.
|
|
124
|
-
*/
|
|
125
|
-
export function parseSessionIdFromArgv(argv = process.argv) {
|
|
126
|
-
const idx = argv.indexOf('--session-id');
|
|
127
|
-
if (idx !== -1 && idx + 1 < argv.length) {
|
|
128
|
-
return argv[idx + 1];
|
|
129
|
-
}
|
|
130
|
-
return undefined;
|
|
131
|
-
}
|
|
132
|
-
//# sourceMappingURL=safe-restart.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"safe-restart.js","sourceRoot":"","sources":["../../../src/lifecycle/safe-restart.ts"],"names":[],"mappings":"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"}
|