@pcircle/memesh 4.9.3 → 4.10.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.
Files changed (132) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/AGENTS.md +35 -4
  5. package/README.de.md +3 -3
  6. package/README.md +3 -3
  7. package/README.zh-TW.md +3 -3
  8. package/dashboard/dist/index.html +8 -8
  9. package/dist/cli/view-live.d.ts.map +1 -1
  10. package/dist/cli/view-live.js +0 -427
  11. package/dist/cli/view-live.js.map +1 -1
  12. package/dist/core/briefing-index.d.ts +30 -0
  13. package/dist/core/briefing-index.d.ts.map +1 -0
  14. package/dist/core/briefing-index.js +140 -0
  15. package/dist/core/briefing-index.js.map +1 -0
  16. package/dist/core/briefing.d.ts +4 -0
  17. package/dist/core/briefing.d.ts.map +1 -1
  18. package/dist/core/briefing.js +42 -4
  19. package/dist/core/briefing.js.map +1 -1
  20. package/dist/core/capture-liveness.d.ts +136 -0
  21. package/dist/core/capture-liveness.d.ts.map +1 -0
  22. package/dist/core/capture-liveness.js +447 -0
  23. package/dist/core/capture-liveness.js.map +1 -0
  24. package/dist/core/config.d.ts +1 -0
  25. package/dist/core/config.d.ts.map +1 -1
  26. package/dist/core/config.js +3 -1
  27. package/dist/core/config.js.map +1 -1
  28. package/dist/core/delegation.d.ts +47 -0
  29. package/dist/core/delegation.d.ts.map +1 -0
  30. package/dist/core/delegation.js +174 -0
  31. package/dist/core/delegation.js.map +1 -0
  32. package/dist/core/doctor-fixes.d.ts +1 -0
  33. package/dist/core/doctor-fixes.d.ts.map +1 -1
  34. package/dist/core/doctor-fixes.js +21 -0
  35. package/dist/core/doctor-fixes.js.map +1 -1
  36. package/dist/core/doctor.d.ts +8 -0
  37. package/dist/core/doctor.d.ts.map +1 -1
  38. package/dist/core/doctor.js +148 -3
  39. package/dist/core/doctor.js.map +1 -1
  40. package/dist/core/note-derive.d.ts +14 -0
  41. package/dist/core/note-derive.d.ts.map +1 -0
  42. package/dist/core/note-derive.js +66 -0
  43. package/dist/core/note-derive.js.map +1 -0
  44. package/dist/core/note-ingest.d.ts +34 -0
  45. package/dist/core/note-ingest.d.ts.map +1 -0
  46. package/dist/core/note-ingest.js +445 -0
  47. package/dist/core/note-ingest.js.map +1 -0
  48. package/dist/core/operations.d.ts +10 -1
  49. package/dist/core/operations.d.ts.map +1 -1
  50. package/dist/core/operations.js +129 -14
  51. package/dist/core/operations.js.map +1 -1
  52. package/dist/core/paths.d.ts.map +1 -1
  53. package/dist/core/paths.js.map +1 -1
  54. package/dist/core/schema-export.d.ts.map +1 -1
  55. package/dist/core/schema-export.js +10 -4
  56. package/dist/core/schema-export.js.map +1 -1
  57. package/dist/core/serializer.d.ts.map +1 -1
  58. package/dist/core/serializer.js +3 -0
  59. package/dist/core/serializer.js.map +1 -1
  60. package/dist/core/session-insight.d.ts +44 -0
  61. package/dist/core/session-insight.d.ts.map +1 -0
  62. package/dist/core/session-insight.js +216 -0
  63. package/dist/core/session-insight.js.map +1 -0
  64. package/dist/core/task-state-store.d.ts +4 -0
  65. package/dist/core/task-state-store.d.ts.map +1 -1
  66. package/dist/core/task-state-store.js +18 -5
  67. package/dist/core/task-state-store.js.map +1 -1
  68. package/dist/core/turn-signal.d.ts +22 -0
  69. package/dist/core/turn-signal.d.ts.map +1 -0
  70. package/dist/core/turn-signal.js +89 -0
  71. package/dist/core/turn-signal.js.map +1 -0
  72. package/dist/core/types.d.ts +12 -3
  73. package/dist/core/types.d.ts.map +1 -1
  74. package/dist/core/update-entrypoint.d.ts +19 -0
  75. package/dist/core/update-entrypoint.d.ts.map +1 -0
  76. package/dist/core/update-entrypoint.js +222 -0
  77. package/dist/core/update-entrypoint.js.map +1 -0
  78. package/dist/core/update-notice.d.ts +69 -0
  79. package/dist/core/update-notice.d.ts.map +1 -0
  80. package/dist/core/update-notice.js +188 -0
  81. package/dist/core/update-notice.js.map +1 -0
  82. package/dist/host-runtime/codex-session.d.ts +10 -0
  83. package/dist/host-runtime/codex-session.d.ts.map +1 -1
  84. package/dist/host-runtime/codex-session.js +1 -1
  85. package/dist/host-runtime/codex-session.js.map +1 -1
  86. package/dist/knowledge-graph.d.ts.map +1 -1
  87. package/dist/knowledge-graph.js +24 -3
  88. package/dist/knowledge-graph.js.map +1 -1
  89. package/dist/mcp/THIRD_PARTY_NOTICES.txt +2 -2
  90. package/dist/mcp/server.js +1079 -90
  91. package/dist/mcp/server.js.map +3 -3
  92. package/dist/skills-manifest.json +49 -24
  93. package/dist/transports/cli/cli.d.ts.map +1 -1
  94. package/dist/transports/cli/cli.js +7702 -5764
  95. package/dist/transports/cli/cli.js.map +3 -3
  96. package/dist/transports/http/server.d.ts.map +1 -1
  97. package/dist/transports/http/server.js +38 -27
  98. package/dist/transports/http/server.js.map +1 -1
  99. package/dist/transports/mcp/handlers.d.ts +25 -5
  100. package/dist/transports/mcp/handlers.d.ts.map +1 -1
  101. package/dist/transports/mcp/handlers.js +43 -5
  102. package/dist/transports/mcp/handlers.js.map +1 -1
  103. package/dist/transports/schemas.d.ts +4 -2
  104. package/dist/transports/schemas.d.ts.map +1 -1
  105. package/dist/transports/schemas.js +29 -3
  106. package/dist/transports/schemas.js.map +1 -1
  107. package/docs/platforms/README.md +1 -0
  108. package/docs/platforms/agent-messaging.md +22 -5
  109. package/package.json +17 -4
  110. package/scripts/check-plugin-hook-artifact.mjs +212 -0
  111. package/scripts/hooks/_generated/briefing-index.js +147 -0
  112. package/scripts/hooks/_generated/capture-liveness.js +454 -0
  113. package/scripts/hooks/_generated/update-notice.js +195 -0
  114. package/scripts/hooks/_shared.js +302 -14
  115. package/scripts/hooks/_stop-notes.js +504 -0
  116. package/scripts/hooks/auto-update-runner.mjs +22 -0
  117. package/scripts/hooks/decision-nudge.js +32 -5
  118. package/scripts/hooks/guard-check.js +30 -3
  119. package/scripts/hooks/post-commit.js +329 -133
  120. package/scripts/hooks/pre-compact.js +17 -2
  121. package/scripts/hooks/pre-edit-recall.js +32 -1
  122. package/scripts/hooks/session-start.js +361 -78
  123. package/scripts/hooks/session-summary.js +217 -41
  124. package/scripts/hooks/user-prompt-intent.js +89 -19
  125. package/scripts/lib/npm-bin.mjs +123 -0
  126. package/scripts/upgrade-plugin.sh +24 -0
  127. package/skills/memesh/SKILL.md +20 -8
  128. package/dist/cli/assets/d3.v7.min.js +0 -2
  129. package/dist/core/graph.d.ts +0 -26
  130. package/dist/core/graph.d.ts.map +0 -1
  131. package/dist/core/graph.js +0 -74
  132. package/dist/core/graph.js.map +0 -1
