@yu_robotics/remote-cli 1.6.158 → 1.6.166

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 (73) hide show
  1. package/README.md +12 -3
  2. package/dist/client/MessageHandler.d.ts +4 -5
  3. package/dist/client/MessageHandler.d.ts.map +1 -1
  4. package/dist/client/MessageHandler.js +121 -22
  5. package/dist/client/MessageHandler.js.map +1 -1
  6. package/dist/commands/config.d.ts.map +1 -1
  7. package/dist/commands/config.js +15 -0
  8. package/dist/commands/config.js.map +1 -1
  9. package/dist/commands/session.d.ts +17 -0
  10. package/dist/commands/session.d.ts.map +1 -0
  11. package/dist/commands/session.js +37 -0
  12. package/dist/commands/session.js.map +1 -0
  13. package/dist/delegation/GitCheckpoint.d.ts +1 -0
  14. package/dist/delegation/GitCheckpoint.d.ts.map +1 -1
  15. package/dist/delegation/GitCheckpoint.js +15 -4
  16. package/dist/delegation/GitCheckpoint.js.map +1 -1
  17. package/dist/executor/ClaudePersistentExecutor.d.ts.map +1 -1
  18. package/dist/executor/ClaudePersistentExecutor.js +18 -8
  19. package/dist/executor/ClaudePersistentExecutor.js.map +1 -1
  20. package/dist/executor/IExecutor.d.ts +21 -0
  21. package/dist/executor/IExecutor.d.ts.map +1 -1
  22. package/dist/executor/PiExecutor.d.ts +26 -1
  23. package/dist/executor/PiExecutor.d.ts.map +1 -1
  24. package/dist/executor/PiExecutor.js +256 -15
  25. package/dist/executor/PiExecutor.js.map +1 -1
  26. package/dist/index.js +19 -0
  27. package/dist/index.js.map +1 -1
  28. package/dist/maintenance/release-notes.json +1 -1
  29. package/dist/session/SessionCatalog.d.ts +76 -0
  30. package/dist/session/SessionCatalog.d.ts.map +1 -0
  31. package/dist/session/SessionCatalog.js +197 -0
  32. package/dist/session/SessionCatalog.js.map +1 -0
  33. package/dist/session/SessionControl.d.ts +56 -0
  34. package/dist/session/SessionControl.d.ts.map +1 -0
  35. package/dist/session/SessionControl.js +262 -0
  36. package/dist/session/SessionControl.js.map +1 -0
  37. package/dist/session/SessionLocalInfo.d.ts +48 -0
  38. package/dist/session/SessionLocalInfo.d.ts.map +1 -0
  39. package/dist/session/SessionLocalInfo.js +145 -0
  40. package/dist/session/SessionLocalInfo.js.map +1 -0
  41. package/dist/session/SessionMenu.d.ts +102 -0
  42. package/dist/session/SessionMenu.d.ts.map +1 -0
  43. package/dist/session/SessionMenu.js +144 -0
  44. package/dist/session/SessionMenu.js.map +1 -0
  45. package/dist/session/SessionResumeService.d.ts +38 -0
  46. package/dist/session/SessionResumeService.d.ts.map +1 -0
  47. package/dist/session/SessionResumeService.js +147 -0
  48. package/dist/session/SessionResumeService.js.map +1 -0
  49. package/dist/session/adapters/ClaudeSessionCatalog.d.ts +10 -0
  50. package/dist/session/adapters/ClaudeSessionCatalog.d.ts.map +1 -0
  51. package/dist/session/adapters/ClaudeSessionCatalog.js +156 -0
  52. package/dist/session/adapters/ClaudeSessionCatalog.js.map +1 -0
  53. package/dist/session/adapters/CodexSessionCatalog.d.ts +9 -0
  54. package/dist/session/adapters/CodexSessionCatalog.d.ts.map +1 -0
  55. package/dist/session/adapters/CodexSessionCatalog.js +214 -0
  56. package/dist/session/adapters/CodexSessionCatalog.js.map +1 -0
  57. package/dist/session/adapters/PiSessionCatalog.d.ts +52 -0
  58. package/dist/session/adapters/PiSessionCatalog.d.ts.map +1 -0
  59. package/dist/session/adapters/PiSessionCatalog.js +252 -0
  60. package/dist/session/adapters/PiSessionCatalog.js.map +1 -0
  61. package/dist/session/adapters/index.d.ts +13 -0
  62. package/dist/session/adapters/index.d.ts.map +1 -0
  63. package/dist/session/adapters/index.js +17 -0
  64. package/dist/session/adapters/index.js.map +1 -0
  65. package/dist/types/config.d.ts +11 -0
  66. package/dist/types/config.d.ts.map +1 -1
  67. package/dist/types/config.js +3 -0
  68. package/dist/types/config.js.map +1 -1
  69. package/dist/utils/LocalImageDetector.d.ts +2 -2
  70. package/dist/utils/LocalImageDetector.d.ts.map +1 -1
  71. package/dist/utils/LocalImageDetector.js +2 -0
  72. package/dist/utils/LocalImageDetector.js.map +1 -1
  73. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionCatalog.js","sourceRoot":"","sources":["../../src/session/SessionCatalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { IExecutor } from '../executor/IExecutor';
