orquesta-agent 0.2.202 → 0.2.203
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/dist/executor.d.ts +22 -1
- package/dist/executor.d.ts.map +1 -1
- package/dist/executor.js +93 -7
- package/dist/executor.js.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/supabase.d.ts +20 -1
- package/dist/supabase.d.ts.map +1 -1
- package/dist/supabase.js +4 -1
- package/dist/supabase.js.map +1 -1
- package/dist/ws-client.d.ts +9 -0
- package/dist/ws-client.d.ts.map +1 -1
- package/dist/ws-client.js +11 -0
- package/dist/ws-client.js.map +1 -1
- package/package.json +1 -1
package/dist/executor.d.ts
CHANGED
|
@@ -165,7 +165,28 @@ export interface StartSessionOptions {
|
|
|
165
165
|
* flag. Supported by claude + orquesta-cli; ignored for kimi (no such flag).
|
|
166
166
|
*/
|
|
167
167
|
resume?: boolean;
|
|
168
|
+
/**
|
|
169
|
+
* Resume a SPECIFIC prior conversation by its id (dashboard Resume menu →
|
|
170
|
+
* "past conversations"). Maps to claude's `--resume <id>`. When set it takes
|
|
171
|
+
* precedence over the plain `resume` (--continue). orquesta/kimi have no
|
|
172
|
+
* per-id resume, so they fall back to --continue.
|
|
173
|
+
*/
|
|
174
|
+
resumeSessionId?: string;
|
|
175
|
+
}
|
|
176
|
+
export interface ResumableSession {
|
|
177
|
+
sessionId: string;
|
|
178
|
+
label: string;
|
|
179
|
+
/** ISO timestamp of the transcript's last modification. */
|
|
180
|
+
when?: string;
|
|
181
|
+
subAgentId?: string | null;
|
|
168
182
|
}
|
|
183
|
+
/**
|
|
184
|
+
* Enumerate resumable past conversations for a working directory by reading
|
|
185
|
+
* claude's transcript dir (~/.claude/projects/<encoded cwd>/<sessionId>.jsonl).
|
|
186
|
+
* Newest first, capped. Best-effort — returns [] on any error or when the dir
|
|
187
|
+
* doesn't exist (e.g. no prior claude sessions in this cwd).
|
|
188
|
+
*/
|
|
189
|
+
export declare function listResumableSessions(workingDir: string, subAgentId?: string | null, limit?: number): ResumableSession[];
|
|
169
190
|
/**
|
|
170
191
|
* Start an interactive Claude CLI session.
|
|
171
192
|
* The session runs with --dangerously-skip-permissions for uninterrupted interaction.
|
|
@@ -175,7 +196,7 @@ export declare function startSession(options: StartSessionOptions): Promise<bool
|
|
|
175
196
|
* Send input to the active interactive session.
|
|
176
197
|
* This writes directly to Claude CLI's stdin.
|
|
177
198
|
* If raw=true, write the input byte(s) directly without appending Enter (used for ESC, Ctrl+C).
|
|
178
|
-
* If attachments are provided, they're downloaded to /
|
|
199
|
+
* If attachments are provided, they're downloaded to ~/.cache/orquesta-attachments and
|
|
179
200
|
* their absolute paths are appended to the message text so Claude can Read them.
|
|
180
201
|
*/
|
|
181
202
|
export declare function sendSessionInput(sessionId: string, input: string, raw?: boolean, attachments?: Attachment[]): boolean;
|
package/dist/executor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAiCtD,OAAO,
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
|
package/dist/executor.js
CHANGED
|
@@ -22,7 +22,7 @@ import * as logger from './logger.js';
|
|
|
22
22
|
// ESM require for resolving the bundled orquesta-cli entry on Windows (see the
|
|
23
23
|
// interactive-session spawn — node-pty can't launch the `.cmd` shim).
|
|
24
24
|
const nodeRequire = createRequire(import.meta.url);
|
|
25
|
-
import { isSandboxAvailable, buildBwrapArgs, shQuote, ensureStrictProjectDirs } from './sandbox.js';
|
|
25
|
+
import { isSandboxAvailable, buildBwrapArgs, shQuote, ensureStrictProjectDirs, encodeClaudeProjectDir } from './sandbox.js';
|
|
26
26
|
import { parseCoordSpec, runCoordination } from './coordination.js';
|
|
27
27
|
import { sendOutput, sendComplete, sendError, sendSupervisionRequest, sendExecutionResumed, updatePromptStatus, persistOutputLogs, clearOutputBuffer, sendRequirement, persistRequirement, sendQAInstructions, persistQAInstructions, sendPlanItemsGenerated, sendSessionOutput, sendSessionStarted, sendSessionEnded, sendSessionError, reportAgentError } from './supabase.js';
|
|
28
28
|
import { createThinkingLog, createToolCallLog, createToolResultLog, createOutputLog, createErrorLog, createSystemLog, } from './types/agent-logs.js';
|
|
@@ -945,7 +945,7 @@ async function processAttachments(attachments) {
|
|
|
945
945
|
switch (category) {
|
|
946
946
|
case 'image':
|
|
947
947
|
// Claude resolves @filename relative to cwd, and the file lives in
|
|
948
|
-
// /
|
|
948
|
+
// ~/.cache/orquesta-attachments/, so @basename never resolves. Give the
|
|
949
949
|
// absolute path and tell Claude to Read it — Claude's Read tool returns
|
|
950
950
|
// base64 image content for image files.
|
|
951
951
|
fileReferences.push(localPath);
|
|
@@ -2973,12 +2973,89 @@ function startRogerthatMonitor(sessionId) {
|
|
|
2973
2973
|
export function setOnSessionEnded(cb) {
|
|
2974
2974
|
onSessionEndedCallback = cb;
|
|
2975
2975
|
}
|
|
2976
|
+
/** Collapse whitespace and cap a derived label. */
|
|
2977
|
+
function truncateLabel(s, n = 60) {
|
|
2978
|
+
const oneLine = s.replace(/\s+/g, ' ').trim();
|
|
2979
|
+
return oneLine.length > n ? oneLine.slice(0, n - 1) + '…' : oneLine;
|
|
2980
|
+
}
|
|
2981
|
+
/**
|
|
2982
|
+
* Best-effort: derive a human label from a claude transcript by reading the
|
|
2983
|
+
* first ~64KB and pulling the first user message. Returns null if none found.
|
|
2984
|
+
*/
|
|
2985
|
+
function deriveSessionLabel(file) {
|
|
2986
|
+
try {
|
|
2987
|
+
const fd = fs.openSync(file, 'r');
|
|
2988
|
+
const buf = Buffer.alloc(65536);
|
|
2989
|
+
const n = fs.readSync(fd, buf, 0, buf.length, 0);
|
|
2990
|
+
fs.closeSync(fd);
|
|
2991
|
+
const raw = buf.subarray(0, n).toString('utf-8');
|
|
2992
|
+
for (const line of raw.split('\n')) {
|
|
2993
|
+
if (!line.trim())
|
|
2994
|
+
continue;
|
|
2995
|
+
let obj;
|
|
2996
|
+
try {
|
|
2997
|
+
obj = JSON.parse(line);
|
|
2998
|
+
}
|
|
2999
|
+
catch {
|
|
3000
|
+
continue;
|
|
3001
|
+
}
|
|
3002
|
+
const isUser = obj?.type === 'user' || obj?.message?.role === 'user';
|
|
3003
|
+
if (!isUser)
|
|
3004
|
+
continue;
|
|
3005
|
+
const c = (obj?.message?.content ?? obj?.content);
|
|
3006
|
+
const text = typeof c === 'string'
|
|
3007
|
+
? c
|
|
3008
|
+
: Array.isArray(c)
|
|
3009
|
+
? c.map(p => (typeof p === 'string' ? p : (p?.text || ''))).join(' ')
|
|
3010
|
+
: '';
|
|
3011
|
+
if (text.trim())
|
|
3012
|
+
return truncateLabel(text);
|
|
3013
|
+
}
|
|
3014
|
+
return null;
|
|
3015
|
+
}
|
|
3016
|
+
catch {
|
|
3017
|
+
return null;
|
|
3018
|
+
}
|
|
3019
|
+
}
|
|
3020
|
+
/**
|
|
3021
|
+
* Enumerate resumable past conversations for a working directory by reading
|
|
3022
|
+
* claude's transcript dir (~/.claude/projects/<encoded cwd>/<sessionId>.jsonl).
|
|
3023
|
+
* Newest first, capped. Best-effort — returns [] on any error or when the dir
|
|
3024
|
+
* doesn't exist (e.g. no prior claude sessions in this cwd).
|
|
3025
|
+
*/
|
|
3026
|
+
export function listResumableSessions(workingDir, subAgentId, limit = 12) {
|
|
3027
|
+
try {
|
|
3028
|
+
const dir = path.join(os.homedir(), '.claude', 'projects', encodeClaudeProjectDir(workingDir));
|
|
3029
|
+
const items = fs.readdirSync(dir)
|
|
3030
|
+
.filter(f => f.endsWith('.jsonl'))
|
|
3031
|
+
.map(f => {
|
|
3032
|
+
const full = path.join(dir, f);
|
|
3033
|
+
let mtime = 0;
|
|
3034
|
+
try {
|
|
3035
|
+
mtime = fs.statSync(full).mtimeMs;
|
|
3036
|
+
}
|
|
3037
|
+
catch { /* skip stat errors */ }
|
|
3038
|
+
return { full, mtime, sessionId: f.replace(/\.jsonl$/, '') };
|
|
3039
|
+
})
|
|
3040
|
+
.sort((a, b) => b.mtime - a.mtime)
|
|
3041
|
+
.slice(0, limit);
|
|
3042
|
+
return items.map(it => ({
|
|
3043
|
+
sessionId: it.sessionId,
|
|
3044
|
+
label: deriveSessionLabel(it.full) || 'Conversation',
|
|
3045
|
+
when: it.mtime ? new Date(it.mtime).toISOString() : undefined,
|
|
3046
|
+
subAgentId: subAgentId ?? null,
|
|
3047
|
+
}));
|
|
3048
|
+
}
|
|
3049
|
+
catch {
|
|
3050
|
+
return [];
|
|
3051
|
+
}
|
|
3052
|
+
}
|
|
2976
3053
|
/**
|
|
2977
3054
|
* Start an interactive Claude CLI session.
|
|
2978
3055
|
* The session runs with --dangerously-skip-permissions for uninterrupted interaction.
|
|
2979
3056
|
*/
|
|
2980
3057
|
export async function startSession(options) {
|
|
2981
|
-
const { sessionId, workingDirectory, channel, cols = 120, rows = 40, subAgentId, subAgentName, resume } = options;
|
|
3058
|
+
const { sessionId, workingDirectory, channel, cols = 120, rows = 40, subAgentId, subAgentName, resume, resumeSessionId } = options;
|
|
2982
3059
|
// If this exact sessionId is already live, terminate it before re-creating.
|
|
2983
3060
|
// Sessions on OTHER workstreams are left untouched — they run concurrently.
|
|
2984
3061
|
if (sessions.has(sessionId)) {
|
|
@@ -3125,9 +3202,18 @@ export async function startSession(options) {
|
|
|
3125
3202
|
// cli.ts) both reattach the latest session non-interactively; kimi has no
|
|
3126
3203
|
// resume flag, so the option is silently ignored there. Prepended so it's an
|
|
3127
3204
|
// unambiguous standalone flag, separate from --append-system-prompt's value.
|
|
3128
|
-
if (resume && cliCommand !== 'kimi') {
|
|
3129
|
-
|
|
3130
|
-
|
|
3205
|
+
if ((resume || resumeSessionId) && cliCommand !== 'kimi') {
|
|
3206
|
+
// claude can target a SPECIFIC past conversation by id (--resume <id>);
|
|
3207
|
+
// orquesta-cli only reattaches the latest (--continue). So when a specific
|
|
3208
|
+
// id is requested and we're on claude, use --resume; otherwise --continue.
|
|
3209
|
+
if (resumeSessionId && cliCommand === 'claude') {
|
|
3210
|
+
ptyArgs.unshift('--resume', resumeSessionId);
|
|
3211
|
+
logger.info(`[Session] Resuming conversation ${resumeSessionId} (--resume) for ${cliCommand}`);
|
|
3212
|
+
}
|
|
3213
|
+
else {
|
|
3214
|
+
ptyArgs.unshift('--continue');
|
|
3215
|
+
logger.info(`[Session] Resuming most recent conversation (--continue) for ${cliCommand}`);
|
|
3216
|
+
}
|
|
3131
3217
|
}
|
|
3132
3218
|
// Per-project endpoint override (only the orquesta CLI understands --endpoint).
|
|
3133
3219
|
if (cliCommand === 'orquesta' && globalCliEndpoint) {
|
|
@@ -3324,7 +3410,7 @@ export async function startSession(options) {
|
|
|
3324
3410
|
* Send input to the active interactive session.
|
|
3325
3411
|
* This writes directly to Claude CLI's stdin.
|
|
3326
3412
|
* If raw=true, write the input byte(s) directly without appending Enter (used for ESC, Ctrl+C).
|
|
3327
|
-
* If attachments are provided, they're downloaded to /
|
|
3413
|
+
* If attachments are provided, they're downloaded to ~/.cache/orquesta-attachments and
|
|
3328
3414
|
* their absolute paths are appended to the message text so Claude can Read them.
|
|
3329
3415
|
*/
|
|
3330
3416
|
export function sendSessionInput(sessionId, input, raw = false, attachments) {
|