@paperclipai/server 2026.830.0-canary.6 → 2026.830.0-canary.7
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/build-info.json +1 -1
- package/dist/vendor/paperclip-runner/drivers/codex/codex-boundaries.d.ts +9 -0
- package/dist/vendor/paperclip-runner/drivers/codex/codex-boundaries.d.ts.map +1 -0
- package/dist/vendor/paperclip-runner/drivers/codex/codex-boundaries.js +172 -0
- package/dist/vendor/paperclip-runner/drivers/codex/codex-boundaries.js.map +1 -0
- package/dist/vendor/paperclip-runner/drivers/codex/codex-thread-normalization.d.ts +20 -0
- package/dist/vendor/paperclip-runner/drivers/codex/codex-thread-normalization.d.ts.map +1 -0
- package/dist/vendor/paperclip-runner/drivers/codex/codex-thread-normalization.js +179 -0
- package/dist/vendor/paperclip-runner/drivers/codex/codex-thread-normalization.js.map +1 -0
- package/dist/vendor/paperclip-runner/live/workspace-file-reference.d.ts +17 -0
- package/dist/vendor/paperclip-runner/live/workspace-file-reference.d.ts.map +1 -0
- package/dist/vendor/paperclip-runner/live/workspace-file-reference.js +139 -0
- package/dist/vendor/paperclip-runner/live/workspace-file-reference.js.map +1 -0
- package/dist/vendor/paperclip-runner/mock-core/codex-runner.d.ts +29 -0
- package/dist/vendor/paperclip-runner/mock-core/codex-runner.d.ts.map +1 -0
- package/dist/vendor/paperclip-runner/mock-core/codex-runner.js +474 -0
- package/dist/vendor/paperclip-runner/mock-core/codex-runner.js.map +1 -0
- package/dist/vendor/paperclip-runner/protocol/live-console-fixture.d.ts +66 -0
- package/dist/vendor/paperclip-runner/protocol/live-console-fixture.d.ts.map +1 -0
- package/dist/vendor/paperclip-runner/protocol/live-console-fixture.js +186 -0
- package/dist/vendor/paperclip-runner/protocol/live-console-fixture.js.map +1 -0
- package/package.json +18 -18
package/dist/build-info.json
CHANGED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PrpStructuredRunResult } from "../../protocol/replay-contract.js";
|
|
2
|
+
export declare function validateCodexWorkingDirectory(workingDirectory: string, environment?: NodeJS.ProcessEnv): string;
|
|
3
|
+
export declare function boundedCodexPayload(value: Record<string, unknown>): Record<string, unknown>;
|
|
4
|
+
export declare function isRetainableCodexPayload(value: unknown): boolean;
|
|
5
|
+
export declare function isCodexSemanticTool(tool: string): boolean;
|
|
6
|
+
export declare function codexToolAcceptsDisposition(tool: string, disposition: PrpStructuredRunResult["reportedWorkDisposition"]): boolean;
|
|
7
|
+
export declare function redactCodexValue(value: unknown, depth?: number): unknown;
|
|
8
|
+
export declare function rejectedCodexToolCall(message: string): Record<string, unknown>;
|
|
9
|
+
//# sourceMappingURL=codex-boundaries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-boundaries.d.ts","sourceRoot":"","sources":["../../../src/drivers/codex/codex-boundaries.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAYhF,wBAAgB,6BAA6B,CAC3C,gBAAgB,EAAE,MAAM,EACxB,WAAW,GAAE,MAAM,CAAC,UAAwB,GAC3C,MAAM,CAsDR;AAkED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzB;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAShE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,sBAAsB,CAAC,yBAAyB,CAAC,GAC7D,OAAO,CAQT;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,SAAI,GAAG,OAAO,CAmBnE;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKzB"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { realpathSync, statSync } from "node:fs";
|
|
2
|
+
import { basename, dirname, isAbsolute, parse, relative, resolve, sep, } from "node:path";
|
|
3
|
+
import { CODEX_BLOCK_TOOL_NAME, CODEX_COMPLETION_TOOL_NAME, } from "../../contracts/codex.js";
|
|
4
|
+
import { redactCodexDiagnostic } from "./app-server-transport.js";
|
|
5
|
+
const MAX_RETAINED_CODEX_PAYLOAD_BYTES = 64 * 1024;
|
|
6
|
+
const MAX_RETAINED_CODEX_STRING_CHARS = 32 * 1024;
|
|
7
|
+
function record(value) {
|
|
8
|
+
return typeof value === "object" && value !== null && !Array.isArray(value)
|
|
9
|
+
? value
|
|
10
|
+
: {};
|
|
11
|
+
}
|
|
12
|
+
export function validateCodexWorkingDirectory(workingDirectory, environment = process.env) {
|
|
13
|
+
if (workingDirectory.trim().length === 0) {
|
|
14
|
+
throw new Error("Codex working directory is required");
|
|
15
|
+
}
|
|
16
|
+
const requested = resolve(workingDirectory);
|
|
17
|
+
let resolved;
|
|
18
|
+
try {
|
|
19
|
+
resolved = realpathSync.native(requested);
|
|
20
|
+
if (!statSync(resolved).isDirectory()) {
|
|
21
|
+
throw new Error("Codex working directory must be a directory");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
const code = error.code;
|
|
26
|
+
if (code === "ENOENT") {
|
|
27
|
+
throw new Error("Codex working directory must exist before provider admission");
|
|
28
|
+
}
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
if (resolved === parse(resolved).root) {
|
|
32
|
+
throw new Error("Codex working directory cannot be a filesystem root");
|
|
33
|
+
}
|
|
34
|
+
const hostHome = canonicalConfiguredPath(environment.HOME);
|
|
35
|
+
if (hostHome && pathContains(resolved, hostHome)) {
|
|
36
|
+
throw new Error("Codex working directory cannot contain the host HOME");
|
|
37
|
+
}
|
|
38
|
+
if (hostHome && pathContains(hostHome, resolved)) {
|
|
39
|
+
throw new Error("Codex working directory cannot overlap the host HOME");
|
|
40
|
+
}
|
|
41
|
+
const codexHome = canonicalConfiguredPath(environment.CODEX_HOME);
|
|
42
|
+
if (codexHome) {
|
|
43
|
+
if (pathContains(resolved, codexHome) ||
|
|
44
|
+
pathContains(codexHome, resolved)) {
|
|
45
|
+
throw new Error("Codex working directory cannot overlap host CODEX_HOME");
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const configuredRoot = environment.PAPERCLIP_WORKSPACE_CWD;
|
|
49
|
+
if (configuredRoot !== undefined && configuredRoot.trim().length > 0) {
|
|
50
|
+
const root = canonicalConfiguredPath(configuredRoot);
|
|
51
|
+
const pathFromRoot = relative(root, resolved);
|
|
52
|
+
if (pathFromRoot === ".." ||
|
|
53
|
+
pathFromRoot.startsWith(`..${sep}`) ||
|
|
54
|
+
isAbsolute(pathFromRoot)) {
|
|
55
|
+
throw new Error("Codex working directory is outside the assigned workspace");
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return resolved;
|
|
59
|
+
}
|
|
60
|
+
function canonicalConfiguredPath(value) {
|
|
61
|
+
const configured = value?.trim();
|
|
62
|
+
if (!configured)
|
|
63
|
+
return null;
|
|
64
|
+
return canonicalPathWithMissingTail(resolve(configured));
|
|
65
|
+
}
|
|
66
|
+
function canonicalPathWithMissingTail(path) {
|
|
67
|
+
let cursor = path;
|
|
68
|
+
const missing = [];
|
|
69
|
+
while (true) {
|
|
70
|
+
try {
|
|
71
|
+
return resolve(realpathSync.native(cursor), ...missing);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (error.code !== "ENOENT")
|
|
75
|
+
throw error;
|
|
76
|
+
const parent = dirname(cursor);
|
|
77
|
+
if (parent === cursor)
|
|
78
|
+
return resolve(path);
|
|
79
|
+
missing.unshift(basename(cursor));
|
|
80
|
+
cursor = parent;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function pathContains(parent, candidate) {
|
|
85
|
+
const fromParent = relative(parent, candidate);
|
|
86
|
+
return (fromParent === "" ||
|
|
87
|
+
(fromParent !== ".." &&
|
|
88
|
+
!fromParent.startsWith(`..${sep}`) &&
|
|
89
|
+
!isAbsolute(fromParent)));
|
|
90
|
+
}
|
|
91
|
+
function boundedCodexValue(value, depth = 0) {
|
|
92
|
+
if (depth > 8)
|
|
93
|
+
return { truncated: true, reason: "maximum depth" };
|
|
94
|
+
if (typeof value === "string") {
|
|
95
|
+
return value.length <= MAX_RETAINED_CODEX_STRING_CHARS
|
|
96
|
+
? value
|
|
97
|
+
: `${value.slice(0, MAX_RETAINED_CODEX_STRING_CHARS)}...[truncated]`;
|
|
98
|
+
}
|
|
99
|
+
if (Array.isArray(value)) {
|
|
100
|
+
const bounded = value
|
|
101
|
+
.slice(0, 128)
|
|
102
|
+
.map((entry) => boundedCodexValue(entry, depth + 1));
|
|
103
|
+
if (value.length > 128) {
|
|
104
|
+
bounded.push({ truncated: true, omittedItems: value.length - 128 });
|
|
105
|
+
}
|
|
106
|
+
return bounded;
|
|
107
|
+
}
|
|
108
|
+
if (typeof value !== "object" || value === null)
|
|
109
|
+
return value;
|
|
110
|
+
const object = record(value);
|
|
111
|
+
const bounded = Object.fromEntries(Object.entries(object)
|
|
112
|
+
.slice(0, 128)
|
|
113
|
+
.map(([key, entry]) => [key, boundedCodexValue(entry, depth + 1)]));
|
|
114
|
+
if (Object.keys(object).length > 128) {
|
|
115
|
+
bounded.truncatedEntries = Object.keys(object).length - 128;
|
|
116
|
+
}
|
|
117
|
+
const serialized = JSON.stringify(bounded);
|
|
118
|
+
return Buffer.byteLength(serialized) <= MAX_RETAINED_CODEX_PAYLOAD_BYTES
|
|
119
|
+
? bounded
|
|
120
|
+
: { truncated: true, byteSize: Buffer.byteLength(serialized) };
|
|
121
|
+
}
|
|
122
|
+
export function boundedCodexPayload(value) {
|
|
123
|
+
return record(boundedCodexValue(value));
|
|
124
|
+
}
|
|
125
|
+
export function isRetainableCodexPayload(value) {
|
|
126
|
+
try {
|
|
127
|
+
return (Buffer.byteLength(JSON.stringify(value)) <=
|
|
128
|
+
MAX_RETAINED_CODEX_PAYLOAD_BYTES);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
export function isCodexSemanticTool(tool) {
|
|
135
|
+
return tool === CODEX_COMPLETION_TOOL_NAME || tool === CODEX_BLOCK_TOOL_NAME;
|
|
136
|
+
}
|
|
137
|
+
export function codexToolAcceptsDisposition(tool, disposition) {
|
|
138
|
+
if (tool === CODEX_BLOCK_TOOL_NAME) {
|
|
139
|
+
return disposition === "blocked";
|
|
140
|
+
}
|
|
141
|
+
if (tool === CODEX_COMPLETION_TOOL_NAME) {
|
|
142
|
+
return disposition === "done" || disposition === "needs_review";
|
|
143
|
+
}
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
export function redactCodexValue(value, depth = 0) {
|
|
147
|
+
if (depth > 8)
|
|
148
|
+
return "[TRUNCATED]";
|
|
149
|
+
if (typeof value === "string")
|
|
150
|
+
return redactCodexDiagnostic(value);
|
|
151
|
+
if (Array.isArray(value)) {
|
|
152
|
+
return value
|
|
153
|
+
.slice(0, 128)
|
|
154
|
+
.map((entry) => redactCodexValue(entry, depth + 1));
|
|
155
|
+
}
|
|
156
|
+
const object = record(value);
|
|
157
|
+
return Object.fromEntries(Object.entries(object)
|
|
158
|
+
.slice(0, 128)
|
|
159
|
+
.map(([key, entry]) => [
|
|
160
|
+
key,
|
|
161
|
+
/(?:api[_-]?key|token|secret|password|authorization)/i.test(key)
|
|
162
|
+
? "[REDACTED]"
|
|
163
|
+
: redactCodexValue(entry, depth + 1),
|
|
164
|
+
]));
|
|
165
|
+
}
|
|
166
|
+
export function rejectedCodexToolCall(message) {
|
|
167
|
+
return {
|
|
168
|
+
success: false,
|
|
169
|
+
contentItems: [{ type: "inputText", text: message }],
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=codex-boundaries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-boundaries.js","sourceRoot":"","sources":["../../../src/drivers/codex/codex-boundaries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { HarnessThreadGoal, HarnessThreadLineageEntry } from "../../contracts/harness-driver.js";
|
|
2
|
+
export declare function parseCodexThreadGoal(value: unknown): HarnessThreadGoal | null;
|
|
3
|
+
export declare function codexThreadLineage(value: unknown): HarnessThreadLineageEntry;
|
|
4
|
+
export interface CodexNotificationBinding {
|
|
5
|
+
runId: string;
|
|
6
|
+
threadIds: readonly string[];
|
|
7
|
+
}
|
|
8
|
+
export interface BindableCodexNotification {
|
|
9
|
+
method: string;
|
|
10
|
+
params: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Admits only known notifications that explicitly name the active run or one
|
|
14
|
+
* of its known threads. A newly spawned child may bind through its parent.
|
|
15
|
+
*/
|
|
16
|
+
export declare function isBoundCodexNotification(notification: BindableCodexNotification, binding: CodexNotificationBinding): boolean;
|
|
17
|
+
export declare function codexWorkspaceRelativePath(value: unknown): string | null;
|
|
18
|
+
export declare function boundedCodexWorkspaceStat(value: unknown): number | null;
|
|
19
|
+
export declare function safeCodexRequestResponse(method: string, action?: "decline" | "cancel"): Record<string, unknown>;
|
|
20
|
+
//# sourceMappingURL=codex-thread-normalization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-thread-normalization.d.ts","sourceRoot":"","sources":["../../../src/drivers/codex/codex-thread-normalization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,yBAAyB,EAC1B,MAAM,mCAAmC,CAAC;AAkB3C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI,CAmD7E;AAOD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,yBAAyB,CA2B5E;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAiCD;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,yBAAyB,EACvC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAuBT;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAYxE;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIvE;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,SAAS,GAAG,QAAoB,GACvC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqBzB"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
function record(value) {
|
|
2
|
+
return typeof value === "object" && value !== null && !Array.isArray(value)
|
|
3
|
+
? value
|
|
4
|
+
: {};
|
|
5
|
+
}
|
|
6
|
+
function text(value, fallback = "") {
|
|
7
|
+
return typeof value === "string" ? value : fallback;
|
|
8
|
+
}
|
|
9
|
+
function nonNegativeInteger(value) {
|
|
10
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0
|
|
11
|
+
? value
|
|
12
|
+
: null;
|
|
13
|
+
}
|
|
14
|
+
export function parseCodexThreadGoal(value) {
|
|
15
|
+
const goal = record(value);
|
|
16
|
+
const threadId = text(goal.threadId);
|
|
17
|
+
const objective = text(goal.objective);
|
|
18
|
+
const status = text(goal.status);
|
|
19
|
+
if (threadId.length === 0 ||
|
|
20
|
+
objective.length === 0 ||
|
|
21
|
+
![
|
|
22
|
+
"active",
|
|
23
|
+
"paused",
|
|
24
|
+
"blocked",
|
|
25
|
+
"usageLimited",
|
|
26
|
+
"budgetLimited",
|
|
27
|
+
"complete",
|
|
28
|
+
].includes(status)) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const tokenBudget = goal.tokenBudget === null || goal.tokenBudget === undefined
|
|
32
|
+
? null
|
|
33
|
+
: nonNegativeInteger(goal.tokenBudget);
|
|
34
|
+
const tokensUsed = goal.tokensUsed === undefined
|
|
35
|
+
? 0
|
|
36
|
+
: nonNegativeInteger(goal.tokensUsed);
|
|
37
|
+
const timeUsedSeconds = goal.timeUsedSeconds === undefined
|
|
38
|
+
? 0
|
|
39
|
+
: nonNegativeInteger(goal.timeUsedSeconds);
|
|
40
|
+
const createdAt = goal.createdAt === undefined
|
|
41
|
+
? 0
|
|
42
|
+
: nonNegativeInteger(goal.createdAt);
|
|
43
|
+
const updatedAt = goal.updatedAt === undefined
|
|
44
|
+
? 0
|
|
45
|
+
: nonNegativeInteger(goal.updatedAt);
|
|
46
|
+
if ((goal.tokenBudget !== null && goal.tokenBudget !== undefined && tokenBudget === null) ||
|
|
47
|
+
tokensUsed === null ||
|
|
48
|
+
timeUsedSeconds === null ||
|
|
49
|
+
createdAt === null ||
|
|
50
|
+
updatedAt === null)
|
|
51
|
+
return null;
|
|
52
|
+
return {
|
|
53
|
+
threadId,
|
|
54
|
+
objective,
|
|
55
|
+
status: status,
|
|
56
|
+
tokenBudget,
|
|
57
|
+
tokensUsed,
|
|
58
|
+
timeUsedSeconds,
|
|
59
|
+
createdAt,
|
|
60
|
+
updatedAt,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function threadStatus(value) {
|
|
64
|
+
if (typeof value === "string")
|
|
65
|
+
return value;
|
|
66
|
+
return text(record(value).type, "unknown");
|
|
67
|
+
}
|
|
68
|
+
export function codexThreadLineage(value) {
|
|
69
|
+
const thread = record(value);
|
|
70
|
+
const source = record(thread.source);
|
|
71
|
+
const subAgent = source.subAgent ?? source.subagent;
|
|
72
|
+
const subAgentRecord = record(subAgent);
|
|
73
|
+
const spawn = record(subAgentRecord.thread_spawn ?? subAgentRecord.threadSpawn);
|
|
74
|
+
const parentThreadId = text(spawn.parent_thread_id ?? spawn.parentThreadId, text(thread.forkedFromId)) || null;
|
|
75
|
+
return {
|
|
76
|
+
threadId: text(thread.id),
|
|
77
|
+
providerSessionId: text(thread.sessionId) || null,
|
|
78
|
+
parentThreadId,
|
|
79
|
+
depth: nonNegativeInteger(spawn.depth) ?? (parentThreadId === null ? 0 : 1),
|
|
80
|
+
nickname: text(thread.agentNickname, text(spawn.agent_nickname ?? spawn.agentNickname)) || null,
|
|
81
|
+
role: text(thread.agentRole, text(spawn.agent_role ?? spawn.agentRole)) || null,
|
|
82
|
+
status: threadStatus(thread.status),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function supportedCodexNotificationMethod(method) {
|
|
86
|
+
return (method === "turn/started" ||
|
|
87
|
+
method === "turn/completed" ||
|
|
88
|
+
method === "thread/started" ||
|
|
89
|
+
method === "thread/status/changed" ||
|
|
90
|
+
method === "thread/closed" ||
|
|
91
|
+
method === "thread/goal/updated" ||
|
|
92
|
+
method === "thread/goal/cleared" ||
|
|
93
|
+
method === "serverRequest/resolved" ||
|
|
94
|
+
method === "thread/tokenUsage/updated" ||
|
|
95
|
+
method === "error" ||
|
|
96
|
+
method === "warning" ||
|
|
97
|
+
method === "configWarning" ||
|
|
98
|
+
method === "guardianWarning" ||
|
|
99
|
+
method === "deprecationNotice" ||
|
|
100
|
+
method === "windows/worldWritableWarning" ||
|
|
101
|
+
method === "hook/started" ||
|
|
102
|
+
method === "hook/completed" ||
|
|
103
|
+
method === "thread/compacted" ||
|
|
104
|
+
method === "model/rerouted" ||
|
|
105
|
+
method === "model/verification" ||
|
|
106
|
+
method === "model/safetyBuffering/updated" ||
|
|
107
|
+
method.startsWith("item/") ||
|
|
108
|
+
method === "paperclip/workspaceChange/updated" ||
|
|
109
|
+
method === "paperclip/runResult" ||
|
|
110
|
+
method === "turn/diff/updated" ||
|
|
111
|
+
method === "turn/plan/updated");
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Admits only known notifications that explicitly name the active run or one
|
|
115
|
+
* of its known threads. A newly spawned child may bind through its parent.
|
|
116
|
+
*/
|
|
117
|
+
export function isBoundCodexNotification(notification, binding) {
|
|
118
|
+
if (!supportedCodexNotificationMethod(notification.method))
|
|
119
|
+
return false;
|
|
120
|
+
const params = record(notification.params);
|
|
121
|
+
const claimedRunId = text(params.runId, text(params.paperclipRunId));
|
|
122
|
+
if (claimedRunId.length > 0 && claimedRunId !== binding.runId)
|
|
123
|
+
return false;
|
|
124
|
+
const allowedThreads = new Set(binding.threadIds);
|
|
125
|
+
const directThreadId = text(params.threadId, text(record(params.turn).threadId));
|
|
126
|
+
if (directThreadId.length > 0)
|
|
127
|
+
return allowedThreads.has(directThreadId);
|
|
128
|
+
const thread = record(params.thread);
|
|
129
|
+
const threadId = text(thread.id);
|
|
130
|
+
if (threadId.length > 0 && allowedThreads.has(threadId))
|
|
131
|
+
return true;
|
|
132
|
+
const source = record(thread.source);
|
|
133
|
+
const subAgent = record(source.subAgent ?? source.subagent);
|
|
134
|
+
const spawn = record(subAgent.thread_spawn ?? subAgent.threadSpawn);
|
|
135
|
+
const parentThreadId = text(spawn.parent_thread_id ?? spawn.parentThreadId);
|
|
136
|
+
if (notification.method === "thread/started" && parentThreadId.length > 0) {
|
|
137
|
+
return allowedThreads.has(parentThreadId);
|
|
138
|
+
}
|
|
139
|
+
if (threadId.length > 0)
|
|
140
|
+
return false;
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
export function codexWorkspaceRelativePath(value) {
|
|
144
|
+
if (typeof value !== "string")
|
|
145
|
+
return null;
|
|
146
|
+
const path = value.trim().replaceAll("\\", "/");
|
|
147
|
+
if (path.length === 0 ||
|
|
148
|
+
path.length > 1_024 ||
|
|
149
|
+
path.startsWith("/") ||
|
|
150
|
+
path.startsWith("//") ||
|
|
151
|
+
/^[A-Za-z]:/u.test(path) ||
|
|
152
|
+
path.split("/").some((part) => part === ".." || part.length === 0))
|
|
153
|
+
return null;
|
|
154
|
+
return path;
|
|
155
|
+
}
|
|
156
|
+
export function boundedCodexWorkspaceStat(value) {
|
|
157
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0
|
|
158
|
+
? value
|
|
159
|
+
: null;
|
|
160
|
+
}
|
|
161
|
+
export function safeCodexRequestResponse(method, action = "decline") {
|
|
162
|
+
if (method === "item/permissions/requestApproval") {
|
|
163
|
+
return { permissions: {}, scope: "turn" };
|
|
164
|
+
}
|
|
165
|
+
if (method === "mcpServer/elicitation/request") {
|
|
166
|
+
return { action, content: null, _meta: null };
|
|
167
|
+
}
|
|
168
|
+
if (method === "item/tool/requestUserInput" ||
|
|
169
|
+
method === "tool/requestUserInput") {
|
|
170
|
+
return { answers: {} };
|
|
171
|
+
}
|
|
172
|
+
if (method.includes("requestApproval") ||
|
|
173
|
+
method === "execCommandApproval" ||
|
|
174
|
+
method === "applyPatchApproval") {
|
|
175
|
+
return { decision: action };
|
|
176
|
+
}
|
|
177
|
+
return {};
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=codex-thread-normalization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-thread-normalization.js","sourceRoot":"","sources":["../../../src/drivers/codex/codex-thread-normalization.ts"],"names":[],"mappings":"AAKA,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACzE,CAAC,CAAE,KAAiC;QACpC,CAAC,CAAC,EAAE,CAAC;AACT,CAAC;AAED,SAAS,IAAI,CAAC,KAAc,EAAE,QAAQ,GAAG,EAAE;IACzC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AACtD,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QAC3E,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,IACE,QAAQ,CAAC,MAAM,KAAK,CAAC;QACrB,SAAS,CAAC,MAAM,KAAK,CAAC;QACtB,CAAC;YACC,QAAQ;YACR,QAAQ;YACR,SAAS;YACT,cAAc;YACd,eAAe;YACf,UAAU;SACX,CAAC,QAAQ,CAAC,MAAM,CAAC,EAClB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,KAAK,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;QAC7E,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,KAAK,SAAS;QAC9C,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,KAAK,SAAS;QACxD,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,KAAK,SAAS;QAC5C,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,KAAK,SAAS;QAC5C,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvC,IACE,CAAC,IAAI,CAAC,WAAW,KAAK,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,IAAI,CAAC;QACrF,UAAU,KAAK,IAAI;QACnB,eAAe,KAAK,IAAI;QACxB,SAAS,KAAK,IAAI;QAClB,SAAS,KAAK,IAAI;QAClB,OAAO,IAAI,CAAC;IACd,OAAO;QACL,QAAQ;QACR,SAAS;QACT,MAAM,EAAE,MAAqC;QAC7C,WAAW;QACX,UAAU;QACV,eAAe;QACf,SAAS;QACT,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;IACpD,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,CAClB,cAAc,CAAC,YAAY,IAAI,cAAc,CAAC,WAAW,CAC1D,CAAC;IACF,MAAM,cAAc,GAClB,IAAI,CACF,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,cAAc,EAC9C,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAC1B,IAAI,IAAI,CAAC;IACZ,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,IAAI;QACjD,cAAc;QACd,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,QAAQ,EACN,IAAI,CACF,MAAM,CAAC,aAAa,EACpB,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,aAAa,CAAC,CAClD,IAAI,IAAI;QACX,IAAI,EACF,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI;QAC3E,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC;KACpC,CAAC;AACJ,CAAC;AAYD,SAAS,gCAAgC,CAAC,MAAc;IACtD,OAAO,CACL,MAAM,KAAK,cAAc;QACzB,MAAM,KAAK,gBAAgB;QAC3B,MAAM,KAAK,gBAAgB;QAC3B,MAAM,KAAK,uBAAuB;QAClC,MAAM,KAAK,eAAe;QAC1B,MAAM,KAAK,qBAAqB;QAChC,MAAM,KAAK,qBAAqB;QAChC,MAAM,KAAK,wBAAwB;QACnC,MAAM,KAAK,2BAA2B;QACtC,MAAM,KAAK,OAAO;QAClB,MAAM,KAAK,SAAS;QACpB,MAAM,KAAK,eAAe;QAC1B,MAAM,KAAK,iBAAiB;QAC5B,MAAM,KAAK,mBAAmB;QAC9B,MAAM,KAAK,8BAA8B;QACzC,MAAM,KAAK,cAAc;QACzB,MAAM,KAAK,gBAAgB;QAC3B,MAAM,KAAK,kBAAkB;QAC7B,MAAM,KAAK,gBAAgB;QAC3B,MAAM,KAAK,oBAAoB;QAC/B,MAAM,KAAK,+BAA+B;QAC1C,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;QAC1B,MAAM,KAAK,mCAAmC;QAC9C,MAAM,KAAK,qBAAqB;QAChC,MAAM,KAAK,mBAAmB;QAC9B,MAAM,KAAK,mBAAmB,CAC/B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,YAAuC,EACvC,OAAiC;IAEjC,IAAI,CAAC,gCAAgC,CAAC,YAAY,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACzE,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;IACrE,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,KAAK,OAAO,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAE5E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjF,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEzE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACrE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAC;IACpE,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;IAC5E,IAAI,YAAY,CAAC,MAAM,KAAK,gBAAgB,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1E,OAAO,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAEtC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACvD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAChD,IACE,IAAI,CAAC,MAAM,KAAK,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,KAAK;QACnB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACpB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QACrB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QAC3E,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,MAAc,EACd,MAAM,GAAyB,SAAS;IAExC,IAAI,MAAM,KAAK,kCAAkC,EAAE,CAAC;QAClD,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC5C,CAAC;IACD,IAAI,MAAM,KAAK,+BAA+B,EAAE,CAAC;QAC/C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC;IACD,IACE,MAAM,KAAK,4BAA4B;QACvC,MAAM,KAAK,uBAAuB,EAClC,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzB,CAAC;IACD,IACE,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAClC,MAAM,KAAK,qBAAqB;QAChC,MAAM,KAAK,oBAAoB,EAC/B,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare const PAPERCLIP_WORKSPACE_FILE_REFERENCE_SCHEMA: "paperclip.workspace.file_reference.v1";
|
|
2
|
+
export interface PaperclipWorkspaceFileReference {
|
|
3
|
+
schema: typeof PAPERCLIP_WORKSPACE_FILE_REFERENCE_SCHEMA;
|
|
4
|
+
referenceId: string;
|
|
5
|
+
source: "harness_reported" | "runner_verified";
|
|
6
|
+
path: string;
|
|
7
|
+
displayName: string;
|
|
8
|
+
mediaType: string | null;
|
|
9
|
+
presentation: "document" | "code" | "image" | "generic";
|
|
10
|
+
line: number | null;
|
|
11
|
+
preview: string | null;
|
|
12
|
+
previewTruncated: boolean;
|
|
13
|
+
contentDigest: string | null;
|
|
14
|
+
}
|
|
15
|
+
export declare function paperclipWorkspaceFileReferencesFromText(workspace: string, assistantText: string, turnId: string, source?: PaperclipWorkspaceFileReference["source"]): PaperclipWorkspaceFileReference[];
|
|
16
|
+
export declare function discoverPaperclipWorkspaceFileReferences(workspace: string, assistantText: string, turnId: string): Promise<PaperclipWorkspaceFileReference[]>;
|
|
17
|
+
//# sourceMappingURL=workspace-file-reference.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-file-reference.d.ts","sourceRoot":"","sources":["../../src/live/workspace-file-reference.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,yCAAyC,EAAG,uCAAgD,CAAC;AAE1G,MAAM,WAAW,+BAA+B;IAC9C,MAAM,EAAE,OAAO,yCAAyC,CAAC;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,kBAAkB,GAAG,iBAAiB,CAAC;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACxD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AA8DD,wBAAgB,wCAAwC,CACtD,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,+BAA+B,CAAC,QAAQ,CAAsB,GACrE,+BAA+B,EAAE,CA6BnC;AAED,wBAAsB,wCAAwC,CAC5D,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,+BAA+B,EAAE,CAAC,CAoB5C"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { realpath } from "node:fs/promises";
|
|
3
|
+
import { basename, extname, isAbsolute, relative, resolve, sep } from "node:path";
|
|
4
|
+
export const PAPERCLIP_WORKSPACE_FILE_REFERENCE_SCHEMA = "paperclip.workspace.file_reference.v1";
|
|
5
|
+
const MAX_REFERENCES = 32;
|
|
6
|
+
const MAX_LINE_NUMBER = 1_000_000;
|
|
7
|
+
function media(path) {
|
|
8
|
+
const extension = extname(path).toLowerCase();
|
|
9
|
+
if ([".md", ".mdx", ".txt", ".rst"].includes(extension)) {
|
|
10
|
+
return { mediaType: extension === ".md" || extension === ".mdx" ? "text/markdown" : "text/plain", presentation: "document" };
|
|
11
|
+
}
|
|
12
|
+
if ([".png", ".jpg", ".jpeg", ".gif", ".webp", ".svg"].includes(extension)) {
|
|
13
|
+
const imageType = extension === ".jpg" ? "jpeg" : extension.slice(1);
|
|
14
|
+
return { mediaType: `image/${imageType}`, presentation: "image" };
|
|
15
|
+
}
|
|
16
|
+
if ([".ts", ".tsx", ".js", ".jsx", ".json", ".rs", ".py", ".go", ".java", ".css", ".html", ".yaml", ".yml", ".toml", ".sh"].includes(extension)) {
|
|
17
|
+
return { mediaType: "text/plain", presentation: "code" };
|
|
18
|
+
}
|
|
19
|
+
return { mediaType: null, presentation: "generic" };
|
|
20
|
+
}
|
|
21
|
+
function safeLineNumber(value) {
|
|
22
|
+
const line = Number(value);
|
|
23
|
+
return Number.isSafeInteger(line) && line > 0 && line <= MAX_LINE_NUMBER
|
|
24
|
+
? line
|
|
25
|
+
: null;
|
|
26
|
+
}
|
|
27
|
+
function localTarget(rawTarget) {
|
|
28
|
+
let target = rawTarget.trim();
|
|
29
|
+
if (target.startsWith("<") && target.endsWith(">"))
|
|
30
|
+
target = target.slice(1, -1);
|
|
31
|
+
if (/^[a-z][a-z0-9+.-]*:/i.test(target) && !target.startsWith("file:"))
|
|
32
|
+
return null;
|
|
33
|
+
if (target.startsWith("file://")) {
|
|
34
|
+
try {
|
|
35
|
+
target = decodeURIComponent(new URL(target).pathname);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
try {
|
|
43
|
+
target = decodeURIComponent(target);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
let line = null;
|
|
50
|
+
const hashLine = target.match(/#L(\d+)(?:C\d+)?$/i);
|
|
51
|
+
if (hashLine) {
|
|
52
|
+
line = safeLineNumber(hashLine[1]);
|
|
53
|
+
target = target.slice(0, hashLine.index);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const suffixLine = target.match(/:(\d+)$/);
|
|
57
|
+
if (suffixLine) {
|
|
58
|
+
line = safeLineNumber(suffixLine[1]);
|
|
59
|
+
target = target.slice(0, suffixLine.index);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return target.length === 0 ? null : { target, line };
|
|
63
|
+
}
|
|
64
|
+
function workspaceRelativePath(root, target) {
|
|
65
|
+
const candidate = relative(root, target);
|
|
66
|
+
if (!candidate ||
|
|
67
|
+
candidate === ".." ||
|
|
68
|
+
candidate.startsWith(`..${sep}`) ||
|
|
69
|
+
isAbsolute(candidate))
|
|
70
|
+
return null;
|
|
71
|
+
return candidate.split(sep).join("/");
|
|
72
|
+
}
|
|
73
|
+
export function paperclipWorkspaceFileReferencesFromText(workspace, assistantText, turnId, source = "harness_reported") {
|
|
74
|
+
const root = resolve(workspace);
|
|
75
|
+
const references = [];
|
|
76
|
+
const seen = new Set();
|
|
77
|
+
const links = assistantText.matchAll(/\[([^\]]+)]\((<[^>]+>|[^)\s]+)(?:\s+["'][^"']*["'])?\)/g);
|
|
78
|
+
for (const match of links) {
|
|
79
|
+
if (references.length >= MAX_REFERENCES)
|
|
80
|
+
break;
|
|
81
|
+
const parsed = localTarget(match[2] ?? "");
|
|
82
|
+
if (parsed === null)
|
|
83
|
+
continue;
|
|
84
|
+
const relativePath = workspaceRelativePath(root, resolve(root, parsed.target));
|
|
85
|
+
if (relativePath === null)
|
|
86
|
+
continue;
|
|
87
|
+
const key = `${relativePath}:${parsed.line ?? ""}`;
|
|
88
|
+
if (seen.has(key))
|
|
89
|
+
continue;
|
|
90
|
+
seen.add(key);
|
|
91
|
+
const identity = createHash("sha256").update(`${turnId}\0${key}`).digest("hex").slice(0, 24);
|
|
92
|
+
references.push({
|
|
93
|
+
schema: PAPERCLIP_WORKSPACE_FILE_REFERENCE_SCHEMA,
|
|
94
|
+
referenceId: `${turnId}:file:${identity}`,
|
|
95
|
+
source,
|
|
96
|
+
path: relativePath,
|
|
97
|
+
displayName: (match[1]?.trim() || basename(relativePath)).slice(0, 255),
|
|
98
|
+
...media(relativePath),
|
|
99
|
+
line: parsed.line,
|
|
100
|
+
preview: null,
|
|
101
|
+
previewTruncated: false,
|
|
102
|
+
contentDigest: null,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
return references;
|
|
106
|
+
}
|
|
107
|
+
export async function discoverPaperclipWorkspaceFileReferences(workspace, assistantText, turnId) {
|
|
108
|
+
let canonicalRoot;
|
|
109
|
+
try {
|
|
110
|
+
canonicalRoot = await realpath(workspace);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
// Resolve references from the same canonical root used for the containment
|
|
116
|
+
// check. Do not consult a caller-controlled workspace symlink again after
|
|
117
|
+
// canonicalizing it above.
|
|
118
|
+
const references = paperclipWorkspaceFileReferencesFromText(canonicalRoot, assistantText, turnId, "runner_verified");
|
|
119
|
+
const verified = [];
|
|
120
|
+
for (const reference of references) {
|
|
121
|
+
let canonicalPath;
|
|
122
|
+
try {
|
|
123
|
+
canonicalPath = await realpath(resolve(canonicalRoot, reference.path));
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (workspaceRelativePath(canonicalRoot, canonicalPath) === null)
|
|
129
|
+
continue;
|
|
130
|
+
// POSIX exposes an inode's current links, not where its bytes originated.
|
|
131
|
+
// Once an outside hard link is removed, an in-workspace link is
|
|
132
|
+
// indistinguishable from a file created inside the workspace. Keep the
|
|
133
|
+
// canonical, bounded reference metadata but do not retain bytes until a
|
|
134
|
+
// trusted workspace snapshot/manifest can prove file provenance.
|
|
135
|
+
verified.push(reference);
|
|
136
|
+
}
|
|
137
|
+
return verified;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=workspace-file-reference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-file-reference.js","sourceRoot":"","sources":["../../src/live/workspace-file-reference.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { HarnessDriver } from "../contracts/harness-driver.js";
|
|
2
|
+
import { type CodexResultDecision, type CodexRunMetadata, type CodexRunTrace, type CodexTaskEnvelope } from "../contracts/codex.js";
|
|
3
|
+
import type { NativeUserMessage } from "../contracts/types.js";
|
|
4
|
+
export interface CodexCodexTracerInput {
|
|
5
|
+
driver: HarnessDriver;
|
|
6
|
+
taskEnvelope: CodexTaskEnvelope;
|
|
7
|
+
workingDirectory: string;
|
|
8
|
+
message?: NativeUserMessage;
|
|
9
|
+
runId?: string;
|
|
10
|
+
normalizedSessionId?: string;
|
|
11
|
+
companyId?: string;
|
|
12
|
+
issueId?: string;
|
|
13
|
+
environmentLeaseId?: string;
|
|
14
|
+
runnerInstanceId?: string;
|
|
15
|
+
controlPlaneInstanceId?: string;
|
|
16
|
+
steer?: string;
|
|
17
|
+
interrupt?: boolean;
|
|
18
|
+
timeoutMs?: number;
|
|
19
|
+
}
|
|
20
|
+
/** Validate an advisory provider proposal against the exact controller-owned task envelope. */
|
|
21
|
+
export declare function validateCodexResultProposal(proposal: unknown, envelope: CodexTaskEnvelope): CodexResultDecision;
|
|
22
|
+
/** Parse and validate the persisted boundary before replaying controller state. */
|
|
23
|
+
export declare function replayPersistedCodexEvents(serialized: string, metadata: CodexRunMetadata): import("../reducer/session-reducer.js").SessionSnapshot;
|
|
24
|
+
/**
|
|
25
|
+
* Small in-memory Codex mock core. The driver reports provider facts; this
|
|
26
|
+
* controller validates semantic proposals and alone emits the run terminal.
|
|
27
|
+
*/
|
|
28
|
+
export declare function runCodexCodexTracer(input: CodexCodexTracerInput): Promise<CodexRunTrace>;
|
|
29
|
+
//# sourceMappingURL=codex-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-runner.d.ts","sourceRoot":"","sources":["../../src/mock-core/codex-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,gCAAgC,CAAC;AACpF,OAAO,EAEL,KAAK,mBAAmB,EAExB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAkB/D,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,aAAa,CAAC;IACtB,YAAY,EAAE,iBAAiB,CAAC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAiFD,+FAA+F;AAC/F,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,iBAAiB,GAC1B,mBAAmB,CAyDrB;AA8DD,mFAAmF;AACnF,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,gBAAgB,2DAmE3B;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,aAAa,CAAC,CA2P9F"}
|