@roamcode.ai/server 1.0.0

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 (100) hide show
  1. package/LICENSE +21 -0
  2. package/dist/auth.d.ts +63 -0
  3. package/dist/auth.js +133 -0
  4. package/dist/claude-auth-service.d.ts +76 -0
  5. package/dist/claude-auth-service.js +217 -0
  6. package/dist/claude-latest-service.d.ts +34 -0
  7. package/dist/claude-latest-service.js +61 -0
  8. package/dist/config.d.ts +78 -0
  9. package/dist/config.js +59 -0
  10. package/dist/data-dir.d.ts +42 -0
  11. package/dist/data-dir.js +70 -0
  12. package/dist/diag.d.ts +43 -0
  13. package/dist/diag.js +83 -0
  14. package/dist/fs-service.d.ts +90 -0
  15. package/dist/fs-service.js +290 -0
  16. package/dist/index.d.ts +82 -0
  17. package/dist/index.js +44 -0
  18. package/dist/managed-runtime.d.ts +51 -0
  19. package/dist/managed-runtime.js +411 -0
  20. package/dist/managed-update-helper.d.ts +2 -0
  21. package/dist/managed-update-helper.js +34 -0
  22. package/dist/mcp-send.d.ts +33 -0
  23. package/dist/mcp-send.js +107 -0
  24. package/dist/origin-check.d.ts +37 -0
  25. package/dist/origin-check.js +101 -0
  26. package/dist/pane-status.d.ts +61 -0
  27. package/dist/pane-status.js +145 -0
  28. package/dist/providers/claude-metadata-service.d.ts +58 -0
  29. package/dist/providers/claude-metadata-service.js +352 -0
  30. package/dist/providers/claude-provider.d.ts +11 -0
  31. package/dist/providers/claude-provider.js +166 -0
  32. package/dist/providers/codex-activity.d.ts +21 -0
  33. package/dist/providers/codex-activity.js +122 -0
  34. package/dist/providers/codex-app-server-client.d.ts +90 -0
  35. package/dist/providers/codex-app-server-client.js +485 -0
  36. package/dist/providers/codex-latest-service.d.ts +50 -0
  37. package/dist/providers/codex-latest-service.js +174 -0
  38. package/dist/providers/codex-metadata-service.d.ts +161 -0
  39. package/dist/providers/codex-metadata-service.js +686 -0
  40. package/dist/providers/codex-profile-client.d.ts +16 -0
  41. package/dist/providers/codex-profile-client.js +52 -0
  42. package/dist/providers/codex-profile-security.d.ts +23 -0
  43. package/dist/providers/codex-profile-security.js +161 -0
  44. package/dist/providers/codex-provider.d.ts +15 -0
  45. package/dist/providers/codex-provider.js +174 -0
  46. package/dist/providers/codex-thread-coordinator.d.ts +18 -0
  47. package/dist/providers/codex-thread-coordinator.js +93 -0
  48. package/dist/providers/codex-thread-persistence.d.ts +9 -0
  49. package/dist/providers/codex-thread-persistence.js +45 -0
  50. package/dist/providers/codex-thread-resolver.d.ts +59 -0
  51. package/dist/providers/codex-thread-resolver.js +322 -0
  52. package/dist/providers/options.d.ts +7 -0
  53. package/dist/providers/options.js +155 -0
  54. package/dist/providers/provider-artifacts.d.ts +3 -0
  55. package/dist/providers/provider-artifacts.js +30 -0
  56. package/dist/providers/registry.d.ts +7 -0
  57. package/dist/providers/registry.js +23 -0
  58. package/dist/providers/types.d.ts +95 -0
  59. package/dist/providers/types.js +8 -0
  60. package/dist/push-dispatch.d.ts +81 -0
  61. package/dist/push-dispatch.js +100 -0
  62. package/dist/push-store.d.ts +25 -0
  63. package/dist/push-store.js +79 -0
  64. package/dist/rate-limit.d.ts +52 -0
  65. package/dist/rate-limit.js +72 -0
  66. package/dist/server-config.d.ts +60 -0
  67. package/dist/server-config.js +77 -0
  68. package/dist/service-install.d.ts +60 -0
  69. package/dist/service-install.js +221 -0
  70. package/dist/session-defaults.d.ts +26 -0
  71. package/dist/session-defaults.js +60 -0
  72. package/dist/session-store.d.ts +81 -0
  73. package/dist/session-store.js +654 -0
  74. package/dist/start.d.ts +31 -0
  75. package/dist/start.js +372 -0
  76. package/dist/static-routes.d.ts +101 -0
  77. package/dist/static-routes.js +188 -0
  78. package/dist/terminal-capability.d.ts +5 -0
  79. package/dist/terminal-capability.js +27 -0
  80. package/dist/terminal-manager.d.ts +224 -0
  81. package/dist/terminal-manager.js +917 -0
  82. package/dist/terminal-process.d.ts +85 -0
  83. package/dist/terminal-process.js +238 -0
  84. package/dist/terminal-shared.d.ts +36 -0
  85. package/dist/terminal-shared.js +43 -0
  86. package/dist/tmux-list.d.ts +11 -0
  87. package/dist/tmux-list.js +39 -0
  88. package/dist/transport.d.ts +123 -0
  89. package/dist/transport.js +1559 -0
  90. package/dist/updater.d.ts +161 -0
  91. package/dist/updater.js +451 -0
  92. package/dist/usage-service.d.ts +118 -0
  93. package/dist/usage-service.js +173 -0
  94. package/dist/vapid.d.ts +17 -0
  95. package/dist/vapid.js +31 -0
  96. package/dist/web-push-send.d.ts +20 -0
  97. package/dist/web-push-send.js +21 -0
  98. package/dist/ws-ticket.d.ts +47 -0
  99. package/dist/ws-ticket.js +62 -0
  100. package/package.json +55 -0