@@ -0,0 +1,222 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { spawn } from 'child_process';
4
+ import { fileURLToPath } from 'url';
5
+ import { memeshDir } from './paths.js';
6
+ import { getLastUpdateCheck } from './version-check.js';
7
+ import { claimJustUpgradedMarker, resolveUpdateNotice, shouldRefreshUpdateCache } from './update-notice.js';
8
+ export const RECENT_HOOK_NOTICE_MS = 10 * 60 * 1000;
9
+ export const CLI_NOTICE_THROTTLE_MS = 24 * 60 * 60 * 1000;
10
+ export const FRESH_CHECK_THROTTLE_MS = 5 * 60 * 1000;
11
+ export function formatUpdateNoticeLine(notice) {
12
+ switch (notice.kind) {
13
+ case 'UPGRADE_AVAILABLE':
14
+ return `[memesh update] ${notice.latestVersion} is available (you are on ${notice.currentVersion}). Run \`memesh update\`, or reply “Not now” / “Never ask again” in a hooked session.`;
15
+ case 'JUST_UPGRADED':
16
+ return `[memesh update] Upgraded ${notice.from} → ${notice.to}. Processes started before the upgrade keep running ${notice.from} until they restart.`;
17
+ case 'CHECK_FAILED':
18
+ return `[memesh update] Could not confirm whether an update exists (${notice.reason}). Status is unknown, not current — \`memesh status\` retries.`;
19
+ default:
20
+ return null;
21
+ }
22
+ }
23
+ export function recentHookNoticeExists(dir, currentVersion, latestVersion, now = new Date()) {
24
+ const claims = path.join(dir, 'update-prompt-claims');
25
+ let names;
26
+ try {
27
+ names = fs.readdirSync(claims);
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ for (const name of names) {
33
+ if (!name.endsWith('.json'))
34
+ continue;
35
+ const file = path.join(claims, name);
36
+ let fd = null;
37
+ try {
38
+ fd = fs.openSync(file, 'r');
39
+ const stat = fs.fstatSync(fd);
40
+ if (now.getTime() - stat.mtimeMs > RECENT_HOOK_NOTICE_MS)
41
+ continue;
42
+ const value = JSON.parse(fs.readFileSync(fd, 'utf8'));
43
+ if (value.currentVersion === currentVersion && (latestVersion === null || value.latestVersion === latestVersion))
44
+ return true;
45
+ }
46
+ catch {
47
+ }
48
+ finally {
49
+ if (fd !== null)
50
+ try {
51
+ fs.closeSync(fd);
52
+ }
53
+ catch { }
54
+ }
55
+ }
56
+ return false;
57
+ }
58
+ function updateCheckEnabledIn(dir) {
59
+ try {
60
+ const raw = JSON.parse(fs.readFileSync(path.join(dir, 'config.json'), 'utf8'));
61
+ return raw.updateCheck !== false;
62
+ }
63
+ catch {
64
+ return true;
65
+ }
66
+ }
67
+ function cliThrottled(dir, currentVersion, now) {
68
+ const tag = /^[0-9A-Za-z.+-]+$/.test(currentVersion) ? currentVersion : 'unknown';
69
+ const marker = path.join(dir, `last-cli-update-notice.${tag}.lock`);
70
+ let fd = null;
71
+ try {
72
+ try {
73
+ fd = fs.openSync(marker, 'r+');
74
+ }
75
+ catch (err) {
76
+ const code = err.code;
77
+ if (code !== 'ENOENT') {
78
+ return true;
79
+ }
80
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
81
+ try {
82
+ fd = fs.openSync(marker, 'wx', 0o600);
83
+ }
84
+ catch (raceErr) {
85
+ if (raceErr.code === 'EEXIST')
86
+ return true;
87
+ throw raceErr;
88
+ }
89
+ fs.writeSync(fd, String(now.getTime()));
90
+ return false;
91
+ }
92
+ const stat = fs.fstatSync(fd);
93
+ if (now.getTime() - stat.mtimeMs < CLI_NOTICE_THROTTLE_MS)
94
+ return true;
95
+ fs.ftruncateSync(fd, 0);
96
+ fs.writeSync(fd, String(now.getTime()), 0);
97
+ try {
98
+ fs.fchmodSync(fd, 0o600);
99
+ }
100
+ catch { }
101
+ return false;
102
+ }
103
+ catch {
104
+ return true;
105
+ }
106
+ finally {
107
+ if (fd !== null)
108
+ try {
109
+ fs.closeSync(fd);
110
+ }
111
+ catch { }
112
+ }
113
+ }
114
+ function spawnCacheRefresh(dir, currentVersion, now) {
115
+ try {
116
+ const cliPath = fileURLToPath(new URL('../transports/cli/cli.js', import.meta.url));
117
+ if (!fs.existsSync(cliPath))
118
+ return false;
119
+ const tag = /^[0-9A-Za-z.+-]+$/.test(currentVersion) ? currentVersion : 'unknown';
120
+ const marker = path.join(dir, `last-fresh-refresh.${tag}.lock`);
121
+ try {
122
+ if (now.getTime() - fs.statSync(marker).mtimeMs < FRESH_CHECK_THROTTLE_MS)
123
+ return false;
124
+ fs.unlinkSync(marker);
125
+ }
126
+ catch { }
127
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
128
+ try {
129
+ const fd = fs.openSync(marker, 'wx', 0o600);
130
+ try {
131
+ fs.writeSync(fd, `${process.pid}-${now.getTime()}`);
132
+ }
133
+ finally {
134
+ fs.closeSync(fd);
135
+ }
136
+ }
137
+ catch {
138
+ return false;
139
+ }
140
+ const child = spawn(process.execPath, [cliPath, 'status'], {
141
+ detached: true, stdio: 'ignore', env: { ...process.env }, windowsHide: true,
142
+ });
143
+ child.unref();
144
+ return true;
145
+ }
146
+ catch {
147
+ return false;
148
+ }
149
+ }
150
+ export const MCP_PENDING_RETRY_MS = 60 * 1000;
151
+ class ProcessMemo {
152
+ set;
153
+ key;
154
+ now;
155
+ retryPrefix;
156
+ constructor(set, key, now) {
157
+ this.set = set;
158
+ this.key = key;
159
+ this.now = now;
160
+ this.retryPrefix = `${key}#retry:`;
161
+ }
162
+ decided() {
163
+ if (!this.set)
164
+ return false;
165
+ if (this.set.has(this.key))
166
+ return true;
167
+ for (const entry of this.set) {
168
+ if (entry.startsWith(this.retryPrefix) && this.now.getTime() < Number(entry.slice(this.retryPrefix.length)))
169
+ return true;
170
+ }
171
+ return false;
172
+ }
173
+ decide() { this.clearRetry(); this.set?.add(this.key); }
174
+ retryLater() { this.clearRetry(); this.set?.add(`${this.retryPrefix}${this.now.getTime() + MCP_PENDING_RETRY_MS}`); }
175
+ clearRetry() {
176
+ if (!this.set)
177
+ return;
178
+ for (const entry of [...this.set])
179
+ if (entry.startsWith(this.retryPrefix))
180
+ this.set.delete(entry);
181
+ }
182
+ }
183
+ export function updateNoticeForEntryPoint(input) {
184
+ try {
185
+ const now = input.now ?? new Date();
186
+ const memo = input.entryPoint === 'mcp' ? new ProcessMemo(input.processOnce, input.currentVersion, now) : null;
187
+ if (memo?.decided())
188
+ return null;
189
+ const dir = input.dir ?? memeshDir();
190
+ const updateCheckEnabled = input.updateCheckEnabled ?? updateCheckEnabledIn(dir);
191
+ const tag = /^[0-9A-Za-z.+-]+$/.test(input.currentVersion) ? input.currentVersion : 'unknown';
192
+ const cache = getLastUpdateCheck(input.currentVersion, { now, updateCheckPath: path.join(dir, `update-check.${tag}.json`) });
193
+ if (updateCheckEnabled && shouldRefreshUpdateCache(input.currentVersion, cache, now)) {
194
+ (input.refresh ?? spawnCacheRefresh)(dir, input.currentVersion, now);
195
+ }
196
+ const notice = resolveUpdateNotice({ dir, currentVersion: input.currentVersion, cache, now, updateCheckEnabled });
197
+ if (notice.kind === 'CHECK_FAILED' && !notice.attempted) {
198
+ memo?.retryLater();
199
+ return null;
200
+ }
201
+ memo?.decide();
202
+ if (notice.kind === 'DISABLED' || notice.kind === 'SNOOZED' || notice.kind === 'UP_TO_DATE')
203
+ return null;
204
+ if (input.entryPoint === 'mcp'
205
+ && recentHookNoticeExists(dir, notice.currentVersion, notice.kind === 'UPGRADE_AVAILABLE' ? notice.latestVersion : null, now)) {
206
+ return null;
207
+ }
208
+ if (input.entryPoint === 'cli' && cliThrottled(dir, input.currentVersion, now))
209
+ return null;
210
+ if (notice.kind === 'JUST_UPGRADED') {
211
+ const claimed = claimJustUpgradedMarker(dir);
212
+ if (!claimed)
213
+ return null;
214
+ return formatUpdateNoticeLine({ ...notice, from: claimed.from, to: claimed.to });
215
+ }
216
+ return formatUpdateNoticeLine(notice);
217
+ }
218
+ catch {
219
+ return null;
220
+ }
221
+ }
222
+ //# sourceMappingURL=update-entrypoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-entrypoint.js","sourceRoot":"","sources":["../../src/core/update-entrypoint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ export declare const UP_TO_DATE_REFRESH_MS: number;
2
+ export declare const UPGRADE_AVAILABLE_REFRESH_MS: number;
3
+ export declare const ANSWER_VALID_MS: number;
4
+ export declare const SNOOZE_LEVEL_MS: readonly [number, number, number];
5
+ export interface UpdateCheckCacheLike {
6
+ currentVersion?: string | null;
7
+ latestVersion?: string | null;
8
+ lastSuccessfulCheckAt?: string | null;
9
+ lastAttemptAt?: string | null;
10
+ checkSucceeded?: boolean;
11
+ lastError?: string | null;
12
+ }
13
+ export type UpdateNotice = {
14
+ kind: 'DISABLED';
15
+ currentVersion: string;
16
+ } | {
17
+ kind: 'JUST_UPGRADED';
18
+ currentVersion: string;
19
+ from: string;
20
+ to: string;
21
+ } | {
22
+ kind: 'CHECK_FAILED';
23
+ currentVersion: string;
24
+ reason: string;
25
+ attempted: boolean;
26
+ } | {
27
+ kind: 'SNOOZED';
28
+ currentVersion: string;
29
+ latestVersion: string;
30
+ until: string;
31
+ level: number;
32
+ } | {
33
+ kind: 'UPGRADE_AVAILABLE';
34
+ currentVersion: string;
35
+ latestVersion: string;
36
+ } | {
37
+ kind: 'UP_TO_DATE';
38
+ currentVersion: string;
39
+ latestVersion: string;
40
+ };
41
+ export interface SnoozeState {
42
+ target: string;
43
+ level: number;
44
+ since: string;
45
+ }
46
+ export interface JustUpgradedMarker {
47
+ from: string;
48
+ to: string;
49
+ at: string;
50
+ }
51
+ export declare function isStrictlyOlder(a: string, b: string): boolean;
52
+ export declare function readSnooze(dir: string): SnoozeState | null;
53
+ export declare function writeSnooze(dir: string, target: string, now?: Date): SnoozeState;
54
+ export declare function clearSnooze(dir: string): void;
55
+ export declare function snoozeExpiresAt(state: SnoozeState): number;
56
+ export declare function readJustUpgradedMarker(dir: string): JustUpgradedMarker | null;
57
+ export declare function writeJustUpgradedMarker(dir: string, from: string, to: string, now?: Date): void;
58
+ export declare function clearJustUpgradedMarker(dir: string): void;
59
+ export declare function claimJustUpgradedMarker(dir: string): JustUpgradedMarker | null;
60
+ export declare function shouldRefreshUpdateCache(currentVersion: string, cache: UpdateCheckCacheLike | null | undefined, now?: Date): boolean;
61
+ export interface ResolveUpdateNoticeInput {
62
+ dir: string;
63
+ currentVersion: string;
64
+ cache: UpdateCheckCacheLike | null | undefined;
65
+ now?: Date;
66
+ updateCheckEnabled?: boolean;
67
+ }
68
+ export declare function resolveUpdateNotice(input: ResolveUpdateNoticeInput): UpdateNotice;
69
+ //# sourceMappingURL=update-notice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-notice.d.ts","sourceRoot":"","sources":["../../src/core/update-notice.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,188 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { redactUserPaths } from './paths.js';
4
+ export const UP_TO_DATE_REFRESH_MS = 60 * 60 * 1000;
5
+ export const UPGRADE_AVAILABLE_REFRESH_MS = 12 * 60 * 60 * 1000;
6
+ export const ANSWER_VALID_MS = 24 * 60 * 60 * 1000;
7
+ export const SNOOZE_LEVEL_MS = [24 * 60 * 60 * 1000, 48 * 60 * 60 * 1000, 7 * 24 * 60 * 60 * 1000];
8
+ const SNOOZE_FILE = 'update-snooze.json';
9
+ const JUST_UPGRADED_FILE = 'just-upgraded.json';
10
+ export function isStrictlyOlder(a, b) {
11
+ const parse = (v) => {
12
+ const [main, ...rest] = String(v).split(/[-+]/);
13
+ const nums = main.split('.').map((s) => Number.parseInt(s, 10));
14
+ return { nums, tail: rest.join('-') };
15
+ };
16
+ const pa = parse(a);
17
+ const pb = parse(b);
18
+ const len = Math.max(pa.nums.length, pb.nums.length);
19
+ for (let i = 0; i < len; i++) {
20
+ const ai = Number.isFinite(pa.nums[i]) ? pa.nums[i] : 0;
21
+ const bi = Number.isFinite(pb.nums[i]) ? pb.nums[i] : 0;
22
+ if (ai !== bi)
23
+ return ai < bi;
24
+ }
25
+ if (pa.tail && !pb.tail)
26
+ return true;
27
+ if (!pa.tail && pb.tail)
28
+ return false;
29
+ return pa.tail < pb.tail;
30
+ }
31
+ function parseIso(value) {
32
+ if (typeof value !== 'string')
33
+ return null;
34
+ const t = Date.parse(value);
35
+ return Number.isNaN(t) ? null : t;
36
+ }
37
+ function readJson(file) {
38
+ try {
39
+ if (!fs.existsSync(file))
40
+ return null;
41
+ const parsed = JSON.parse(fs.readFileSync(file, 'utf8'));
42
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : null;
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ }
48
+ function writePrivateJson(file, value) {
49
+ fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });
50
+ fs.writeFileSync(file, JSON.stringify(value, null, 2), { mode: 0o600 });
51
+ try {
52
+ fs.chmodSync(file, 0o600);
53
+ }
54
+ catch { }
55
+ }
56
+ export function readSnooze(dir) {
57
+ const raw = readJson(path.join(dir, SNOOZE_FILE));
58
+ if (!raw)
59
+ return null;
60
+ const { target, level, since } = raw;
61
+ if (typeof target !== 'string' || !target)
62
+ return null;
63
+ if (typeof level !== 'number' || !Number.isInteger(level) || level < 1)
64
+ return null;
65
+ if (parseIso(since) === null)
66
+ return null;
67
+ return { target, level, since: since };
68
+ }
69
+ export function writeSnooze(dir, target, now = new Date()) {
70
+ const previous = readSnooze(dir);
71
+ const level = previous && previous.target === target
72
+ ? Math.min(previous.level + 1, SNOOZE_LEVEL_MS.length)
73
+ : 1;
74
+ const state = { target, level, since: now.toISOString() };
75
+ writePrivateJson(path.join(dir, SNOOZE_FILE), state);
76
+ return state;
77
+ }
78
+ export function clearSnooze(dir) {
79
+ try {
80
+ fs.unlinkSync(path.join(dir, SNOOZE_FILE));
81
+ }
82
+ catch { }
83
+ }
84
+ export function snoozeExpiresAt(state) {
85
+ const since = parseIso(state.since) ?? 0;
86
+ const duration = SNOOZE_LEVEL_MS[Math.min(state.level, SNOOZE_LEVEL_MS.length) - 1];
87
+ return since + duration;
88
+ }
89
+ export function readJustUpgradedMarker(dir) {
90
+ const raw = readJson(path.join(dir, JUST_UPGRADED_FILE));
91
+ if (!raw)
92
+ return null;
93
+ const { from, to, at } = raw;
94
+ if (typeof from !== 'string' || !from || typeof to !== 'string' || !to)
95
+ return null;
96
+ return { from, to, at: typeof at === 'string' ? at : '' };
97
+ }
98
+ export function writeJustUpgradedMarker(dir, from, to, now = new Date()) {
99
+ writePrivateJson(path.join(dir, JUST_UPGRADED_FILE), { from, to, at: now.toISOString() });
100
+ }
101
+ export function clearJustUpgradedMarker(dir) {
102
+ try {
103
+ fs.unlinkSync(path.join(dir, JUST_UPGRADED_FILE));
104
+ }
105
+ catch { }
106
+ }
107
+ export function claimJustUpgradedMarker(dir) {
108
+ const file = path.join(dir, JUST_UPGRADED_FILE);
109
+ const taken = `${file}.claimed-${process.pid}-${Math.random().toString(36).slice(2, 8)}`;
110
+ try {
111
+ fs.renameSync(file, taken);
112
+ }
113
+ catch {
114
+ return null;
115
+ }
116
+ const raw = readJson(taken);
117
+ try {
118
+ fs.unlinkSync(taken);
119
+ }
120
+ catch { }
121
+ if (!raw)
122
+ return null;
123
+ const { from, to, at } = raw;
124
+ if (typeof from !== 'string' || !from || typeof to !== 'string' || !to)
125
+ return null;
126
+ return { from, to, at: typeof at === 'string' ? at : '' };
127
+ }
128
+ function boundedReason(raw) {
129
+ const oneLine = redactUserPaths(raw).replace(/[\u0000-\u001f\u007f]+/g, ' ').replace(/\s+/g, ' ').trim();
130
+ return oneLine.length > 160 ? `${oneLine.slice(0, 157)}...` : oneLine;
131
+ }
132
+ function answerIsCurrent(currentVersion, cache, now) {
133
+ if (!cache || cache.currentVersion !== currentVersion)
134
+ return false;
135
+ if (typeof cache.latestVersion !== 'string' || !cache.latestVersion)
136
+ return false;
137
+ const successAt = parseIso(cache.lastSuccessfulCheckAt);
138
+ if (successAt === null)
139
+ return false;
140
+ return now.getTime() - successAt <= ANSWER_VALID_MS;
141
+ }
142
+ export function shouldRefreshUpdateCache(currentVersion, cache, now = new Date()) {
143
+ if (!answerIsCurrent(currentVersion, cache, now))
144
+ return true;
145
+ const successAt = parseIso(cache.lastSuccessfulCheckAt);
146
+ const age = now.getTime() - successAt;
147
+ const upgrade = isStrictlyOlder(currentVersion, cache.latestVersion);
148
+ return age > (upgrade ? UPGRADE_AVAILABLE_REFRESH_MS : UP_TO_DATE_REFRESH_MS);
149
+ }
150
+ export function resolveUpdateNotice(input) {
151
+ const { dir, currentVersion, cache } = input;
152
+ const now = input.now ?? new Date();
153
+ if (input.updateCheckEnabled === false)
154
+ return { kind: 'DISABLED', currentVersion };
155
+ const marker = readJustUpgradedMarker(dir);
156
+ if (marker) {
157
+ if (marker.to === currentVersion) {
158
+ return { kind: 'JUST_UPGRADED', currentVersion, from: marker.from, to: marker.to };
159
+ }
160
+ clearJustUpgradedMarker(dir);
161
+ }
162
+ if (!answerIsCurrent(currentVersion, cache, now)) {
163
+ let reason = 'no update check has completed yet';
164
+ let attempted = false;
165
+ if (cache && cache.currentVersion === currentVersion) {
166
+ attempted = parseIso(cache.lastSuccessfulCheckAt) !== null
167
+ || (typeof cache.lastError === 'string' && cache.lastError.length > 0);
168
+ if (typeof cache.lastError === 'string' && cache.lastError)
169
+ reason = boundedReason(cache.lastError);
170
+ else if (parseIso(cache.lastSuccessfulCheckAt) !== null)
171
+ reason = 'the last successful check is more than a day old';
172
+ }
173
+ return { kind: 'CHECK_FAILED', currentVersion, reason, attempted };
174
+ }
175
+ const latestVersion = cache.latestVersion;
176
+ if (!isStrictlyOlder(currentVersion, latestVersion)) {
177
+ return { kind: 'UP_TO_DATE', currentVersion, latestVersion };
178
+ }
179
+ const snooze = readSnooze(dir);
180
+ if (snooze && snooze.target === latestVersion) {
181
+ const until = snoozeExpiresAt(snooze);
182
+ if (now.getTime() < until) {
183
+ return { kind: 'SNOOZED', currentVersion, latestVersion, until: new Date(until).toISOString(), level: snooze.level };
184
+ }
185
+ }
186
+ return { kind: 'UPGRADE_AVAILABLE', currentVersion, latestVersion };
187
+ }
188
+ //# sourceMappingURL=update-notice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-notice.js","sourceRoot":"","sources":["../../src/core/update-notice.ts"],"names":[],"mappings":"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"}
@@ -16,12 +16,21 @@ export interface CodexSessionStartInput {
16
16
  cwd?: unknown;
17
17
  source?: unknown;
18
18
  }
