{"record":{"id":"b5876c84a3186ea4","repo":"paperclipai/paperclip","slug":"createos-returned-an-unknown-process-event","errorCode":null,"errorMessage":"CreateOS returned an unknown process event.","messagePattern":"CreateOS returned an unknown process event\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/plugins/sandbox-providers/createos/src/execute.ts","lineNumber":184,"sourceCode":"            const exitSignal = event.signal;\n            if (!(typeof exitCode === \"number\" && Number.isInteger(exitCode)) &&\n                !(typeof exitSignal === \"string\" && /^SIG[A-Z0-9]+$/.test(exitSignal))) {\n              throw new Error(\"CreateOS process exit status is missing.\");\n            }\n            completed = true;\n            output.finish();\n            return {\n              exitCode: typeof exitCode === \"number\" ? exitCode : null,\n              signal: typeof exitSignal === \"string\" ? exitSignal : null,\n              timedOut: false, stdout: output.stdout, stderr: output.stderr,\n              metadata: { processId, outputTruncated: output.truncated },\n            };\n          } else if (event.type === \"error\") {\n            throw new Error(event.error === \"output_offset_expired\"\n              ? \"CreateOS process output was evicted before it could be read.\"\n              : \"CreateOS process stream reported an error.\");\n          } else {\n            throw new Error(\"CreateOS returned an unknown process event.\");\n          }\n        }\n      } catch (error) {\n        // Network read failures can resume from the last accepted sequence.\n        // Protocol errors must fail closed rather than reconnect past bad data.\n        if (!(error instanceof TypeError) || signal.aborted) throw error;\n      }\n      if (++reconnects > 3) throw new Error(\"CreateOS process stream ended without an exit status.\");\n      await delay(250, undefined, { signal });\n    }\n  } catch (error) {\n    if (creationMayHaveSucceeded && !processId) {\n      throw new CreateosCleanupError(\"CreateOS process creation could not be confirmed; destroy the lease before reusing it.\");\n    }\n    if (signal.aborted && signal.reason?.name === \"TimeoutError\") {\n      output.finish();\n      return {\n        exitCode: null, timedOut: true, stdout: output.stdout, stderr: output.stderr,","sourceCodeStart":166,"sourceCodeEnd":202,"githubUrl":"https://github.com/paperclipai/paperclip/blob/3f1d897a7c018d76563a21c6e39c3c9b03933622/packages/plugins/sandbox-providers/createos/src/execute.ts#L166-L202","documentation":"execute() consumes a stream of typed process events (exit, output, error). If an event arrives whose type matches none of the known variants, the provider fails closed with this message rather than guessing. It guards against protocol drift between the client and the CreateOS server.","triggerScenarios":"The CreateOS API emits a new or malformed event type not handled by the switch/else-if chain in execute(); a proxy or middleware rewrites the stream payload; a version mismatch between client and server introduces an event variant this client does not know.","commonSituations":"Running an older plugin against a newer CreateOS server that added event types; a gateway injecting keep-alive frames parsed as events; corrupted stream framing producing junk events.","solutions":["Upgrade the @paperclipai sandbox-providers createos package (and server) so both sides agree on the event schema.","Log the raw event (JSON.stringify(event)) to identify the unknown type before failing.","Verify no intermediary proxy is modifying or fragmenting the SSE/stream response.","Check for known protocol changes in CreateOS release notes."],"exampleFix":"// before\n} else {\n  throw new Error(\"CreateOS returned an unknown process event.\");\n}\n// after\n} else {\n  logger.warn(\"unknown createos event\", event);\n  throw new Error(`CreateOS returned an unknown process event: ${JSON.stringify(event)}`);\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":"function isKnownProcessEvent(e) {\n  return [\"exit\", \"output\", \"error\"].includes(e?.type);\n}","tryCatchPattern":"try {\n  await execute(lease, cmd, { signal });\n} catch (e) {\n  if (e.message === \"CreateOS returned an unknown process event.\") {\n    reportProtocolMismatch(e); // upgrade client/server\n  }\n  throw e;\n}","preventionTips":["Pin and align createos client plugin and server versions.","Log raw unknown events to accelerate protocol-drift debugging.","Avoid proxies that rewrite or buffer streaming responses."],"tags":["protocol","stream","sandbox","unexpected-response"],"backgroundTag":"unexpected-response-shape","analyzedSha":"3f1d897a7c018d76563a21c6e39c3c9b03933622","analyzedAt":"2026-09-18T08:03:59.046Z","contentChangedAt":"2026-09-18T08:03:59.046Z","schemaVersion":2},"datasetVersion":"2026-09-22T16:17:23.217Z"}