@astrosheep/square 0.3.49 → 0.3.50
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/claude-plugin/.claude-plugin/plugin.json +1 -1
- package/codex-plugin/.codex-plugin/plugin.json +1 -1
- package/dist/automatic-session.js +2 -2
- package/dist/boundary-presentation.js +4 -2
- package/dist/participant-host.js +1 -1
- package/dist/participant-identity.js +1 -1
- package/dist/registry.js +1 -1
- package/dist/square-projections.js +1 -1
- package/dist/square-wiring.js +1 -1
- package/extensions/square-pi.js +11 -14
- package/package.json +1 -1
|
@@ -15,7 +15,7 @@ const providerEnv = {
|
|
|
15
15
|
codex: 'CODEX_THREAD_ID',
|
|
16
16
|
claude: 'CLAUDE_CODE_SESSION_ID',
|
|
17
17
|
opencode: 'OPENCODE_SESSION_ID',
|
|
18
|
-
pi: '
|
|
18
|
+
pi: 'PI_SESSION_ID',
|
|
19
19
|
};
|
|
20
20
|
function operationEnv(provider, sessionId, env) {
|
|
21
21
|
return {
|
|
@@ -24,7 +24,7 @@ function operationEnv(provider, sessionId, env) {
|
|
|
24
24
|
CLAUDE_CODE_CHILD_SESSION: '',
|
|
25
25
|
CODEX_THREAD_ID: '',
|
|
26
26
|
OPENCODE_SESSION_ID: '',
|
|
27
|
-
|
|
27
|
+
PI_SESSION_ID: '',
|
|
28
28
|
[providerEnv[provider]]: sessionId,
|
|
29
29
|
};
|
|
30
30
|
}
|
|
@@ -7,7 +7,7 @@ import { openSquare } from './square-file-adapter.js';
|
|
|
7
7
|
import { closeOpenSquare } from './open-square.js';
|
|
8
8
|
import { presentPending } from './presentation-operations.js';
|
|
9
9
|
import { sessionInbox } from './inbox.js';
|
|
10
|
-
import {
|
|
10
|
+
import { renderAttentionPreview } from './attention-presentation.js';
|
|
11
11
|
const CONTEXT_MAX = 1200;
|
|
12
12
|
const presentationLocks = new Map();
|
|
13
13
|
function pendingCount(inbox) {
|
|
@@ -72,7 +72,9 @@ function renderBoundary(inbox) {
|
|
|
72
72
|
complete.push({
|
|
73
73
|
membership,
|
|
74
74
|
actIndexes: [notification.actIndex],
|
|
75
|
-
|
|
75
|
+
// The hook output is itself a user-visible presentation, even when the
|
|
76
|
+
// preview had to clip the body. Keep clipped items from being replayed.
|
|
77
|
+
markSeen: true,
|
|
76
78
|
});
|
|
77
79
|
}
|
|
78
80
|
return {
|
package/dist/participant-host.js
CHANGED
|
@@ -3,7 +3,7 @@ import { defaultWakeRouteCapabilities, publishWakeRoute, retireWakeRouteFromArti
|
|
|
3
3
|
export function processIdentity(env) {
|
|
4
4
|
const choices = [
|
|
5
5
|
[env.CLAUDE_CODE_SESSION_ID, 'claude-code'], [env.CODEX_THREAD_ID, 'codex'],
|
|
6
|
-
[env.OPENCODE_SESSION_ID, 'opencode'], [env.
|
|
6
|
+
[env.OPENCODE_SESSION_ID, 'opencode'], [env.PI_SESSION_ID, 'pi'], [env.PASEO_AGENT_ID, 'paseo'],
|
|
7
7
|
];
|
|
8
8
|
const found = choices.find(([session]) => session?.trim());
|
|
9
9
|
return found === undefined ? { session: `process:${process.pid}`, channel: 'unknown' } : { session: found[0].trim(), channel: found[1] };
|
|
@@ -7,7 +7,7 @@ const nativeSessions = [
|
|
|
7
7
|
{ variable: 'CLAUDE_CODE_SESSION_ID', provider: 'claude' },
|
|
8
8
|
{ variable: 'CODEX_THREAD_ID', provider: 'codex' },
|
|
9
9
|
{ variable: 'OPENCODE_SESSION_ID', provider: 'opencode' },
|
|
10
|
-
{ variable: '
|
|
10
|
+
{ variable: 'PI_SESSION_ID', provider: 'pi' },
|
|
11
11
|
];
|
|
12
12
|
export function automaticParticipant(provider, sessionId, env) {
|
|
13
13
|
const configured = env.SQUARE_PARTICIPANT_NAME?.trim();
|
package/dist/registry.js
CHANGED
|
@@ -12,7 +12,7 @@ const LOCAL_SESSION_SOURCES = [
|
|
|
12
12
|
{ variable: 'CLAUDE_CODE_SESSION_ID', channel: 'claude-code', child: 'CLAUDE_CODE_CHILD_SESSION' },
|
|
13
13
|
{ variable: 'CODEX_THREAD_ID', channel: 'codex' },
|
|
14
14
|
{ variable: 'OPENCODE_SESSION_ID', channel: 'opencode' },
|
|
15
|
-
{ variable: '
|
|
15
|
+
{ variable: 'PI_SESSION_ID', channel: 'pi' },
|
|
16
16
|
];
|
|
17
17
|
export function registryPath(env = process.env) { return env.SQUARE_REGISTRY || path.join(homedir(), '.square', 'sessions.ndjsonl'); }
|
|
18
18
|
export async function canonicalSquarePath(squarePath) { const absolute = path.resolve(squarePath); try {
|
|
@@ -28,7 +28,7 @@ export async function projectSessionBindings(input) {
|
|
|
28
28
|
return rows.map(bindingProjection);
|
|
29
29
|
}
|
|
30
30
|
export function sessionIdsFromEnvironment(env = process.env) {
|
|
31
|
-
return [env.CLAUDE_CODE_SESSION_ID, env.CODEX_THREAD_ID, env.OPENCODE_SESSION_ID, env.
|
|
31
|
+
return [env.CLAUDE_CODE_SESSION_ID, env.CODEX_THREAD_ID, env.OPENCODE_SESSION_ID, env.PI_SESSION_ID, env.PASEO_AGENT_ID]
|
|
32
32
|
.map((value) => value?.trim()).filter((value) => Boolean(value));
|
|
33
33
|
}
|
|
34
34
|
export async function projectLocalParticipantBinding(input) {
|
package/dist/square-wiring.js
CHANGED
|
@@ -85,7 +85,7 @@ export class Square {
|
|
|
85
85
|
async recognize(env) {
|
|
86
86
|
if (this.square.hostLedger === undefined)
|
|
87
87
|
return null;
|
|
88
|
-
const sessions = [env.CLAUDE_CODE_SESSION_ID, env.CODEX_THREAD_ID, env.OPENCODE_SESSION_ID, env.
|
|
88
|
+
const sessions = [env.CLAUDE_CODE_SESSION_ID, env.CODEX_THREAD_ID, env.OPENCODE_SESSION_ID, env.PI_SESSION_ID, env.PASEO_AGENT_ID]
|
|
89
89
|
.map((value) => value?.trim()).filter((value) => Boolean(value));
|
|
90
90
|
if (sessions.length === 0)
|
|
91
91
|
return null;
|
package/extensions/square-pi.js
CHANGED
|
@@ -32,7 +32,6 @@ export function renderPiInbox(inbox) {
|
|
|
32
32
|
export default function squarePiExtension(pi) {
|
|
33
33
|
let sessionId;
|
|
34
34
|
let sessionCwd;
|
|
35
|
-
let previousSessionId;
|
|
36
35
|
let watcher;
|
|
37
36
|
let watcherAbort;
|
|
38
37
|
let generation = 0;
|
|
@@ -99,6 +98,10 @@ export default function squarePiExtension(pi) {
|
|
|
99
98
|
return { promise, ack };
|
|
100
99
|
};
|
|
101
100
|
|
|
101
|
+
// Each operation carries its own session coordinate. Never rewrite the process environment:
|
|
102
|
+
// Pi owns PI_SESSION_ID and several SDK sessions may coexist in one process.
|
|
103
|
+
const sessionEnv = (id) => ({ ...process.env, ...(id === undefined ? {} : { PI_SESSION_ID: id }) });
|
|
104
|
+
|
|
102
105
|
// A transport may keep its promise pending while Pi is shutting down or
|
|
103
106
|
// replacing a session. Never make a lifecycle hook wait for that transport.
|
|
104
107
|
const stopWatcher = () => {
|
|
@@ -129,7 +132,7 @@ export default function squarePiExtension(pi) {
|
|
|
129
132
|
excludeKeys: handledPending,
|
|
130
133
|
skipImmediate: true,
|
|
131
134
|
onChangeArmed: resolveArmed,
|
|
132
|
-
}).catch(() => {
|
|
135
|
+
}, sessionEnv(sessionId)).catch(() => {
|
|
133
136
|
resolveArmed(false);
|
|
134
137
|
return [];
|
|
135
138
|
}).finally(() => signal.removeEventListener('abort', abort));
|
|
@@ -152,7 +155,7 @@ export default function squarePiExtension(pi) {
|
|
|
152
155
|
try {
|
|
153
156
|
pending = deferredRetry && retryWait !== undefined
|
|
154
157
|
? await retryWait
|
|
155
|
-
: await waitForSessionPending(sessionId, 30_000, { signal, excludeKeys: handledPending });
|
|
158
|
+
: await waitForSessionPending(sessionId, 30_000, { signal, excludeKeys: handledPending }, sessionEnv(sessionId));
|
|
156
159
|
} catch {
|
|
157
160
|
await pause(signal, 1_000);
|
|
158
161
|
continue;
|
|
@@ -194,7 +197,7 @@ export default function squarePiExtension(pi) {
|
|
|
194
197
|
return landing.promise;
|
|
195
198
|
},
|
|
196
199
|
async (id, env) => {
|
|
197
|
-
const inbox = await sessionInbox(id, env);
|
|
200
|
+
const inbox = await sessionInbox(id, env ?? sessionEnv(id));
|
|
198
201
|
if (signal.aborted || token !== generation) return [];
|
|
199
202
|
for (const key of inboxKeys(inbox)) observedPending.add(key);
|
|
200
203
|
return inbox.map((membership) => ({
|
|
@@ -204,7 +207,7 @@ export default function squarePiExtension(pi) {
|
|
|
204
207
|
)),
|
|
205
208
|
}));
|
|
206
209
|
},
|
|
207
|
-
|
|
210
|
+
sessionEnv(sessionId),
|
|
208
211
|
signal,
|
|
209
212
|
);
|
|
210
213
|
for (const key of keys) handledPending.add(key);
|
|
@@ -239,12 +242,10 @@ export default function squarePiExtension(pi) {
|
|
|
239
242
|
currentRunSignal = undefined;
|
|
240
243
|
sessionId = ctx.sessionManager.getSessionId();
|
|
241
244
|
sessionCwd = ctx.cwd || process.cwd();
|
|
242
|
-
previousSessionId = process.env.SQUARE_PI_SESSION_ID;
|
|
243
|
-
process.env.SQUARE_PI_SESSION_ID = sessionId;
|
|
244
245
|
const token = generation;
|
|
245
246
|
watcherAbort = new AbortController();
|
|
246
247
|
const signal = watcherAbort.signal;
|
|
247
|
-
void automaticSessionStart('pi', sessionId, sessionCwd).then((context) => {
|
|
248
|
+
void automaticSessionStart('pi', sessionId, sessionCwd, sessionEnv(sessionId)).then((context) => {
|
|
248
249
|
if (context === undefined || sessionId === undefined || token !== generation) return;
|
|
249
250
|
const landing = waitForLanding(context, signal, 'nextTurn');
|
|
250
251
|
try {
|
|
@@ -311,7 +312,7 @@ export default function squarePiExtension(pi) {
|
|
|
311
312
|
const token = generation;
|
|
312
313
|
// Cancel the entire pending batch, including entries not yet sent to Pi.
|
|
313
314
|
// This is local suppression, never evidence that the model saw the activity.
|
|
314
|
-
const cancelled = await sessionInbox(sessionId);
|
|
315
|
+
const cancelled = await sessionInbox(sessionId, sessionEnv(sessionId));
|
|
315
316
|
if (token !== generation || sessionId === undefined) return;
|
|
316
317
|
for (const key of inboxKeys(cancelled)) handledPending.add(key);
|
|
317
318
|
cancelledRun = false;
|
|
@@ -326,11 +327,7 @@ export default function squarePiExtension(pi) {
|
|
|
326
327
|
generation += 1;
|
|
327
328
|
failAcks(new Error('Pi session ended'));
|
|
328
329
|
stopWatcher();
|
|
329
|
-
if (sessionId && sessionCwd) void automaticSessionEnd('pi', sessionId, sessionCwd).catch(() => undefined);
|
|
330
|
-
if (process.env.SQUARE_PI_SESSION_ID === sessionId) {
|
|
331
|
-
if (previousSessionId === undefined) delete process.env.SQUARE_PI_SESSION_ID;
|
|
332
|
-
else process.env.SQUARE_PI_SESSION_ID = previousSessionId;
|
|
333
|
-
}
|
|
330
|
+
if (sessionId && sessionCwd) void automaticSessionEnd('pi', sessionId, sessionCwd, sessionEnv(sessionId)).catch(() => undefined);
|
|
334
331
|
sessionId = undefined;
|
|
335
332
|
sessionCwd = undefined;
|
|
336
333
|
retryWait = undefined;
|