19
+ interface CodexCompanionState {
20
+ version: 1;
21
+ pid: number;
22
+ thread_id: string;
23
+ workspace: string;
24
+ token: string;
25
+ control_socket: string;
26
+ }
19
27
  export interface CodexSessionCompanionDependencies {
20
28
  connect?: typeof connectRouterHost;
21
29
  realpath?: typeof fs.realpathSync;
22
30
  }
23
31
  export declare function codexCompanionStatePath(dataDir: string, threadId: string): string;
24
32
  export declare function codexCompanionControlSocketPath(dataDir: string, threadId: string): string;
33
+ export declare function requestExactCompanionControl(state: CodexCompanionState, action: 'terminate' | 'retire'): Promise<boolean>;
25
34
  export declare function supersedeCodexSessionCompanion(dataDir: string, hookInput: CodexSessionStartInput, environment: {
26
35
  PLUGIN_ROOT?: string;
27
36
  }, realpath?: typeof fs.realpathSync): Promise<boolean>;
@@ -31,4 +40,5 @@ export declare function startCodexSessionCompanion(config: CodexSessionHostConfi
31
40
  export declare function endCodexSessionCompanion(dataDir: string, hookInput: CodexSessionStartInput, environment: {
32
41
  PLUGIN_ROOT?: string;
33
42
  }, realpath?: typeof fs.realpathSync): Promise<boolean>;
43
+ export {};
34
44
  //# sourceMappingURL=codex-session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex-session.d.ts","sourceRoot":"","sources":["../../src/host-runtime/codex-session.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,SAAS,CAAC;AAgBzB,OAAO,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAKlF,MAAM,WAAW,sBAAuB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACrE,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAWD,MAAM,WAAW,iCAAiC;IAChD,OAAO,CAAC,EAAE,OAAO,iBAAiB,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,YAAY,CAAC;CACnC;AAmBD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKzF;AAoLD,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,sBAAsB,EACjC,WAAW,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EACrC,QAAQ,GAAE,OAAO,EAAE,CAAC,YAA8B,GACjD,OAAO,CAAC,OAAO,CAAC,CAKlB;AAsCD,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,sBAAsB,GAAG,SAAS,EAC1C,SAAS,EAAE,sBAAsB,EACjC,WAAW,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EACrC,YAAY,GAAE,iCAAsC,GACnD,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAKtC;AAmLD,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,sBAAsB,EACjC,WAAW,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EACrC,QAAQ,GAAE,OAAO,EAAE,CAAC,YAA8B,GACjD,OAAO,CAAC,OAAO,CAAC,CAKlB"}
1
+ {"version":3,"file":"codex-session.d.ts","sourceRoot":"","sources":["../../src/host-runtime/codex-session.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,SAAS,CAAC;AAgBzB,OAAO,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAKlF,MAAM,WAAW,sBAAuB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACrE,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,mBAAmB;IAC3B,OAAO,EAAE,CAAC,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iCAAiC;IAChD,OAAO,CAAC,EAAE,OAAO,iBAAiB,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,YAAY,CAAC;CACnC;AAmBD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKzF;AAuID,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,mBAAmB,EAC1B,MAAM,EAAE,WAAW,GAAG,QAAQ,GAC7B,OAAO,CAAC,OAAO,CAAC,CAiBlB;AA0BD,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,sBAAsB,EACjC,WAAW,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EACrC,QAAQ,GAAE,OAAO,EAAE,CAAC,YAA8B,GACjD,OAAO,CAAC,OAAO,CAAC,CAKlB;AAsCD,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,sBAAsB,GAAG,SAAS,EAC1C,SAAS,EAAE,sBAAsB,EACjC,WAAW,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EACrC,YAAY,GAAE,iCAAsC,GACnD,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAKtC;AAmLD,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,sBAAsB,EACjC,WAAW,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EACrC,QAAQ,GAAE,OAAO,EAAE,CAAC,YAA8B,GACjD,OAAO,CAAC,OAAO,CAAC,CAKlB"}
@@ -174,7 +174,7 @@ function removeStaleState(statePath, state) {
174
174
  throw error;
175
175
  }
176
176
  }
177
- async function requestExactCompanionControl(state, action) {
177
+ export async function requestExactCompanionControl(state, action) {
178
178
  return new Promise((resolve) => {
179
179
  const socket = net.createConnection(state.control_socket);
180
180
  let response = '';