@@ -0,0 +1,174 @@
1
+ export const CODEX_VERSION_UNAVAILABLE = "CODEX_VERSION_UNAVAILABLE";
2
+ export const CODEX_VERSION_TIMEOUT_MS = 5_000;
3
+ export const CODEX_VERSION_MAX_OUTPUT_BYTES = 1_024;
4
+ export const CODEX_LATEST_MAX_RESPONSE_BYTES = 16_384;
5
+ export const DEFAULT_CODEX_VERSION_CACHE_TTL_MS = 5 * 60_000;
6
+ export class CodexVersionUnavailableError extends Error {
7
+ code = CODEX_VERSION_UNAVAILABLE;
8
+ constructor() {
9
+ super("Codex version is unavailable");
10
+ this.name = "CodexVersionUnavailableError";
11
+ }
12
+ }
13
+ const SEMVER_SOURCE = "(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?";
14
+ const SEMVER_RE = new RegExp(`^${SEMVER_SOURCE}$`);
15
+ const CODEX_VERSION_RE = new RegExp(`^codex-cli (${SEMVER_SOURCE})\\r?\\n?$`);
16
+ function unavailable() {
17
+ return new CodexVersionUnavailableError();
18
+ }
19
+ function positiveInteger(value, fallback) {
20
+ return value !== undefined && Number.isSafeInteger(value) && value > 0 ? value : fallback;
21
+ }
22
+ function parseSemver(value) {
23
+ const match = SEMVER_RE.exec(value);
24
+ if (!match)
25
+ return undefined;
26
+ const major = Number(match[1]);
27
+ const minor = Number(match[2]);
28
+ const patch = Number(match[3]);
29
+ if (![major, minor, patch].every(Number.isSafeInteger))
30
+ return undefined;
31
+ const prerelease = match[4]?.split(".");
32
+ if (prerelease?.some((identifier) => /^\d+$/.test(identifier) && identifier.length > 1 && identifier.startsWith("0"))) {
33
+ return undefined;
34
+ }
35
+ return { major, minor, patch, ...(prerelease ? { prerelease } : {}) };
36
+ }
37
+ function compareIdentifiers(left, right) {
38
+ const leftNumeric = /^\d+$/.test(left);
39
+ const rightNumeric = /^\d+$/.test(right);
40
+ if (leftNumeric && rightNumeric) {
41
+ if (left.length !== right.length)
42
+ return left.length - right.length;
43
+ return left === right ? 0 : left < right ? -1 : 1;
44
+ }
45
+ if (leftNumeric !== rightNumeric)
46
+ return leftNumeric ? -1 : 1;
47
+ return left === right ? 0 : left < right ? -1 : 1;
48
+ }
49
+ function compareSemver(left, right) {
50
+ for (const key of ["major", "minor", "patch"]) {
51
+ if (left[key] !== right[key])
52
+ return left[key] - right[key];
53
+ }
54
+ if (!left.prerelease && !right.prerelease)
55
+ return 0;
56
+ if (!left.prerelease)
57
+ return 1;
58
+ if (!right.prerelease)
59
+ return -1;
60
+ const length = Math.max(left.prerelease.length, right.prerelease.length);
61
+ for (let index = 0; index < length; index += 1) {
62
+ const leftIdentifier = left.prerelease[index];
63
+ const rightIdentifier = right.prerelease[index];
64
+ if (leftIdentifier === undefined)
65
+ return -1;
66
+ if (rightIdentifier === undefined)
67
+ return 1;
68
+ const compared = compareIdentifiers(leftIdentifier, rightIdentifier);
69
+ if (compared !== 0)
70
+ return compared;
71
+ }
72
+ return 0;
73
+ }
74
+ export function parseCodexVersion(stdout) {
75
+ if (typeof stdout !== "string" || Buffer.byteLength(stdout) > CODEX_VERSION_MAX_OUTPUT_BYTES)
76
+ throw unavailable();
77
+ const match = CODEX_VERSION_RE.exec(stdout);
78
+ if (!match || !parseSemver(match[1]))
79
+ throw unavailable();
80
+ return match[1];
81
+ }
82
+ function hintFor(provenance) {
83
+ if (provenance === "chatgpt")
84
+ return "Update Codex through the ChatGPT app.";
85
+ if (provenance === "homebrew")
86
+ return "Update Codex through Homebrew.";
87
+ return "Update Codex through the installation source that provided it.";
88
+ }
89
+ export class CodexLatestService {
90
+ options;
91
+ now;
92
+ cacheTtlMs;
93
+ cache;
94
+ inFlight;
95
+ constructor(options) {
96
+ this.options = options;
97
+ this.now = options.now ?? (() => Date.now());
98
+ this.cacheTtlMs = positiveInteger(options.cacheTtlMs, DEFAULT_CODEX_VERSION_CACHE_TTL_MS);
99
+ }
100
+ async getVersion(force = false) {
101
+ const now = this.now();
102
+ if (!force && this.cache && now - this.cache.at < this.cacheTtlMs)
103
+ return { ...this.cache.info };
104
+ if (this.inFlight)
105
+ return { ...(await this.inFlight) };
106
+ const request = this.loadVersion();
107
+ this.inFlight = request;
108
+ try {
109
+ const info = await request;
110
+ this.cache = { at: this.now(), info: { ...info } };
111
+ return { ...info };
112
+ }
113
+ finally {
114
+ if (this.inFlight === request)
115
+ this.inFlight = undefined;
116
+ }
117
+ }
118
+ async loadVersion() {
119
+ let run;
120
+ try {
121
+ run = await this.options.runVersion(["--version"], {
122
+ timeoutMs: CODEX_VERSION_TIMEOUT_MS,
123
+ maxOutputBytes: CODEX_VERSION_MAX_OUTPUT_BYTES,
124
+ });
125
+ }
126
+ catch {
127
+ throw unavailable();
128
+ }
129
+ if (run.code !== 0 ||
130
+ typeof run.stdout !== "string" ||
131
+ typeof run.stderr !== "string" ||
132
+ Buffer.byteLength(run.stdout) + Buffer.byteLength(run.stderr) > CODEX_VERSION_MAX_OUTPUT_BYTES) {
133
+ throw unavailable();
134
+ }
135
+ const installed = parseCodexVersion(run.stdout);
136
+ let provenance;
137
+ try {
138
+ provenance = await this.options.detectProvenance();
139
+ }
140
+ catch {
141
+ provenance = "unknown";
142
+ }
143
+ if (!["npm", "chatgpt", "homebrew", "unknown"].includes(provenance))
144
+ provenance = "unknown";
145
+ if (provenance !== "npm")
146
+ return { installed, provenance, updateHint: hintFor(provenance) };
147
+ try {
148
+ const latestRaw = await this.options.fetchNpmLatest("@openai/codex", {
149
+ timeoutMs: CODEX_VERSION_TIMEOUT_MS,
150
+ maxResponseBytes: CODEX_LATEST_MAX_RESPONSE_BYTES,
151
+ });
152
+ if (typeof latestRaw !== "string" || Buffer.byteLength(latestRaw) > 256)
153
+ throw unavailable();
154
+ const latest = latestRaw.trim();
155
+ const installedSemver = parseSemver(installed);
156
+ const latestSemver = parseSemver(latest);
157
+ if (!installedSemver || !latestSemver)
158
+ throw unavailable();
159
+ return {
160
+ installed,
161
+ latest,
162
+ updateAvailable: compareSemver(installedSemver, latestSemver) < 0,
163
+ provenance,
164
+ };
165
+ }
166
+ catch {
167
+ return {
168
+ installed,
169
+ provenance,
170
+ updateHint: "Latest npm version is temporarily unavailable.",
171
+ };
172
+ }
173
+ }
174
+ }
@@ -0,0 +1,161 @@
1
+ import { type ZodType } from "zod";
2
+ import { type CodexProfileLaunchProof } from "./types.js";
3
+ import { type CodexProfileClientLifecycle } from "./codex-profile-client.js";
4
+ import type { ReadCodexThreadInventory } from "./codex-thread-resolver.js";
5
+ export declare const CODEX_METADATA_ERROR_CODE: "CODEX_METADATA_UNAVAILABLE";
6
+ export declare const CODEX_MODEL_CATALOG_ERROR_CODE: "CODEX_MODEL_CATALOG_UNAVAILABLE";
7
+ export declare const OSS_PROVIDER_DEFERRED: "OSS_PROVIDER_DEFERRED";
8
+ export interface CodexMetadataRpc {
9
+ request<T>(method: string, params: unknown, schema: ZodType<T>): Promise<T>;
10
+ onNotification(listener: (notification: {
11
+ method: string;
12
+ params?: unknown;
13
+ }) => void): () => void;
14
+ start?(): Promise<void>;
15
+ stop?(): Promise<void>;
16
+ }
17
+ export interface CodexAccount {
18
+ readonly authenticated: boolean;
19
+ readonly authMethod: "none" | "apiKey" | "chatgpt";
20
+ readonly plan?: string;
21
+ }
22
+ export interface CodexModel {
23
+ readonly value: string;
24
+ readonly id: string;
25
+ readonly displayName: string;
26
+ readonly description: string;
27
+ readonly isDefault: boolean;
28
+ readonly reasoningOptions: ReadonlyArray<{
29
+ value: string;
30
+ description: string;
31
+ isDefault: boolean;
32
+ }>;
33
+ readonly supportedReasoningEfforts: string[];
34
+ readonly defaultReasoningEffort: string;
35
+ }
36
+ export interface CodexUsageBar {
37
+ readonly id: string;
38
+ readonly label: string;
39
+ readonly percent: number;
40
+ readonly resetsAt?: number;
41
+ readonly windowDurationMs?: number;
42
+ }
43
+ export interface CodexUsage {
44
+ readonly bars: CodexUsageBar[];
45
+ readonly credits?: {
46
+ readonly hasCredits: boolean;
47
+ readonly unlimited: boolean;
48
+ readonly balance?: string;
49
+ readonly resetCreditsAvailable?: number;
50
+ };
51
+ readonly fetchedAt: number;
52
+ }
53
+ export type CodexLoginCompletion = {
54
+ readonly status: "completed";
55
+ } | {
56
+ readonly status: "failed";
57
+ } | {
58
+ readonly status: "canceled";
59
+ } | {
60
+ readonly status: "expired";
61
+ };
62
+ export type CodexLoginStatus = CodexLoginCompletion | {
63
+ readonly status: "pending";
64
+ } | {
65
+ readonly status: "notFound";
66
+ };
67
+ export interface CodexDeviceLogin {
68
+ readonly loginId: string;
69
+ readonly userCode: string;
70
+ readonly verificationUrl: string;
71
+ readonly expiresAt: number;
72
+ readonly completion: Promise<CodexLoginCompletion>;
73
+ }
74
+ export interface CodexMetadataServiceOptions {
75
+ readonly now?: () => number;
76
+ readonly loginTtlMs?: number;
77
+ readonly modelCacheTtlMs?: number;
78
+ readonly capabilityCacheTtlMs?: number;
79
+ readonly capabilityTimeoutMs?: number;
80
+ readonly maxModelPages?: number;
81
+ readonly maxModelItems?: number;
82
+ readonly codexHome?: string;
83
+ readonly profileClient?: CodexProfileClientLifecycle;
84
+ }
85
+ export declare class CodexMetadataServiceError extends Error {
86
+ readonly code: "CODEX_METADATA_UNAVAILABLE";
87
+ constructor(message?: string);
88
+ }
89
+ export declare class CodexModelCatalogError extends Error {
90
+ readonly code: "CODEX_MODEL_CATALOG_UNAVAILABLE";
91
+ constructor();
92
+ }
93
+ export declare class CodexProfileCapabilityError extends Error {
94
+ readonly code: "OSS_PROVIDER_DEFERRED";
95
+ constructor();
96
+ }
97
+ export declare class CodexMetadataService {
98
+ private readonly rpc;
99
+ private readonly now;
100
+ private readonly loginTtlMs;
101
+ private readonly modelCacheTtlMs;
102
+ private readonly capabilityCacheTtlMs;
103
+ private readonly capabilityTimeoutMs;
104
+ private readonly maxModelPages;
105
+ private readonly maxModelItems;
106
+ private readonly codexHome?;
107
+ private readonly profileClient?;
108
+ private readonly activeLogins;
109
+ private readonly earlyLoginCompletions;
110
+ private readonly retiredLoginIds;
111
+ private readonly loginOutcomes;
112
+ private activeStartGeneration?;
113
+ private nextStartGeneration;
114
+ private startingLogin?;
115
+ private modelCache?;
116
+ private modelRequest?;
117
+ private lastUsageDiagnostic?;
118
+ private lastCapabilityDiagnostic?;
119
+ private capabilityCache?;
120
+ private capabilityRequest?;
121
+ private readonly unsubscribeNotification;
122
+ private disposed;
123
+ constructor(rpc: CodexMetadataRpc, options?: CodexMetadataServiceOptions);
124
+ get diagnostics(): {
125
+ readonly usage?: {
126
+ readonly code: typeof CODEX_METADATA_ERROR_CODE;
127
+ readonly message: string;
128
+ };
129
+ readonly capabilities?: {
130
+ readonly code: typeof CODEX_METADATA_ERROR_CODE;
131
+ readonly message: string;
132
+ };
133
+ };
134
+ probeCapabilities(cwd: string, readThreadInventory: ReadCodexThreadInventory): Promise<boolean>;
135
+ private loadCapabilities;
136
+ getAccount(): Promise<CodexAccount>;
137
+ startDeviceLogin(): Promise<CodexDeviceLogin>;
138
+ cancelLogin(loginId: string): Promise<{
139
+ status: "canceled" | "notFound";
140
+ }>;
141
+ getLoginStatus(loginId: string): CodexLoginStatus;
142
+ dispose(): void;
143
+ getModels(force?: boolean): Promise<CodexModel[]>;
144
+ validateModelSelection(model: string, reasoningEffort?: string): Promise<void>;
145
+ getUsage(): Promise<CodexUsage | null>;
146
+ listProfiles(): Promise<string[]>;
147
+ readonly validateProfile: (profile: string, cwd: string) => Promise<CodexProfileLaunchProof>;
148
+ private readProfileConfig;
149
+ private installLogin;
150
+ private onNotification;
151
+ private settleLogin;
152
+ private finishStartGeneration;
153
+ private retireLoginId;
154
+ private pruneEarlyLoginCompletions;
155
+ private pruneRetiredLoginIds;
156
+ private recordLoginOutcome;
157
+ private pruneLoginOutcomes;
158
+ private expireLogin;
159
+ private loadModels;
160
+ private appendSnapshotBars;
161
+ }