2
+ import type { BackendKey } from '../types/config';
3
+ import type { SessionCatalog } from './SessionCatalog';
4
+ import type { PiSessionLocator } from './adapters/PiSessionCatalog';
5
+ import { SessionMenuStore } from './SessionMenu';
6
+ export interface SessionControlResponse {
7
+ success: boolean;
8
+ output?: string;
9
+ error?: string;
10
+ }
11
+ /** Local binding state recorded in the thread's Pi pointer. */
12
+ export interface PiBindingState {
13
+ id?: string;
14
+ adopted: boolean;
15
+ }
16
+ /** Everything the service needs from the daemon; injected for isolated tests. */
17
+ export interface SessionControlDeps {
18
+ sharingConfig(): unknown;
19
+ backendOf(threadId: string): BackendKey;
20
+ /** Canonical, allowed thread workspace, or undefined when unavailable. */
21
+ workingDirectory(threadId: string): string | undefined;
22
+ threadName(threadId: string): string | undefined;
23
+ isBusy(threadId: string): boolean;
24
+ setBusy(threadId: string, busy: boolean): void;
25
+ executor(threadId: string): IExecutor;
26
+ readCatalog(backend: BackendKey, workingDirectory: string): SessionCatalog | undefined;
27
+ resolvePi(workingDirectory: string, id: string): PiSessionLocator | undefined;
28
+ piHolder(file: string, threadId: string): string | undefined;
29
+ piBinding(threadId: string): PiBindingState | undefined;
30
+ }
31
+ export interface SessionControlContext {
32
+ openId?: string;
33
+ threadId: string;
34
+ }
35
+ /**
36
+ * Owns `/resume` and `/session`. Listing and paging are read-only; only a
37
+ * confirmed, scope-bound, single-use token reaches executor adoption, and only
38
+ * for backends whose strict native resume is implemented.
39
+ */
40
+ export declare class SessionControl {
41
+ private readonly deps;
42
+ private readonly menus;
43
+ /** In-flight native files, including quarantined outcomes, shared across this daemon's threads. */
44
+ private readonly sessionReservations;
45
+ constructor(deps: SessionControlDeps, menus?: SessionMenuStore);
46
+ handle(content: string, context: SessionControlContext): Promise<SessionControlResponse>;
47
+ private render;
48
+ private handleMenu;
49
+ /** Validate a selection and issue a mutation-free confirmation. */
50
+ private prepare;
51
+ private checkTarget;
52
+ /** Execute a confirmed adoption after revalidating everything the confirmation captured. */
53
+ private adopt;
54
+ private handleBinding;
55
+ }
56
+ //# sourceMappingURL=SessionControl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionControl.d.ts","sourceRoot":"","sources":["../../src/session/SessionControl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,kBAAkB,CAAC;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAUpE,OAAO,EAEL,gBAAgB,EAOjB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,+DAA+D;AAC/D,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,iFAAiF;AACjF,MAAM,WAAW,kBAAkB;IACjC,aAAa,IAAI,OAAO,CAAC;IACzB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAC;IACxC,0EAA0E;IAC1E,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACvD,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACjD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAAC;IACvF,SAAS,CAAC,gBAAgB,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;IAC9E,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC7D,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAAC;CACzD;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAWD;;;;GAIG;AACH,qBAAa,cAAc;IAKb,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IACzC,mGAAmG;IACnG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA6B;gBAEpC,IAAI,EAAE,kBAAkB,EAAE,KAAK,mBAAyB;IAI/E,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IA2B9F,OAAO,CAAC,MAAM;YAOA,UAAU;IAyCxB,mEAAmE;IACnE,OAAO,CAAC,OAAO;IAiCf,OAAO,CAAC,WAAW;IAkBnB,4FAA4F;YAC9E,KAAK;YAwCL,aAAa;CAyD5B"}
@@ -0,0 +1,262 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionControl = void 0;
4
+ const SessionResumeService_1 = require("./SessionResumeService");
5
+ const SessionMenu_1 = require("./SessionMenu");
6
+ const NOTHING_SENT = 'No task was sent.';
7
+ function describe(candidate) {
8
+ const title = candidate.name ?? `Session ${candidate.id.slice(0, 8)}`;
9
+ const updated = new Date(candidate.modifiedAt).toISOString().slice(0, 16).replace('T', ' ');
10
+ const count = candidate.countComplete ? `${candidate.messageCount} messages` : 'messages unavailable';
11
+ return `${title} \u00b7 \`${candidate.id}\` \u00b7 ${count} \u00b7 updated ${updated} UTC`;
12
+ }
13
+ /**
14
+ * Owns `/resume` and `/session`. Listing and paging are read-only; only a
15
+ * confirmed, scope-bound, single-use token reaches executor adoption, and only
16
+ * for backends whose strict native resume is implemented.
17
+ */
18
+ class SessionControl {
19
+ deps;
20
+ menus;
21
+ /** In-flight native files, including quarantined outcomes, shared across this daemon's threads. */
22
+ sessionReservations = new Map();
23
+ constructor(deps, menus = new SessionMenu_1.SessionMenuStore()) {
24
+ this.deps = deps;
25
+ this.menus = menus;
26
+ }
27
+ async handle(content, context) {
28
+ const { threadId } = context;
29
+ const backend = this.deps.backendOf(threadId);
30
+ const cwd = this.deps.workingDirectory(threadId);
31
+ const scope = { openId: context.openId, threadId, workingDirectory: cwd ?? '' };
32
+ const binding = (0, SessionMenu_1.parseSessionBindingCommand)(content);
33
+ if (binding) {
34
+ if (binding.kind === 'invalid')
35
+ return { success: false, error: binding.error };
36
+ return this.handleBinding(binding.kind, 'token' in binding ? binding.token : undefined, backend, scope, content);
37
+ }
38
+ const menu = (0, SessionMenu_1.parseSessionMenuCommand)(content);
39
+ if (menu)
40
+ return this.handleMenu(menu, backend, cwd, scope);
41
+ const result = (0, SessionResumeService_1.sessionResumeGate)(content, backend, this.deps.sharingConfig());
42
+ const target = (0, SessionResumeService_1.catalogTarget)(content, backend);
43
+ if (result.code !== 'native_capability_unavailable' || !target || !SessionResumeService_1.CATALOG_BACKENDS.includes(target)) {
44
+ return { success: false, error: result.error };
45
+ }
46
+ const catalog = cwd ? this.deps.readCatalog(target, cwd) : undefined;
47
+ if (!cwd || !catalog) {
48
+ return { success: false, error: 'The thread working directory is not allowed or not set. No session was loaded or task sent.' };
49
+ }
50
+ return { success: true, output: this.render(this.menus.create(target, scope, catalog), 1, backend) };
51
+ }
52
+ render(snapshot, page, threadBackend) {
53
+ return (0, SessionResumeService_1.formatCatalog)(snapshot.catalog, snapshot.backend, {
54
+ token: snapshot.token, page, pageSize: SessionMenu_1.SESSION_MENU_PAGE_SIZE, query: snapshot.query,
55
+ connectable: SessionResumeService_1.NATIVE_RESUME_BACKENDS.includes(snapshot.backend) && snapshot.backend === threadBackend,
56
+ });
57
+ }
58
+ async handleMenu(command, backend, cwd, scope) {
59
+ if (command.kind === 'invalid')
60
+ return { success: false, error: command.error };
61
+ const expired = 'This session menu has expired or belongs to another thread, workspace or user. Send /resume to list sessions again.';
62
+ if (command.kind === 'confirm' || command.kind === 'cancel') {
63
+ const pending = this.menus.take(command.token, scope, 'resume');
64
+ if (!pending)
65
+ return { success: false, error: 'This confirmation has expired, was already used, or belongs to another thread, workspace or user. Nothing was changed.' };
66
+ if (command.kind === 'cancel')
67
+ return { success: true, output: 'Cancelled. Nothing was changed.' };
68
+ return this.adopt(pending.sessionId, pending.revision, backend, cwd, scope, pending.replaces);
69
+ }
70
+ if (command.kind === 'id') {
71
+ const denied = (0, SessionResumeService_1.sessionSharingDenied)(backend, this.deps.sharingConfig());
72
+ if (denied)
73
+ return { success: false, error: denied.error };
74
+ if (!SessionResumeService_1.NATIVE_RESUME_BACKENDS.includes(backend) || !cwd)
75
+ return this.prepare(backend, backend, undefined, cwd, scope);
76
+ const catalog = this.deps.readCatalog(backend, cwd);
77
+ const candidate = catalog?.candidates.find(item => item.id === command.id);
78
+ if (!candidate)
79
+ return { success: false, error: `No ${(0, SessionResumeService_1.sessionBackendLabel)(backend)} session with that ID was found for this workspace. Send /resume to list sessions.` };
80
+ return this.prepare(backend, backend, candidate, cwd, scope);
81
+ }
82
+ const source = this.menus.get(command.token, scope);
83
+ if (!source)
84
+ return { success: false, error: expired };
85
+ const denied = (0, SessionResumeService_1.sessionSharingDenied)(source.backend, this.deps.sharingConfig());
86
+ if (denied)
87
+ return { success: false, error: denied.error };
88
+ if (command.kind === 'select') {
89
+ const candidate = source.catalog.candidates[command.row - 1];
90
+ if (!candidate)
91
+ return { success: false, error: `Row ${command.row} is not in this session menu.` };
92
+ return this.prepare(source.backend, backend, candidate, cwd, scope);
93
+ }
94
+ const snapshot = command.kind === 'search' ? this.menus.search(command.token, scope, command.text) : source;
95
+ const pages = (0, SessionMenu_1.sessionMenuPageCount)(snapshot);
96
+ if (command.kind === 'page' && command.page > pages) {
97
+ return { success: false, error: `This session menu has ${pages} page${pages === 1 ? '' : 's'}.` };
98
+ }
99
+ return { success: true, output: this.render(snapshot, command.kind === 'page' ? command.page : 1, backend) };
100
+ }
101
+ /** Validate a selection and issue a mutation-free confirmation. */
102
+ prepare(target, threadBackend, candidate, cwd, scope) {
103
+ if (!SessionResumeService_1.NATIVE_RESUME_BACKENDS.includes(target)) {
104
+ return { success: false, error: `${(0, SessionResumeService_1.sessionBackendLabel)(target)} native resume is not available in this release. Only Pi sessions can be connected so far. No session was loaded or task sent.` };
105
+ }
106
+ if (threadBackend !== target) {
107
+ return { success: false, error: `This thread uses ${(0, SessionResumeService_1.sessionBackendLabel)(threadBackend)}. Switch this thread to ${(0, SessionResumeService_1.sessionBackendLabel)(target)} with \`/backend <index> @\` first, then send /resume again. Nothing was changed.` };
108
+ }
109
+ if (!cwd || !candidate)
110
+ return { success: false, error: 'The thread working directory is not allowed or not set. Nothing was changed.' };
111
+ const checked = this.checkTarget(candidate.id, scope.threadId, cwd);
112
+ if ('error' in checked)
113
+ return { success: false, error: checked.error };
114
+ const replaces = this.deps.piBinding(scope.threadId);
115
+ const replaced = replaces?.adopted && replaces.id && replaces.id !== candidate.id ? replaces.id : undefined;
116
+ const pending = this.menus.confirm({ action: 'resume', backend: target, scope, sessionId: candidate.id, revision: checked.locator.revision, replaces: replaced });
117
+ return {
118
+ success: true,
119
+ output: [
120
+ `Connect this thread to the ${(0, SessionResumeService_1.sessionBackendLabel)(target)} session below?`,
121
+ '',
122
+ describe(candidate),
123
+ '',
124
+ ...(replaced ? [`- This replaces this thread's current connection to session \`${replaced}\`; that session's history is kept.`, ''] : []),
125
+ '- Its existing history is kept. Later /clear or /thread delete in this thread will not delete it.',
126
+ '- Connecting sends no task. Your next message continues this session.',
127
+ '- Local Pi may stay open, but keep it idle while this thread runs. Resume the same file locally before switching back; concurrent writes can create separate branches.',
128
+ '- This thread\'s model or effort override, if set, applies to new turns.',
129
+ '',
130
+ `Confirm: \`/resume confirm ${pending.token}\``,
131
+ `Cancel: \`/resume cancel ${pending.token}\` (expires in 5 minutes)`,
132
+ ].join('\n'),
133
+ };
134
+ }
135
+ checkTarget(id, threadId, cwd) {
136
+ const locator = this.deps.resolvePi(cwd, id);
137
+ if (!locator)
138
+ return { error: 'This session is no longer listed for this workspace. Send /resume to list sessions again. Nothing was changed.' };
139
+ if (this.sessionReservations.has(locator.file)) {
140
+ return { error: 'This Pi session is being connected or requires process cleanup. Retry after the operation finishes; uncertain cleanup requires restarting the client after Pi exits.' };
141
+ }
142
+ const holder = this.deps.piHolder(locator.file, threadId);
143
+ if (holder) {
144
+ const name = this.deps.threadName(holder);
145
+ return { error: `This session is already used by ${name ? `thread "${name}"` : 'another remote-cli thread'}. Detach it there first. Nothing was changed.` };
146
+ }
147
+ const current = this.deps.piBinding(threadId);
148
+ if (current?.adopted && current.id === id) {
149
+ return { error: 'This thread is already connected to that session. Send your next instruction to continue it.' };
150
+ }
151
+ return { locator };
152
+ }
153
+ /** Execute a confirmed adoption after revalidating everything the confirmation captured. */
154
+ async adopt(sessionId, revision, backend, cwd, scope, replaces) {
155
+ const denied = (0, SessionResumeService_1.sessionSharingDenied)(backend, this.deps.sharingConfig());
156
+ if (denied)
157
+ return { success: false, error: denied.error };
158
+ if (!SessionResumeService_1.NATIVE_RESUME_BACKENDS.includes(backend) || !cwd) {
159
+ return { success: false, error: 'This thread can no longer connect that session (its backend or workspace changed). Nothing was changed.' };
160
+ }
161
+ if (this.deps.isBusy(scope.threadId)) {
162
+ return { success: false, error: 'This thread is running a task. Wait for it to finish (or send /abort), then select the session again. Nothing was changed.' };
163
+ }
164
+ const checked = this.checkTarget(sessionId, scope.threadId, cwd);
165
+ if ('error' in checked)
166
+ return { success: false, error: checked.error };
167
+ if (checked.locator.revision !== revision) {
168
+ return { success: false, error: 'The session changed after you selected it (for example a local Pi wrote to it). Wait for local work to finish, send /resume and select it again. Nothing was changed.' };
169
+ }
170
+ const executor = this.deps.executor(scope.threadId);
171
+ if (!executor.adoptNativeSession)
172
+ return { success: false, error: 'This backend cannot connect native sessions. Nothing was changed.' };
173
+ // Reserve before the first asynchronous native operation, not after pointer publication.
174
+ this.sessionReservations.set(checked.locator.file, scope.threadId);
175
+ let releaseReservation = false;
176
+ try {
177
+ this.deps.setBusy(scope.threadId, true);
178
+ const result = await executor.adoptNativeSession({ sessionId, sessionFile: checked.locator.file });
179
+ releaseReservation = result.success || !result.recoveryRequired;
180
+ if (!result.success)
181
+ return { success: false, error: result.error };
182
+ }
183
+ finally {
184
+ if (releaseReservation)
185
+ this.sessionReservations.delete(checked.locator.file);
186
+ this.deps.setBusy(scope.threadId, false);
187
+ }
188
+ return {
189
+ success: true,
190
+ output: [
191
+ `\u2705 Connected to Pi session \`${sessionId}\`. ${NOTHING_SENT}`,
192
+ ...(replaces ? [`The previous connection to \`${replaces}\` was replaced; its history is kept.`] : []),
193
+ 'Send your next instruction to continue it.',
194
+ 'Remote turns reload this session automatically. Before local work, wait for this thread to finish and resume the same file locally.',
195
+ ].join('\n'),
196
+ };
197
+ }
198
+ async handleBinding(kind, token, backend, scope, content) {
199
+ // An existing binding stays inspectable and detachable even if sharing was disabled later.
200
+ const state = backend === 'pi' ? this.deps.piBinding(scope.threadId) : undefined;
201
+ if (!state?.adopted) {
202
+ const denied = (0, SessionResumeService_1.sessionSharingDenied)(backend, this.deps.sharingConfig());
203
+ if (kind === 'status' || denied)
204
+ return { success: false, error: (denied ?? (0, SessionResumeService_1.sessionResumeGate)(content, backend, this.deps.sharingConfig())).error };
205
+ if (kind === 'confirm' || kind === 'cancel')
206
+ this.menus.take(token, scope, 'detach');
207
+ return { success: false, error: 'This thread is not connected to a native session. Send /resume to list sessions.' };
208
+ }
209
+ const id = state.id ?? 'unknown';
210
+ if (kind === 'status') {
211
+ return { success: true, output: [
212
+ `This thread is connected to Pi session \`${id}\` (reloads before every remote turn).`,
213
+ 'Local Pi may stay open. Use only one side at a time; resume the same file locally before the next local turn.',
214
+ 'Send /session detach to start a fresh conversation here without deleting native history.',
215
+ 'On this computer, run \`remote-cli session show --thread <thread-name> --backend pi\` for local reopen guidance.',
216
+ ].join('\n') };
217
+ }
218
+ if (kind === 'detach') {
219
+ const pending = this.menus.confirm({ action: 'detach', backend, scope, sessionId: id });
220
+ return {
221
+ success: true,
222
+ output: [
223
+ `Stop using Pi session \`${id}\` in this thread?`,
224
+ 'Its history stays on the computer and is not deleted. The next message here starts a fresh conversation.',
225
+ '',
226
+ `Confirm: \`/session confirm ${pending.token}\``,
227
+ `Cancel: \`/session cancel ${pending.token}\` (expires in 5 minutes)`,
228
+ ].join('\n'),
229
+ };
230
+ }
231
+ if (kind === 'confirm' || kind === 'cancel') {
232
+ const pending = this.menus.take(token, scope, 'detach');
233
+ if (!pending || pending.sessionId !== id) {
234
+ return { success: false, error: 'This confirmation has expired, was already used, or no longer matches this thread. Nothing was changed.' };
235
+ }
236
+ if (kind === 'cancel')
237
+ return { success: true, output: 'Cancelled. Nothing was changed.' };
238
+ }
239
+ if (this.deps.isBusy(scope.threadId)) {
240
+ return { success: false, error: 'This thread is running a task. Wait for it to finish (or send /abort) first. Nothing was changed.' };
241
+ }
242
+ const executor = this.deps.executor(scope.threadId);
243
+ const operation = executor.detachNativeSession;
244
+ if (!operation)
245
+ return { success: false, error: 'This backend cannot detach native sessions. Nothing was changed.' };
246
+ this.deps.setBusy(scope.threadId, true);
247
+ try {
248
+ const result = await operation.call(executor);
249
+ if (!result.success)
250
+ return { success: false, error: result.error };
251
+ }
252
+ finally {
253
+ this.deps.setBusy(scope.threadId, false);
254
+ }
255
+ return {
256
+ success: true,
257
+ output: `Detached Pi session \`${id}\`. Its history is kept on the computer; the next message here starts a fresh conversation.`,
258
+ };
259
+ }
260
+ }
261
+ exports.SessionControl = SessionControl;
262
+ //# sourceMappingURL=SessionControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionControl.js","sourceRoot":"","sources":["../../src/session/SessionControl.ts"],"names":[],"mappings":";;;AAIA,iEAQgC;AAChC,+CASuB;AAmCvB,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAEzC,SAAS,QAAQ,CAAC,SAAkC;IAClD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,IAAI,WAAW,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IACtE,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5F,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,YAAY,WAAW,CAAC,CAAC,CAAC,sBAAsB,CAAC;IACtG,OAAO,GAAG,KAAK,aAAa,SAAS,CAAC,EAAE,aAAa,KAAK,mBAAmB,OAAO,MAAM,CAAC;AAC7F,CAAC;AAED;;;;GAIG;AACH,MAAa,cAAc;IAKI;IAJZ,KAAK,CAAmB;IACzC,mGAAmG;IAClF,mBAAmB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEjE,YAA6B,IAAwB,EAAE,KAAK,GAAG,IAAI,8BAAgB,EAAE;QAAxD,SAAI,GAAJ,IAAI,CAAoB;QACnD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,OAA8B;QAC1D,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,KAAK,GAAqB,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC;QAElG,MAAM,OAAO,GAAG,IAAA,wCAA0B,EAAC,OAAO,CAAC,CAAC;QACpD,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;YAChF,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACnH,CAAC;QAED,MAAM,IAAI,GAAG,IAAA,qCAAuB,EAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAE5D,MAAM,MAAM,GAAG,IAAA,wCAAiB,EAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,IAAA,oCAAa,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,+BAA+B,IAAI,CAAC,MAAM,IAAI,CAAC,uCAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACrG,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QACjD,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrE,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,6FAA6F,EAAE,CAAC;QAClI,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;IACvG,CAAC;IAEO,MAAM,CAAC,QAA6B,EAAE,IAAY,EAAE,aAAyB;QACnF,OAAO,IAAA,oCAAa,EAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE;YACvD,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,oCAAsB,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK;YACpF,WAAW,EAAE,6CAAsB,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,OAAO,KAAK,aAAa;SACrG,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,OAA2B,EAAE,OAAmB,EAAE,GAAuB,EAChG,KAAuB;QACvB,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QAChF,MAAM,OAAO,GAAG,qHAAqH,CAAC;QAEtI,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAChE,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,wHAAwH,EAAE,CAAC;YACzK,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,iCAAiC,EAAE,CAAC;YACnG,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,QAAS,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjG,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAA,2CAAoB,EAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;YACxE,IAAI,MAAM;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YAC3D,IAAI,CAAC,6CAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YACpH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;YAC3E,IAAI,CAAC,SAAS;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,IAAA,0CAAmB,EAAC,OAAO,CAAC,oFAAoF,EAAE,CAAC;YACzK,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,IAAA,2CAAoB,EAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAC/E,IAAI,MAAM;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAE3D,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,SAAS;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,OAAO,CAAC,GAAG,+BAA+B,EAAE,CAAC;YACpG,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7G,MAAM,KAAK,GAAG,IAAA,kCAAoB,EAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,GAAG,KAAK,EAAE,CAAC;YACpD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;QACpG,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;IAC/G,CAAC;IAED,mEAAmE;IAC3D,OAAO,CAAC,MAAkB,EAAE,aAAyB,EAAE,SAA8C,EAC3G,GAAuB,EAAE,KAAuB;QAChD,IAAI,CAAC,6CAAsB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAA,0CAAmB,EAAC,MAAM,CAAC,gIAAgI,EAAE,CAAC;QACnM,CAAC;QACD,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;YAC7B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,IAAA,0CAAmB,EAAC,aAAa,CAAC,2BAA2B,IAAA,0CAAmB,EAAC,MAAM,CAAC,mFAAmF,EAAE,CAAC;QACpO,CAAC;QACD,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,8EAA8E,EAAE,CAAC;QACzI,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACpE,IAAI,OAAO,IAAI,OAAO;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,QAAQ,EAAE,OAAO,IAAI,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5G,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClK,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE;gBACN,8BAA8B,IAAA,0CAAmB,EAAC,MAAM,CAAC,iBAAiB;gBAC1E,EAAE;gBACF,QAAQ,CAAC,SAAS,CAAC;gBACnB,EAAE;gBACF,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,iEAAiE,QAAQ,qCAAqC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzI,mGAAmG;gBACnG,uEAAuE;gBACvE,wKAAwK;gBACxK,0EAA0E;gBAC1E,EAAE;gBACF,8BAA8B,OAAO,CAAC,KAAK,IAAI;gBAC/C,4BAA4B,OAAO,CAAC,KAAK,2BAA2B;aACrE,CAAC,IAAI,CAAC,IAAI,CAAC;SACb,CAAC;IACJ,CAAC;IAEO,WAAW,CAAC,EAAU,EAAE,QAAgB,EAAE,GAAW;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,KAAK,EAAE,gHAAgH,EAAE,CAAC;QACjJ,IAAI,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,OAAO,EAAE,KAAK,EAAE,sKAAsK,EAAE,CAAC;QAC3L,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC1D,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC1C,OAAO,EAAE,KAAK,EAAE,mCAAmC,IAAI,CAAC,CAAC,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC,CAAC,2BAA2B,+CAA+C,EAAE,CAAC;QAC9J,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;YAC1C,OAAO,EAAE,KAAK,EAAE,8FAA8F,EAAE,CAAC;QACnH,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;IAED,4FAA4F;IACpF,KAAK,CAAC,KAAK,CAAC,SAAiB,EAAE,QAAgB,EAAE,OAAmB,EAAE,GAAuB,EACnG,KAAuB,EAAE,QAAiB;QAC1C,MAAM,MAAM,GAAG,IAAA,2CAAoB,EAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QACxE,IAAI,MAAM;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC3D,IAAI,CAAC,6CAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACtD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,yGAAyG,EAAE,CAAC;QAC9I,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,4HAA4H,EAAE,CAAC;QACjK,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACjE,IAAI,OAAO,IAAI,OAAO;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QACxE,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uKAAuK,EAAE,CAAC;QAC5M,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,CAAC,kBAAkB;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,mEAAmE,EAAE,CAAC;QACxI,yFAAyF;QACzF,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnE,IAAI,kBAAkB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YACnG,kBAAkB,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;YAChE,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QACtE,CAAC;gBAAS,CAAC;YACT,IAAI,kBAAkB;gBAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC9E,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE;gBACN,oCAAoC,SAAS,OAAO,YAAY,EAAE;gBAClE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,gCAAgC,QAAQ,uCAAuC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtG,4CAA4C;gBAC5C,qIAAqI;aACtI,CAAC,IAAI,CAAC,IAAI,CAAC;SACb,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,IAAgD,EAAE,KAAyB,EACrG,OAAmB,EAAE,KAAuB,EAAE,OAAe;QAC7D,2FAA2F;QAC3F,MAAM,KAAK,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACjF,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,IAAA,2CAAoB,EAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;YACxE,IAAI,IAAI,KAAK,QAAQ,IAAI,MAAM;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,MAAM,IAAI,IAAA,wCAAiB,EAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YACpJ,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ;gBAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YACtF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,kFAAkF,EAAE,CAAC;QACvH,CAAC;QACD,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,SAAS,CAAC;QACjC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;oBAC9B,4CAA4C,EAAE,wCAAwC;oBACtF,+GAA+G;oBAC/G,0FAA0F;oBAC1F,kHAAkH;iBACnH,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjB,CAAC;QACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;YACxF,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE;oBACN,2BAA2B,EAAE,oBAAoB;oBACjD,0GAA0G;oBAC1G,EAAE;oBACF,+BAA+B,OAAO,CAAC,KAAK,IAAI;oBAChD,6BAA6B,OAAO,CAAC,KAAK,2BAA2B;iBACtE,CAAC,IAAI,CAAC,IAAI,CAAC;aACb,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YACzD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,KAAK,EAAE,EAAE,CAAC;gBACzC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,yGAAyG,EAAE,CAAC;YAC9I,CAAC;YACD,IAAI,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,iCAAiC,EAAE,CAAC;QAC7F,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,mGAAmG,EAAE,CAAC;QACxI,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,QAAQ,CAAC,mBAAmB,CAAC;QAC/C,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,kEAAkE,EAAE,CAAC;QACrH,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QACtE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,yBAAyB,EAAE,6FAA6F;SACjI,CAAC;IACJ,CAAC;CACF;AA1OD,wCA0OC"}
@@ -0,0 +1,48 @@
1
+ import type { BackendKey } from '../types/config';
2
+ /**
3
+ * Local-only session inspection. This module never starts a backend, never reads
4
+ * transcript content, and never writes anything: it reads the local pointer files
5
+ * remote-cli itself wrote, so a user can reopen the same native session in a
6
+ * terminal. Native locators deliberately stay on this machine; nothing here is
7
+ * meant to be rendered in Feishu.
8
+ */
9
+ /** Pointer namespaces written by each executor, keyed by stable backend key. */
10
+ export declare const SESSION_POINTER_NAMESPACES: Record<BackendKey, string>;
11
+ export interface LocalSessionInfoOptions {
12
+ /** Remote thread identity, from `threads.json`. */
13
+ threadId: string;
14
+ threadName: string;
15
+ workingDirectory: string;
16
+ backend: BackendKey;
17
+ /** Account home; defaults to the current user's. */
18
+ home?: string;
19
+ /** Optional remote-cli state root override (defaults to `<home>/.remote-cli`). */
20
+ remoteCliDirectory?: string;
21
+ }
22
+ export interface LocalSessionInfo {
23
+ backend: BackendKey;
24
+ threadName: string;
25
+ workingDirectory: string;
26
+ /** Where the pointer record lives, relative to the remote-cli state root. */
27
+ pointerLabel: string;
28
+ record: 'missing' | 'unreadable' | 'present';
29
+ /** Exact native identity, local-only. */
30
+ nativeId?: string;
31
+ sessionFile?: string;
32
+ savedAt?: string;
33
+ /** Exact reopen guidance, only when the installed release's flags are verified. */
34
+ reopen?: {
35
+ command: string;
36
+ verified: string;
37
+ };
38
+ notes: string[];
39
+ }
40
+ /**
41
+ * Read one thread/backend pointer. Returns `missing` when no native session was
42
+ * ever recorded, so callers never suggest a selector that would create an empty
43
+ * conversation. Never executes a backend.
44
+ */
45
+ export declare function readLocalSessionInfo(options: LocalSessionInfoOptions): LocalSessionInfo;
46
+ /** Local-only rendering. Never send this text to a chat service. */
47
+ export declare function formatLocalSessionInfo(info: LocalSessionInfo): string;
48
+ //# sourceMappingURL=SessionLocalInfo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionLocalInfo.d.ts","sourceRoot":"","sources":["../../src/session/SessionLocalInfo.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;;;;;GAMG;AAEH,gFAAgF;AAChF,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CASjE,CAAC;AAiBF,MAAM,WAAW,uBAAuB;IACtC,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,UAAU,CAAC;IACpB,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,UAAU,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,CAAC;IAC7C,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AA0BD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,uBAAuB,GAAG,gBAAgB,CA+CvF;AAED,oEAAoE;AACpE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAkBrE"}
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SESSION_POINTER_NAMESPACES = void 0;
7
+ exports.readLocalSessionInfo = readLocalSessionInfo;
8
+ exports.formatLocalSessionInfo = formatLocalSessionInfo;
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const os_1 = __importDefault(require("os"));
11
+ const path_1 = __importDefault(require("path"));
12
+ /**
13
+ * Local-only session inspection. This module never starts a backend, never reads
14
+ * transcript content, and never writes anything: it reads the local pointer files
15
+ * remote-cli itself wrote, so a user can reopen the same native session in a
16
+ * terminal. Native locators deliberately stay on this machine; nothing here is
17
+ * meant to be rendered in Feishu.
18
+ */
19
+ /** Pointer namespaces written by each executor, keyed by stable backend key. */
20
+ exports.SESSION_POINTER_NAMESPACES = {
21
+ claude: 'claude-sessions',
22
+ codex: 'codex-sessions',
23
+ agy: 'agy-sessions',
24
+ opencode: 'opencode-sessions',
25
+ kimi: 'kimi-sessions',
26
+ zcode: 'zcode-sessions',
27
+ pi: 'pi-sessions',
28
+ dsh: 'dsh-sessions',
29
+ };
30
+ const REOPEN_RULES = {
31
+ claude: { command: id => `claude --resume ${id}`, verified: 'verified against the installed Claude Code --help' },
32
+ codex: { command: id => `codex resume ${id}`, verified: 'verified against the installed Codex CLI resume help' },
33
+ opencode: { command: id => `opencode --session ${id}`, verified: 'verified against the installed OpenCode --session flag' },
34
+ pi: { command: (id, sessionFile) => `pi --session '${(sessionFile ?? id).replace(/'/g, "'\\''")}'`, verified: 'verified against the installed Pi --session flag' },
35
+ };
36
+ function pointerFile(directory, threadId) {
37
+ return path_1.default.join(directory, `${threadId}.json`);
38
+ }
39
+ /** Bounded, symlink-free read of one pointer record. */
40
+ function readPointer(file) {
41
+ let fd;
42
+ try {
43
+ const before = fs_1.default.lstatSync(file);
44
+ if (!before.isFile() || before.isSymbolicLink() || before.nlink !== 1 || before.size === 0 || before.size > 64 * 1024) {
45
+ return { record: 'unreadable' };
46
+ }
47
+ fd = fs_1.default.openSync(file, fs_1.default.constants.O_RDONLY | (fs_1.default.constants.O_NOFOLLOW ?? 0));
48
+ const stat = fs_1.default.fstatSync(fd);
49
+ if (stat.ino !== before.ino || stat.dev !== before.dev)
50
+ return { record: 'unreadable' };
51
+ const value = JSON.parse(fs_1.default.readFileSync(fd, 'utf8'));
52
+ if (!value || typeof value !== 'object' || Array.isArray(value))
53
+ return { record: 'invalid' };
54
+ return { record: 'ok', value: value };
55
+ }
56
+ catch (error) {
57
+ return { record: error.code === 'ENOENT' ? 'invalid' : 'unreadable' };
58
+ }
59
+ finally {
60
+ if (fd !== undefined)
61
+ fs_1.default.closeSync(fd);
62
+ }
63
+ }
64
+ /**
65
+ * Read one thread/backend pointer. Returns `missing` when no native session was
66
+ * ever recorded, so callers never suggest a selector that would create an empty
67
+ * conversation. Never executes a backend.
68
+ */
69
+ function readLocalSessionInfo(options) {
70
+ const home = options.home ?? os_1.default.homedir();
71
+ const root = options.remoteCliDirectory ?? path_1.default.join(home, '.remote-cli');
72
+ const namespace = exports.SESSION_POINTER_NAMESPACES[options.backend];
73
+ const directory = path_1.default.join(root, namespace);
74
+ const file = pointerFile(directory, options.threadId);
75
+ const info = {
76
+ backend: options.backend,
77
+ threadName: options.threadName,
78
+ workingDirectory: options.workingDirectory,
79
+ pointerLabel: `${namespace}/${options.threadId}.json`,
80
+ record: 'missing',
81
+ notes: [],
82
+ };
83
+ const exists = fs_1.default.existsSync(file);
84
+ const read = readPointer(file);
85
+ if (!exists) {
86
+ info.notes.push('No persisted session pointer exists for this thread. Do not run a native picker expecting history; no empty session was created.');
87
+ return info;
88
+ }
89
+ if (read.record !== 'ok') {
90
+ info.record = 'unreadable';
91
+ info.notes.push('The local session pointer exists but could not be read safely; inspect it on this computer before reopening anything.');
92
+ return info;
93
+ }
94
+ const id = read.value.id;
95
+ const sessionFile = read.value.sessionFile;
96
+ const cwd = read.value.cwd;
97
+ if (typeof id !== 'string' || !id) {
98
+ info.record = 'unreadable';
99
+ info.notes.push('The local session pointer has no usable native session identity.');
100
+ return info;
101
+ }
102
+ info.record = 'present';
103
+ info.nativeId = id;
104
+ if (typeof sessionFile === 'string' && sessionFile)
105
+ info.sessionFile = sessionFile;
106
+ if (typeof read.value.savedAt === 'string')
107
+ info.savedAt = read.value.savedAt;
108
+ if (typeof cwd === 'string' && cwd && cwd !== options.workingDirectory) {
109
+ info.notes.push('The pointer records a different working directory than the thread; reopen it in the recorded project, not in the current one.');
110
+ }
111
+ const rule = REOPEN_RULES[options.backend];
112
+ if (rule) {
113
+ info.reopen = { command: rule.command(id, info.sessionFile), verified: rule.verified };
114
+ }
115
+ else {
116
+ info.notes.push(`Reopen guidance for ${options.backend} is not verified on this release, so no command is suggested.`);
117
+ }
118
+ return info;
119
+ }
120
+ /** Local-only rendering. Never send this text to a chat service. */
121
+ function formatLocalSessionInfo(info) {
122
+ const lines = [
123
+ `Thread: ${info.threadName} (${info.backend})`,
124
+ `Workspace: ${info.workingDirectory}`,
125
+ `Local pointer: ${info.pointerLabel} (${info.record})`,
126
+ ];
127
+ if (info.nativeId)
128
+ lines.push(`Native session: ${info.nativeId}`);
129
+ if (info.sessionFile)
130
+ lines.push(`Session file: ${info.sessionFile}`);
131
+ if (info.savedAt)
132
+ lines.push(`Recorded at: ${info.savedAt}`);
133
+ if (info.reopen) {
134
+ lines.push('', 'Reopen on this computer (no model task is started by remote-cli):', ` ${info.reopen.command}`);
135
+ lines.push(` (${info.reopen.verified})`);
136
+ }
137
+ else if (info.record === 'present') {
138
+ lines.push('', 'No reopen command is suggested for this backend on this release.');
139
+ }
140
+ if (info.notes.length)
141
+ lines.push('', ...info.notes.map(note => `Note: ${note}`));
142
+ lines.push('', 'remote-cli does not verify that the native release preserves history on reopen, and it does not hold an ownership lease over a plain terminal process. Close the remote runtime before working locally, then reacquire explicitly.');
143
+ return lines.join('\n');
144
+ }
145
+ //# sourceMappingURL=SessionLocalInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionLocalInfo.js","sourceRoot":"","sources":["../../src/session/SessionLocalInfo.ts"],"names":[],"mappings":"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"}