@farhoodliquor/paperclip-adapter-opencode-k8s 0.1.4 → 0.1.6
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/index.d.ts +1 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -7
- package/dist/index.js.map +1 -1
- package/dist/server/job-manifest.test.d.ts +2 -0
- package/dist/server/job-manifest.test.d.ts.map +1 -0
- package/dist/server/job-manifest.test.js +90 -0
- package/dist/server/job-manifest.test.js.map +1 -0
- package/dist/server/k8s-client.d.ts +1 -1
- package/dist/server/k8s-client.d.ts.map +1 -1
- package/dist/server/k8s-client.js +6 -15
- package/dist/server/k8s-client.js.map +1 -1
- package/dist/server/parse.test.d.ts +2 -0
- package/dist/server/parse.test.d.ts.map +1 -0
- package/dist/server/parse.test.js +109 -0
- package/dist/server/parse.test.js.map +1 -0
- package/package.json +6 -3
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
export declare const type = "opencode_k8s";
|
|
2
2
|
export declare const label = "OpenCode (Kubernetes)";
|
|
3
|
-
export declare const models:
|
|
4
|
-
id: string;
|
|
5
|
-
label: string;
|
|
6
|
-
}[];
|
|
3
|
+
export declare const models: undefined;
|
|
7
4
|
export declare const agentConfigurationDoc = "# opencode_k8s agent configuration\n\nAdapter: opencode_k8s\n\nRuns OpenCode inside an isolated Kubernetes Job pod instead of the main\nPaperclip process. The Job inherits the container image, imagePullSecrets,\nDNS config, and PVC from the running Paperclip Deployment automatically.\n\nCore fields:\n- model (string, required): OpenCode model id in provider/model format (e.g. anthropic/claude-sonnet-4-6)\n- variant (string, optional): provider-specific reasoning/profile variant passed as --variant\n- dangerouslySkipPermissions (boolean, optional): inject runtime config with permission.external_directory=allow; defaults to true\n- promptTemplate (string, optional): run prompt template\n- extraArgs (string[], optional): additional CLI args appended to the opencode command\n- env (object, optional): KEY=VALUE environment variables; overrides inherited vars from the Deployment\n\nKubernetes fields:\n- namespace (string, optional): namespace for Jobs; defaults to the Deployment namespace\n- image (string, optional): override container image; defaults to the running Deployment image\n- imagePullPolicy (string, optional): image pull policy; default \"IfNotPresent\"\n- kubeconfig (string, optional): absolute path to a kubeconfig file on disk; defaults to in-cluster service account auth\n- resources (object, optional): { requests: { cpu, memory }, limits: { cpu, memory } }\n- nodeSelector (object, optional): node selector for Job pods\n- tolerations (array, optional): tolerations for Job pods\n- labels (object, optional): extra labels added to Job metadata\n- ttlSecondsAfterFinished (number, optional): auto-cleanup delay; default 300\n- retainJobs (boolean, optional): skip cleanup on completion for debugging\n\nOperational fields:\n- timeoutSec (number, optional): run timeout in seconds; 0 means no timeout\n- graceSec (number, optional): additional grace before adapter gives up after Job deadline\n\nInherited from Deployment (no config needed):\n- ANTHROPIC_API_KEY, OPENAI_API_KEY, and other provider keys\n- CLAUDE_CODE_USE_BEDROCK, AWS_REGION, AWS_BEARER_TOKEN_BEDROCK\n- PAPERCLIP_API_URL\n- Container image, imagePullSecrets, DNS config, PVC mount, security context\n\nNotes:\n- Session resume works via the shared /paperclip PVC (HOME=/paperclip)\n- Skills are bundled in the container image\n- Prompts are delivered via a busybox init container writing to an emptyDir volume\n- Runtime config (permission.external_directory=allow) is written inside the Job container\n- OPENCODE_DISABLE_PROJECT_CONFIG=true is always set to prevent config file pollution\n";
|
|
8
5
|
export { createServerAdapter } from "./server/index.js";
|
|
9
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,iBAAiB,CAAC;AACnC,eAAO,MAAM,KAAK,0BAA0B,CAAC;AAE7C,eAAO,MAAM,MAAM
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,iBAAiB,CAAC;AACnC,eAAO,MAAM,KAAK,0BAA0B,CAAC;AAE7C,eAAO,MAAM,MAAM,EAAE,SAAqB,CAAC;AAE3C,eAAO,MAAM,qBAAqB,giFA4CjC,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
export const type = "opencode_k8s";
|
|
2
2
|
export const label = "OpenCode (Kubernetes)";
|
|
3
|
-
export const models =
|
|
4
|
-
{ id: "openai/gpt-5.2-codex", label: "openai/gpt-5.2-codex" },
|
|
5
|
-
{ id: "openai/gpt-5.4", label: "openai/gpt-5.4" },
|
|
6
|
-
{ id: "openai/gpt-5.2", label: "openai/gpt-5.2" },
|
|
7
|
-
{ id: "openai/gpt-5.1-codex-max", label: "openai/gpt-5.1-codex-max" },
|
|
8
|
-
{ id: "openai/gpt-5.1-codex-mini", label: "openai/gpt-5.1-codex-mini" },
|
|
9
|
-
];
|
|
3
|
+
export const models = undefined;
|
|
10
4
|
export const agentConfigurationDoc = `# opencode_k8s agent configuration
|
|
11
5
|
|
|
12
6
|
Adapter: opencode_k8s
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG,cAAc,CAAC;AACnC,MAAM,CAAC,MAAM,KAAK,GAAG,uBAAuB,CAAC;AAE7C,MAAM,CAAC,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG,cAAc,CAAC;AACnC,MAAM,CAAC,MAAM,KAAK,GAAG,uBAAuB,CAAC;AAE7C,MAAM,CAAC,MAAM,MAAM,GAAc,SAAS,CAAC;AAE3C,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4CpC,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-manifest.test.d.ts","sourceRoot":"","sources":["../../src/server/job-manifest.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { buildJobManifest } from "./job-manifest.js";
|
|
3
|
+
const mockSelfPod = {
|
|
4
|
+
namespace: "paperclip",
|
|
5
|
+
image: "paperclip/paperclip:latest",
|
|
6
|
+
imagePullSecrets: [],
|
|
7
|
+
inheritedEnv: {},
|
|
8
|
+
pvcClaimName: null,
|
|
9
|
+
dnsConfig: undefined,
|
|
10
|
+
secretVolumes: [],
|
|
11
|
+
};
|
|
12
|
+
const mockCtx = {
|
|
13
|
+
runId: "run123456",
|
|
14
|
+
agent: { id: "agent-abc", name: "Test Agent", companyId: "co123", adapterType: null, adapterConfig: null },
|
|
15
|
+
runtime: { sessionId: null, sessionParams: {}, sessionDisplayId: null, taskKey: null },
|
|
16
|
+
config: {},
|
|
17
|
+
context: {
|
|
18
|
+
taskId: null,
|
|
19
|
+
issueId: null,
|
|
20
|
+
paperclipWorkspace: null,
|
|
21
|
+
issueIds: null,
|
|
22
|
+
paperclipWorkspaces: null,
|
|
23
|
+
paperclipRuntimeServiceIntents: null,
|
|
24
|
+
paperclipRuntimeServices: null,
|
|
25
|
+
},
|
|
26
|
+
onLog: async () => { },
|
|
27
|
+
};
|
|
28
|
+
describe("buildJobManifest", () => {
|
|
29
|
+
it("creates job with agent-opencode- prefix in name", () => {
|
|
30
|
+
const result = buildJobManifest({ ctx: mockCtx, selfPod: mockSelfPod });
|
|
31
|
+
expect(result.jobName).toMatch(/^agent-opencode-/);
|
|
32
|
+
});
|
|
33
|
+
it("uses default image from selfPod", () => {
|
|
34
|
+
const result = buildJobManifest({ ctx: mockCtx, selfPod: mockSelfPod });
|
|
35
|
+
const container = result.job.spec?.template?.spec?.containers?.[0];
|
|
36
|
+
expect(container?.image).toBe("paperclip/paperclip:latest");
|
|
37
|
+
});
|
|
38
|
+
it("sets fsGroupChangePolicy to OnRootMismatch", () => {
|
|
39
|
+
const result = buildJobManifest({ ctx: mockCtx, selfPod: mockSelfPod });
|
|
40
|
+
const securityContext = result.job.spec?.template?.spec?.securityContext;
|
|
41
|
+
expect(securityContext?.fsGroupChangePolicy).toBe("OnRootMismatch");
|
|
42
|
+
});
|
|
43
|
+
it("sets runAsNonRoot and runAsUser 1000", () => {
|
|
44
|
+
const result = buildJobManifest({ ctx: mockCtx, selfPod: mockSelfPod });
|
|
45
|
+
const securityContext = result.job.spec?.template?.spec?.securityContext;
|
|
46
|
+
expect(securityContext?.runAsNonRoot).toBe(true);
|
|
47
|
+
expect(securityContext?.runAsUser).toBe(1000);
|
|
48
|
+
expect(securityContext?.runAsGroup).toBe(1000);
|
|
49
|
+
expect(securityContext?.fsGroup).toBe(1000);
|
|
50
|
+
});
|
|
51
|
+
it("maps labels to job metadata", () => {
|
|
52
|
+
const result = buildJobManifest({ ctx: mockCtx, selfPod: mockSelfPod });
|
|
53
|
+
expect(result.job.metadata?.labels?.["app.kubernetes.io/managed-by"]).toBe("paperclip");
|
|
54
|
+
expect(result.job.metadata?.labels?.["paperclip.io/adapter-type"]).toBe("opencode_k8s");
|
|
55
|
+
expect(result.job.metadata?.labels?.["paperclip.io/agent-id"]).toBe("agent-abc");
|
|
56
|
+
expect(result.job.metadata?.labels?.["paperclip.io/run-id"]).toBe("run123456");
|
|
57
|
+
});
|
|
58
|
+
it("creates init container for prompt", () => {
|
|
59
|
+
const result = buildJobManifest({ ctx: mockCtx, selfPod: mockSelfPod });
|
|
60
|
+
const initContainers = result.job.spec?.template?.spec?.initContainers;
|
|
61
|
+
expect(initContainers?.length).toBe(1);
|
|
62
|
+
expect(initContainers?.[0].name).toBe("write-prompt");
|
|
63
|
+
expect(initContainers?.[0].image).toBe("busybox:1.36");
|
|
64
|
+
});
|
|
65
|
+
it("sets HOME to /paperclip", () => {
|
|
66
|
+
const result = buildJobManifest({ ctx: mockCtx, selfPod: mockSelfPod });
|
|
67
|
+
const env = result.job.spec?.template?.spec?.containers?.[0].env ?? [];
|
|
68
|
+
const homeEnv = env.find((e) => e.name === "HOME");
|
|
69
|
+
expect(homeEnv?.value).toBe("/paperclip");
|
|
70
|
+
});
|
|
71
|
+
it("sets OPENCODE_DISABLE_PROJECT_CONFIG=true", () => {
|
|
72
|
+
const result = buildJobManifest({ ctx: mockCtx, selfPod: mockSelfPod });
|
|
73
|
+
const env = result.job.spec?.template?.spec?.containers?.[0].env ?? [];
|
|
74
|
+
const opencodeEnv = env.find((e) => e.name === "OPENCODE_DISABLE_PROJECT_CONFIG");
|
|
75
|
+
expect(opencodeEnv?.value).toBe("true");
|
|
76
|
+
});
|
|
77
|
+
it("applies default ttlSecondsAfterFinished of 300", () => {
|
|
78
|
+
const result = buildJobManifest({ ctx: mockCtx, selfPod: mockSelfPod });
|
|
79
|
+
expect(result.job.spec?.ttlSecondsAfterFinished).toBe(300);
|
|
80
|
+
});
|
|
81
|
+
it("sets backoffLimit to 0", () => {
|
|
82
|
+
const result = buildJobManifest({ ctx: mockCtx, selfPod: mockSelfPod });
|
|
83
|
+
expect(result.job.spec?.backoffLimit).toBe(0);
|
|
84
|
+
});
|
|
85
|
+
it("uses job template restartPolicy Never", () => {
|
|
86
|
+
const result = buildJobManifest({ ctx: mockCtx, selfPod: mockSelfPod });
|
|
87
|
+
expect(result.job.spec?.template?.spec?.restartPolicy).toBe("Never");
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=job-manifest.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-manifest.test.js","sourceRoot":"","sources":["../../src/server/job-manifest.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,7 @@ export interface SelfPodInfo {
|
|
|
19
19
|
dnsConfig: k8s.V1PodDNSConfig | undefined;
|
|
20
20
|
pvcClaimName: string | null;
|
|
21
21
|
secretVolumes: SelfPodSecretVolume[];
|
|
22
|
-
/** Env vars
|
|
22
|
+
/** Env vars read directly from the pod spec's container definition. */
|
|
23
23
|
inheritedEnv: Record<string, string>;
|
|
24
24
|
}
|
|
25
25
|
export declare function getBatchApi(kubeconfigPath?: string): k8s.BatchV1Api;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"k8s-client.d.ts","sourceRoot":"","sources":["../../src/server/k8s-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,yBAAyB,CAAC;AAG/C;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1C,SAAS,EAAE,GAAG,CAAC,cAAc,GAAG,SAAS,CAAC;IAC1C,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,
|
|
1
|
+
{"version":3,"file":"k8s-client.d.ts","sourceRoot":"","sources":["../../src/server/k8s-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,yBAAyB,CAAC;AAG/C;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1C,SAAS,EAAE,GAAG,CAAC,cAAc,GAAG,SAAS,CAAC;IAC1C,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,uEAAuE;IACvE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAyBD,wBAAgB,WAAW,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,UAAU,CAEnE;AAED,wBAAgB,UAAU,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,SAAS,CAEjE;AAED,wBAAgB,WAAW,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,kBAAkB,CAE3E;AAED,wBAAgB,SAAS,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,GAAG,CAE1D;AAmBD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAmElF;AAED,6CAA6C;AAC7C,wBAAgB,UAAU,IAAI,IAAI,CAGjC"}
|
|
@@ -1,14 +1,5 @@
|
|
|
1
1
|
import * as k8s from "@kubernetes/client-node";
|
|
2
2
|
import { readFileSync } from "node:fs";
|
|
3
|
-
/** Keys forwarded from the Deployment container env into Job pods. */
|
|
4
|
-
const INHERITED_ENV_KEYS = [
|
|
5
|
-
"CLAUDE_CODE_USE_BEDROCK",
|
|
6
|
-
"AWS_REGION",
|
|
7
|
-
"AWS_BEARER_TOKEN_BEDROCK",
|
|
8
|
-
"ANTHROPIC_API_KEY",
|
|
9
|
-
"OPENAI_API_KEY",
|
|
10
|
-
"PAPERCLIP_API_URL",
|
|
11
|
-
];
|
|
12
3
|
let cachedSelfPod = null;
|
|
13
4
|
/**
|
|
14
5
|
* Cache keyed by kubeconfig path (empty string = in-cluster).
|
|
@@ -103,13 +94,13 @@ export async function getSelfPodInfo(kubeconfigPath) {
|
|
|
103
94
|
});
|
|
104
95
|
}
|
|
105
96
|
}
|
|
106
|
-
// Collect
|
|
97
|
+
// Collect all env vars directly from the pod spec container definition.
|
|
98
|
+
// This gives the authoritative env the container was configured with in K8s —
|
|
99
|
+
// no static allowlist needed; any env var from the Deployment is forwarded.
|
|
107
100
|
const inheritedEnv = {};
|
|
108
|
-
for (const
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
inheritedEnv[key] = value;
|
|
112
|
-
}
|
|
101
|
+
for (const envVar of mainContainer.env ?? []) {
|
|
102
|
+
if (envVar.value)
|
|
103
|
+
inheritedEnv[envVar.name] = envVar.value;
|
|
113
104
|
}
|
|
114
105
|
cachedSelfPod = {
|
|
115
106
|
namespace,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"k8s-client.js","sourceRoot":"","sources":["../../src/server/k8s-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAyBvC,
|
|
1
|
+
{"version":3,"file":"k8s-client.js","sourceRoot":"","sources":["../../src/server/k8s-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.test.d.ts","sourceRoot":"","sources":["../../src/server/parse.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { parseOpenCodeJsonl, isOpenCodeUnknownSessionError } from "./parse.js";
|
|
3
|
+
describe("parseOpenCodeJsonl", () => {
|
|
4
|
+
it("parses text messages", () => {
|
|
5
|
+
const stdout = [
|
|
6
|
+
JSON.stringify({ type: "text", part: { text: "Hello" }, sessionID: "ses_123" }),
|
|
7
|
+
JSON.stringify({ type: "text", part: { text: "World" }, sessionID: "ses_123" }),
|
|
8
|
+
].join("\n");
|
|
9
|
+
const result = parseOpenCodeJsonl(stdout);
|
|
10
|
+
expect(result.sessionId).toBe("ses_123");
|
|
11
|
+
expect(result.summary).toBe("Hello\n\nWorld");
|
|
12
|
+
expect(result.errorMessage).toBeNull();
|
|
13
|
+
});
|
|
14
|
+
it("accumulates usage from step_finish events", () => {
|
|
15
|
+
const stdout = [
|
|
16
|
+
JSON.stringify({
|
|
17
|
+
type: "step_finish",
|
|
18
|
+
part: { tokens: { input: 100, output: 50, reasoning: 20, cache: { read: 80 } }, cost: 0.001 },
|
|
19
|
+
}),
|
|
20
|
+
].join("\n");
|
|
21
|
+
const result = parseOpenCodeJsonl(stdout);
|
|
22
|
+
expect(result.usage.inputTokens).toBe(100);
|
|
23
|
+
expect(result.usage.cachedInputTokens).toBe(80);
|
|
24
|
+
expect(result.usage.outputTokens).toBe(70);
|
|
25
|
+
expect(result.costUsd).toBeCloseTo(0.001);
|
|
26
|
+
});
|
|
27
|
+
it("captures errors from error type events", () => {
|
|
28
|
+
const stdout = [
|
|
29
|
+
JSON.stringify({ type: "error", error: { message: "Something went wrong" } }),
|
|
30
|
+
].join("\n");
|
|
31
|
+
const result = parseOpenCodeJsonl(stdout);
|
|
32
|
+
expect(result.errorMessage).toBe("Something went wrong");
|
|
33
|
+
});
|
|
34
|
+
it("captures tool_use errors with error state", () => {
|
|
35
|
+
const stdout = [
|
|
36
|
+
JSON.stringify({
|
|
37
|
+
type: "tool_use",
|
|
38
|
+
part: { state: { status: "error", error: "Tool failed" } },
|
|
39
|
+
}),
|
|
40
|
+
].join("\n");
|
|
41
|
+
const result = parseOpenCodeJsonl(stdout);
|
|
42
|
+
expect(result.errorMessage).toBe("Tool failed");
|
|
43
|
+
});
|
|
44
|
+
it("extracts sessionId from any event", () => {
|
|
45
|
+
const stdout = [
|
|
46
|
+
JSON.stringify({ type: "text", part: { text: "Hi" }, sessionID: "ses_abc" }),
|
|
47
|
+
].join("\n");
|
|
48
|
+
const result = parseOpenCodeJsonl(stdout);
|
|
49
|
+
expect(result.sessionId).toBe("ses_abc");
|
|
50
|
+
});
|
|
51
|
+
it("handles empty stdout", () => {
|
|
52
|
+
const result = parseOpenCodeJsonl("");
|
|
53
|
+
expect(result.sessionId).toBeNull();
|
|
54
|
+
expect(result.summary).toBe("");
|
|
55
|
+
expect(result.errorMessage).toBeNull();
|
|
56
|
+
});
|
|
57
|
+
it("skips malformed JSON lines", () => {
|
|
58
|
+
const stdout = [
|
|
59
|
+
"not json at all",
|
|
60
|
+
JSON.stringify({ type: "text", part: { text: "Valid" }, sessionID: "ses_1" }),
|
|
61
|
+
"",
|
|
62
|
+
].join("\n");
|
|
63
|
+
const result = parseOpenCodeJsonl(stdout);
|
|
64
|
+
expect(result.summary).toBe("Valid");
|
|
65
|
+
});
|
|
66
|
+
it("combines multiple errors", () => {
|
|
67
|
+
const stdout = [
|
|
68
|
+
JSON.stringify({ type: "error", error: { message: "Error 1" } }),
|
|
69
|
+
JSON.stringify({ type: "error", error: { message: "Error 2" } }),
|
|
70
|
+
].join("\n");
|
|
71
|
+
const result = parseOpenCodeJsonl(stdout);
|
|
72
|
+
expect(result.errorMessage).toBe("Error 1\nError 2");
|
|
73
|
+
});
|
|
74
|
+
it("parses nested error message in data field", () => {
|
|
75
|
+
const stdout = [
|
|
76
|
+
JSON.stringify({ type: "error", error: { data: { message: "Nested error" } } }),
|
|
77
|
+
].join("\n");
|
|
78
|
+
const result = parseOpenCodeJsonl(stdout);
|
|
79
|
+
expect(result.errorMessage).toBe("Nested error");
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
describe("isOpenCodeUnknownSessionError", () => {
|
|
83
|
+
it("detects 'unknown session' in stdout", () => {
|
|
84
|
+
const stdout = "Error: unknown session";
|
|
85
|
+
expect(isOpenCodeUnknownSessionError(stdout, "")).toBe(true);
|
|
86
|
+
});
|
|
87
|
+
it("detects 'session not found' in stdout", () => {
|
|
88
|
+
const stdout = "session not found";
|
|
89
|
+
expect(isOpenCodeUnknownSessionError(stdout, "")).toBe(true);
|
|
90
|
+
});
|
|
91
|
+
it("detects 'resource not found' with session path in stdout", () => {
|
|
92
|
+
const stdout = "resource not found: /session/abc.json";
|
|
93
|
+
expect(isOpenCodeUnknownSessionError(stdout, "")).toBe(true);
|
|
94
|
+
});
|
|
95
|
+
it("detects 'no session' in combined output", () => {
|
|
96
|
+
const stdout = "";
|
|
97
|
+
const stderr = "no session available";
|
|
98
|
+
expect(isOpenCodeUnknownSessionError(stdout, stderr)).toBe(true);
|
|
99
|
+
});
|
|
100
|
+
it("returns false for normal errors", () => {
|
|
101
|
+
const stdout = "Something went wrong";
|
|
102
|
+
expect(isOpenCodeUnknownSessionError(stdout, "")).toBe(false);
|
|
103
|
+
});
|
|
104
|
+
it("handles case insensitivity", () => {
|
|
105
|
+
const stdout = "UNKNOWN SESSION";
|
|
106
|
+
expect(isOpenCodeUnknownSessionError(stdout, "")).toBe(true);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
//# sourceMappingURL=parse.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.test.js","sourceRoot":"","sources":["../../src/server/parse.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAE/E,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,MAAM,GAAG;YACb,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;YAC/E,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;SAChF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAE1C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG;YACb,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;aAC9F,CAAC;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAE1C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,MAAM,GAAG;YACb,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,CAAC;SAC9E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAE1C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG;YACb,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE;aAC3D,CAAC;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAE1C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,MAAM,GAAG;YACb,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;SAC7E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAE1C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAEtC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,MAAM,GAAG;YACb,iBAAiB;YACjB,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;YAC7E,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAE1C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,MAAM,GAAG;YACb,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC;YAChE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC;SACjE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAE1C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG;YACb,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;SAChF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAE1C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,wBAAwB,CAAC;QACxC,MAAM,CAAC,6BAA6B,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,mBAAmB,CAAC;QACnC,MAAM,CAAC,6BAA6B,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,MAAM,GAAG,uCAAuC,CAAC;QACvD,MAAM,CAAC,6BAA6B,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,sBAAsB,CAAC;QACtC,MAAM,CAAC,6BAA6B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,sBAAsB,CAAC;QACtC,MAAM,CAAC,6BAA6B,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,MAAM,GAAG,iBAAiB,CAAC;QACjC,MAAM,CAAC,6BAA6B,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@farhoodliquor/paperclip-adapter-opencode-k8s",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "Paperclip adapter plugin that runs OpenCode agents as Kubernetes Jobs",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -18,7 +18,9 @@
|
|
|
18
18
|
"scripts": {
|
|
19
19
|
"build": "tsc",
|
|
20
20
|
"clean": "rm -rf dist",
|
|
21
|
-
"typecheck": "tsc --noEmit"
|
|
21
|
+
"typecheck": "tsc --noEmit",
|
|
22
|
+
"test": "vitest run",
|
|
23
|
+
"test:watch": "vitest"
|
|
22
24
|
},
|
|
23
25
|
"dependencies": {
|
|
24
26
|
"@kubernetes/client-node": "^1.0.0"
|
|
@@ -29,6 +31,7 @@
|
|
|
29
31
|
"devDependencies": {
|
|
30
32
|
"@paperclipai/adapter-utils": "^0.3.0",
|
|
31
33
|
"@types/node": "^24.6.0",
|
|
32
|
-
"typescript": "^5.7.3"
|
|
34
|
+
"typescript": "^5.7.3",
|
|
35
|
+
"vitest": "^4.1.4"
|
|
33
36
|
}
|
|
34
37
|
}
|