@iam-brain/opencode-codex-auth 0.1.6 → 0.1.8

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.
@@ -0,0 +1,17 @@
1
+ export declare const PERSONALITY_SKILL_KEY = "personality-builder";
2
+ export declare const PERSONALITY_SKILL_FILE = "SKILL.md";
3
+ export type InstallPersonalitySkillInput = {
4
+ skillsDir?: string;
5
+ force?: boolean;
6
+ };
7
+ export type InstallPersonalitySkillResult = {
8
+ skillsDir: string;
9
+ skillDir: string;
10
+ created: boolean;
11
+ updated: boolean;
12
+ written: string[];
13
+ skipped: string[];
14
+ };
15
+ export declare function defaultOpencodeSkillsDir(env?: Record<string, string | undefined>): string;
16
+ export declare function installPersonalityBuilderSkill(input?: InstallPersonalitySkillInput): Promise<InstallPersonalitySkillResult>;
17
+ //# sourceMappingURL=personality-skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personality-skill.d.ts","sourceRoot":"","sources":["../../lib/personality-skill.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,qBAAqB,wBAAwB,CAAA;AAC1D,eAAO,MAAM,sBAAsB,aAAa,CAAA;AAqFhD,MAAM,MAAM,4BAA4B,GAAG;IACzC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB,CAAA;AAeD,wBAAgB,wBAAwB,CAAC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,MAAM,CAItG;AAED,wBAAsB,8BAA8B,CAClD,KAAK,GAAE,4BAAiC,GACvC,OAAO,CAAC,6BAA6B,CAAC,CAuCxC"}
@@ -0,0 +1,136 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ export const PERSONALITY_SKILL_KEY = "personality-builder";
5
+ export const PERSONALITY_SKILL_FILE = "SKILL.md";
6
+ const PERSONALITY_SKILL_TEMPLATE = `---
7
+ name: personality-builder
8
+ description: Create or refine coding personalities from source voice documents while preserving strict coding-agent competence and safety behavior.
9
+ ---
10
+
11
+ # Personality Builder
12
+
13
+ Use this skill when a user wants to create or refine a personality profile for OpenCode Codex Auth, especially when they provide a source persona, character, or writing style.
14
+
15
+ ## Outcomes
16
+
17
+ 1. Preserve voice fidelity (tone, phrasing, motifs).
18
+ 2. Preserve coding-agent competence (accuracy, momentum, safety, self-correction).
19
+ 3. Produce a profile that can be saved through the \`create-personality\` tool.
20
+
21
+ ## Workflow
22
+
23
+ 1. Gather requirements with focused, one-at-a-time questions:
24
+ - key/name (safe lowercase slug),
25
+ - source text (full or excerpt),
26
+ - inspiration origin (person/doc/character),
27
+ - tone and style cues,
28
+ - collaboration style and coding style,
29
+ - hard guardrails and avoidances,
30
+ - optional example phrases.
31
+ 2. Keep the personality grounded in terminal coding-agent behavior.
32
+ 3. If a source document is provided, read \`references/personality-patterns.md\` and map voice cues into constraints.
33
+ 4. Call \`create-personality\` with structured fields when ready.
34
+ 5. Confirm resulting key/path and activation path in \`codex-config.json\`.
35
+
36
+ ## Tool Contract
37
+
38
+ When persisting, call \`create-personality\` with:
39
+
40
+ - required: \`name\`
41
+ - recommended: \`sourceText\`, \`targetStyle\`, \`voiceFidelity\`, \`competenceStrictness\`, \`domain\`
42
+ - persistence: \`scope\`, \`overwrite\`
43
+
44
+ ## Non-negotiables
45
+
46
+ - Voice can be playful, weird, or dramatic.
47
+ - Behavior must still remain accurate, safe, and task-completing.
48
+ - If voice guidance conflicts with correctness, correctness wins while staying in-character.
49
+ `;
50
+ const PERSONALITY_PATTERNS_REFERENCE = `# Personality Patterns
51
+
52
+ Use these patterns as reference while creating personalities.
53
+
54
+ ## Core contract (must keep)
55
+
56
+ - You are a coding agent in a terminal-first workflow.
57
+ - You do not invent command output, tool results, or files.
58
+ - You prefer small, reversible changes and verify before claiming success.
59
+ - You communicate clearly and collaborate constructively.
60
+
61
+ ## Style anchors
62
+
63
+ - Friendly:
64
+ - warm, collaborative, supportive,
65
+ - clear framing and reassurance,
66
+ - concise by default, expands when complexity requires.
67
+ - Pragmatic:
68
+ - direct, specific, implementation-focused,
69
+ - minimal fluff,
70
+ - explicit tradeoffs and concrete next steps.
71
+
72
+ ## Voice extraction checklist
73
+
74
+ - Vocabulary and repeated motifs (e.g., nicknames, catchphrases).
75
+ - Cadence (short punchy vs long descriptive lines).
76
+ - Humor mode (dry, playful, absurd, meme-heavy).
77
+ - Formatting habits (bullets, sentence casing, punctuation style).
78
+
79
+ ## Competence guardrails
80
+
81
+ - Clarify only when uncertainty materially changes execution.
82
+ - Mark uncertainty honestly; no fake certainty.
83
+ - Correct errors quickly and continue.
84
+ - Keep momentum with concrete next actions and validation.
85
+ - Apply safe alternatives when requests are risky.
86
+ `;
87
+ const MANAGED_SKILL_FILES = [
88
+ { relativePath: PERSONALITY_SKILL_FILE, content: PERSONALITY_SKILL_TEMPLATE },
89
+ {
90
+ relativePath: path.join("references", "personality-patterns.md"),
91
+ content: PERSONALITY_PATTERNS_REFERENCE
92
+ }
93
+ ];
94
+ export function defaultOpencodeSkillsDir(env = process.env) {
95
+ const xdgRoot = env.XDG_CONFIG_HOME?.trim();
96
+ if (xdgRoot)
97
+ return path.join(xdgRoot, "opencode", "skills");
98
+ return path.join(os.homedir(), ".config", "opencode", "skills");
99
+ }
100
+ export async function installPersonalityBuilderSkill(input = {}) {
101
+ const skillsDir = input.skillsDir ?? defaultOpencodeSkillsDir();
102
+ const skillDir = path.join(skillsDir, PERSONALITY_SKILL_KEY);
103
+ const written = [];
104
+ const skipped = [];
105
+ let created = false;
106
+ let updated = false;
107
+ for (const file of MANAGED_SKILL_FILES) {
108
+ const filePath = path.join(skillDir, file.relativePath);
109
+ let existingContent;
110
+ try {
111
+ existingContent = await fs.readFile(filePath, "utf8");
112
+ }
113
+ catch {
114
+ existingContent = undefined;
115
+ }
116
+ if (existingContent === file.content) {
117
+ skipped.push(filePath);
118
+ continue;
119
+ }
120
+ if (existingContent !== undefined && input.force !== true) {
121
+ skipped.push(filePath);
122
+ continue;
123
+ }
124
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
125
+ await fs.writeFile(filePath, file.content, { encoding: "utf8", mode: 0o600 });
126
+ written.push(filePath);
127
+ if (existingContent === undefined) {
128
+ created = true;
129
+ }
130
+ else {
131
+ updated = true;
132
+ }
133
+ }
134
+ return { skillsDir, skillDir, created, updated, written, skipped };
135
+ }
136
+ //# sourceMappingURL=personality-skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personality-skill.js","sourceRoot":"","sources":["../../lib/personality-skill.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rotation.d.ts","sourceRoot":"","sources":["../../lib/rotation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAI9D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,wBAAgB,wBAAwB,CAAC,UAAU,SAAiC,GAAG,kBAAkB,CAMxG;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,QAAQ,CAAC,EAAE,gBAAgB,CAAA;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;IACvC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAA;CAC9C,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,QAAQ,EACJ,eAAe,GACf,sBAAsB,GACtB,uBAAuB,GACvB,uBAAuB,GACvB,eAAe,GACf,mBAAmB,GACnB,sBAAsB,GACtB,uBAAuB,GACvB,eAAe,GACf,YAAY,GACZ,kBAAkB,GAClB,wBAAwB,CAAA;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAChC,CAAA;AAoID,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GACnD,aAAa,GACb,SAAS,CA2HZ"}
1
+ {"version":3,"file":"rotation.d.ts","sourceRoot":"","sources":["../../lib/rotation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAI9D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,wBAAgB,wBAAwB,CAAC,UAAU,SAAiC,GAAG,kBAAkB,CAMxG;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,QAAQ,CAAC,EAAE,gBAAgB,CAAA;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;IACvC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAA;CAC9C,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,QAAQ,EACJ,eAAe,GACf,sBAAsB,GACtB,uBAAuB,GACvB,uBAAuB,GACvB,eAAe,GACf,mBAAmB,GACnB,sBAAsB,GACtB,uBAAuB,GACvB,eAAe,GACf,YAAY,GACZ,kBAAkB,GAClB,wBAAwB,CAAA;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAChC,CAAA;AA4HD,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GACnD,aAAa,GACb,SAAS,CAmIZ"}
@@ -27,76 +27,73 @@ function resolveOffsetIndex(input, eligibleLength) {
27
27
  const pid = toNonNegativeInt(input.pid ?? process.pid);
28
28
  return pid % eligibleLength;
29
29
  }
30
- function resolveStickySessionAccount(input, eligible) {
30
+ function resolveAssignedSessionAccount(input, eligible, strategy) {
31
31
  const state = input.stickySessionState;
32
32
  const sessionKey = input.stickySessionKey?.trim();
33
33
  if (!state || !sessionKey)
34
34
  return undefined;
35
35
  const assignedIdentityKey = state.bySessionKey.get(sessionKey);
36
- if (assignedIdentityKey) {
37
- const assigned = eligible.find((acc) => acc.identityKey === assignedIdentityKey);
38
- if (assigned) {
39
- input.onDebug?.({
40
- strategy: "sticky",
41
- decision: "sticky-session-reuse",
42
- selectedIdentityKey: assigned.identityKey,
43
- activeIdentityKey: input.activeIdentityKey,
44
- sessionKey,
45
- eligibleCount: eligible.length
46
- });
47
- return assigned;
48
- }
36
+ if (!assignedIdentityKey)
37
+ return undefined;
38
+ const assigned = eligible.find((acc) => acc.identityKey === assignedIdentityKey);
39
+ if (!assigned) {
49
40
  state.bySessionKey.delete(sessionKey);
41
+ return undefined;
42
+ }
43
+ input.onDebug?.({
44
+ strategy,
45
+ decision: strategy === "sticky" ? "sticky-session-reuse" : "hybrid-session-reuse",
46
+ selectedIdentityKey: assigned.identityKey,
47
+ activeIdentityKey: input.activeIdentityKey,
48
+ sessionKey,
49
+ eligibleCount: eligible.length
50
+ });
51
+ return assigned;
52
+ }
53
+ function assignSessionAccount(input, selected, strategy, extra) {
54
+ const state = input.stickySessionState;
55
+ const sessionKey = input.stickySessionKey?.trim();
56
+ if (!state || !sessionKey || !selected?.identityKey)
57
+ return;
58
+ state.bySessionKey.set(sessionKey, selected.identityKey);
59
+ const maxEntries = Math.max(1, Math.floor(state.maxEntries ?? DEFAULT_SESSION_ASSIGNMENT_MAX));
60
+ while (state.bySessionKey.size > maxEntries) {
61
+ const oldest = state.bySessionKey.keys().next().value;
62
+ if (!oldest)
63
+ break;
64
+ state.bySessionKey.delete(oldest);
50
65
  }
66
+ input.onDebug?.({
67
+ strategy,
68
+ decision: strategy === "sticky" ? "sticky-session-assign" : "hybrid-session-assign",
69
+ selectedIdentityKey: selected.identityKey,
70
+ activeIdentityKey: input.activeIdentityKey,
71
+ sessionKey,
72
+ eligibleCount: input.accounts.length,
73
+ ...(extra ? { extra } : {})
74
+ });
75
+ }
76
+ function resolveStickySessionAccount(input, eligible) {
77
+ const reused = resolveAssignedSessionAccount(input, eligible, "sticky");
78
+ if (reused)
79
+ return reused;
51
80
  if (eligible.length === 0)
52
81
  return undefined;
82
+ const state = input.stickySessionState;
83
+ if (!state)
84
+ return undefined;
53
85
  const index = state.cursor % eligible.length;
54
86
  state.cursor = (state.cursor + 1) % eligible.length;
55
87
  const selected = eligible[index];
56
88
  if (!selected)
57
89
  return undefined;
58
- if (selected.identityKey) {
59
- state.bySessionKey.set(sessionKey, selected.identityKey);
60
- const maxEntries = Math.max(1, Math.floor(state.maxEntries ?? DEFAULT_SESSION_ASSIGNMENT_MAX));
61
- while (state.bySessionKey.size > maxEntries) {
62
- const oldest = state.bySessionKey.keys().next().value;
63
- if (!oldest)
64
- break;
65
- state.bySessionKey.delete(oldest);
66
- }
67
- }
68
- input.onDebug?.({
69
- strategy: "sticky",
70
- decision: "sticky-session-assign",
71
- selectedIdentityKey: selected.identityKey,
72
- activeIdentityKey: input.activeIdentityKey,
73
- sessionKey,
74
- eligibleCount: eligible.length,
75
- extra: { sessionCursor: state.cursor }
76
- });
90
+ assignSessionAccount(input, selected, "sticky", { sessionCursor: state.cursor });
77
91
  return selected;
78
92
  }
79
93
  function resolveHybridSessionAccount(input, eligible) {
80
- const state = input.stickySessionState;
81
- const sessionKey = input.stickySessionKey?.trim();
82
- if (!state || !sessionKey)
83
- return undefined;
84
- const assignedIdentityKey = state.bySessionKey.get(sessionKey);
85
- if (assignedIdentityKey) {
86
- const assigned = eligible.find((acc) => acc.identityKey === assignedIdentityKey);
87
- if (assigned) {
88
- input.onDebug?.({
89
- strategy: "hybrid",
90
- decision: "hybrid-session-reuse",
91
- selectedIdentityKey: assigned.identityKey,
92
- activeIdentityKey: input.activeIdentityKey,
93
- sessionKey,
94
- eligibleCount: eligible.length
95
- });
96
- return assigned;
97
- }
98
- state.bySessionKey.delete(sessionKey);
99
- }
94
+ const reused = resolveAssignedSessionAccount(input, eligible, "hybrid");
95
+ if (reused)
96
+ return reused;
100
97
  const ordered = [...eligible].sort((left, right) => {
101
98
  const leftLastUsed = left.lastUsed ?? 0;
102
99
  const rightLastUsed = right.lastUsed ?? 0;
@@ -106,30 +103,15 @@ function resolveHybridSessionAccount(input, eligible) {
106
103
  });
107
104
  if (ordered.length === 0)
108
105
  return undefined;
106
+ const state = input.stickySessionState;
107
+ if (!state)
108
+ return undefined;
109
109
  const index = state.cursor % ordered.length;
110
110
  state.cursor = (state.cursor + 1) % ordered.length;
111
111
  const selected = ordered[index];
112
112
  if (!selected)
113
113
  return undefined;
114
- if (selected.identityKey) {
115
- state.bySessionKey.set(sessionKey, selected.identityKey);
116
- const maxEntries = Math.max(1, Math.floor(state.maxEntries ?? DEFAULT_SESSION_ASSIGNMENT_MAX));
117
- while (state.bySessionKey.size > maxEntries) {
118
- const oldest = state.bySessionKey.keys().next().value;
119
- if (!oldest)
120
- break;
121
- state.bySessionKey.delete(oldest);
122
- }
123
- }
124
- input.onDebug?.({
125
- strategy: "hybrid",
126
- decision: "hybrid-session-assign",
127
- selectedIdentityKey: selected.identityKey,
128
- activeIdentityKey: input.activeIdentityKey,
129
- sessionKey,
130
- eligibleCount: eligible.length,
131
- extra: { sessionCursor: state.cursor }
132
- });
114
+ assignSessionAccount(input, selected, "hybrid", { sessionCursor: state.cursor });
133
115
  return selected;
134
116
  }
135
117
  export function selectAccount(input) {
@@ -149,11 +131,13 @@ export function selectAccount(input) {
149
131
  ? -1
150
132
  : eligible.findIndex((acc) => acc.identityKey === activeIdentityKey);
151
133
  if (strategy === "sticky") {
152
- const stickySessionAccount = input.stickyPidOffset === true ? resolveStickySessionAccount(input, eligible) : undefined;
134
+ const stickySessionAccount = resolveAssignedSessionAccount(input, eligible, "sticky") ??
135
+ (input.stickyPidOffset === true ? resolveStickySessionAccount(input, eligible) : undefined);
153
136
  if (stickySessionAccount)
154
137
  return stickySessionAccount;
155
138
  if (activeIndex >= 0) {
156
139
  const selected = eligible[activeIndex];
140
+ assignSessionAccount(input, selected, "sticky");
157
141
  input.onDebug?.({
158
142
  strategy,
159
143
  decision: "sticky-active",
@@ -165,6 +149,7 @@ export function selectAccount(input) {
165
149
  }
166
150
  if (input.stickyPidOffset !== true) {
167
151
  const selected = eligible[0];
152
+ assignSessionAccount(input, selected, "sticky");
168
153
  input.onDebug?.({
169
154
  strategy,
170
155
  decision: "sticky-fallback-first",
@@ -176,6 +161,7 @@ export function selectAccount(input) {
176
161
  }
177
162
  const offsetIndex = resolveOffsetIndex(input, eligible.length);
178
163
  const selected = eligible[offsetIndex];
164
+ assignSessionAccount(input, selected, "sticky", { offsetIndex });
179
165
  input.onDebug?.({
180
166
  strategy,
181
167
  decision: "sticky-pid-offset",
@@ -187,6 +173,9 @@ export function selectAccount(input) {
187
173
  return selected;
188
174
  }
189
175
  if (strategy === "hybrid") {
176
+ const existingSession = resolveAssignedSessionAccount(input, eligible, "hybrid");
177
+ if (existingSession)
178
+ return existingSession;
190
179
  if (input.stickyPidOffset === true) {
191
180
  const sessionAccount = resolveHybridSessionAccount(input, eligible);
192
181
  if (sessionAccount)
@@ -194,6 +183,7 @@ export function selectAccount(input) {
194
183
  }
195
184
  if (activeIndex >= 0) {
196
185
  const selected = eligible[activeIndex];
186
+ assignSessionAccount(input, selected, "hybrid");
197
187
  input.onDebug?.({
198
188
  strategy,
199
189
  decision: "hybrid-active",
@@ -215,6 +205,7 @@ export function selectAccount(input) {
215
205
  selectedLastUsed = candidateLastUsed;
216
206
  }
217
207
  }
208
+ assignSessionAccount(input, selected, "hybrid", { lastUsed: selected.lastUsed ?? 0 });
218
209
  input.onDebug?.({
219
210
  strategy,
220
211
  decision: "hybrid-lru",
@@ -1 +1 @@
1
- {"version":3,"file":"rotation.js","sourceRoot":"","sources":["../../lib/rotation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rotation.js","sourceRoot":"","sources":["../../lib/rotation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { OpenAIAuthMode } from "./types";
2
+ export declare const MAX_SESSION_AFFINITY_ENTRIES = 200;
3
+ type SessionAffinityModeRecord = {
4
+ seenSessionKeys?: Record<string, number>;
5
+ stickyBySessionKey?: Record<string, string>;
6
+ hybridBySessionKey?: Record<string, string>;
7
+ };
8
+ export type SessionAffinityFile = {
9
+ version: 1;
10
+ native?: SessionAffinityModeRecord;
11
+ codex?: SessionAffinityModeRecord;
12
+ };
13
+ export type SessionAffinitySnapshot = {
14
+ seenSessionKeys: Map<string, number>;
15
+ stickyBySessionKey: Map<string, string>;
16
+ hybridBySessionKey: Map<string, string>;
17
+ };
18
+ export type SessionExistsFn = (sessionKey: string) => Promise<boolean>;
19
+ export declare function readSessionAffinitySnapshot(file: SessionAffinityFile, mode: OpenAIAuthMode): SessionAffinitySnapshot;
20
+ export declare function writeSessionAffinitySnapshot(file: SessionAffinityFile, mode: OpenAIAuthMode, snapshot: SessionAffinitySnapshot): SessionAffinityFile;
21
+ export declare function createSessionExistsFn(env?: Record<string, string | undefined>): SessionExistsFn;
22
+ export declare function pruneSessionAffinitySnapshot(snapshot: SessionAffinitySnapshot, sessionExists: SessionExistsFn): Promise<number>;
23
+ export declare function loadSessionAffinity(filePath?: string): Promise<SessionAffinityFile>;
24
+ export declare function saveSessionAffinity(update: (current: SessionAffinityFile) => SessionAffinityFile | Promise<SessionAffinityFile>, filePath?: string): Promise<SessionAffinityFile>;
25
+ export {};
26
+ //# sourceMappingURL=session-affinity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-affinity.d.ts","sourceRoot":"","sources":["../../lib/session-affinity.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,eAAO,MAAM,4BAA4B,MAAM,CAAA;AAE/C,KAAK,yBAAyB,GAAG;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC3C,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC5C,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,CAAC,CAAA;IACV,MAAM,CAAC,EAAE,yBAAyB,CAAA;IAClC,KAAK,CAAC,EAAE,yBAAyB,CAAA;CAClC,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACvC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACxC,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;AAuFtE,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,mBAAmB,EACzB,IAAI,EAAE,cAAc,GACnB,uBAAuB,CAOzB;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,mBAAmB,EACzB,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,uBAAuB,GAChC,mBAAmB,CAarB;AAQD,wBAAgB,qBAAqB,CACnC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,eAAe,CAWjB;AAED,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,uBAAuB,EACjC,aAAa,EAAE,eAAe,GAC7B,OAAO,CAAC,MAAM,CAAC,CAiBjB;AA8BD,wBAAsB,mBAAmB,CAAC,QAAQ,GAAE,MAAqC,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAEvH;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,EAC5F,QAAQ,GAAE,MAAqC,GAC9C,OAAO,CAAC,mBAAmB,CAAC,CAK9B"}
@@ -0,0 +1,166 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { defaultSessionAffinityPath, opencodeSessionFilePath } from "./paths";
4
+ export const MAX_SESSION_AFFINITY_ENTRIES = 200;
5
+ const DEFAULT_FILE = { version: 1 };
6
+ function isRecord(value) {
7
+ return typeof value === "object" && value !== null && !Array.isArray(value);
8
+ }
9
+ function clampEntries(entries, maxEntries) {
10
+ if (entries.length <= maxEntries)
11
+ return entries;
12
+ return entries.slice(entries.length - maxEntries);
13
+ }
14
+ function sanitizeStringMap(value, maxEntries = MAX_SESSION_AFFINITY_ENTRIES) {
15
+ if (!isRecord(value))
16
+ return new Map();
17
+ const entries = [];
18
+ for (const [key, mapValue] of Object.entries(value)) {
19
+ if (key.trim().length === 0 || typeof mapValue !== "string")
20
+ continue;
21
+ entries.push([key, mapValue]);
22
+ }
23
+ return new Map(clampEntries(entries, maxEntries));
24
+ }
25
+ function sanitizeSeenMap(value, maxEntries = MAX_SESSION_AFFINITY_ENTRIES) {
26
+ if (!isRecord(value))
27
+ return new Map();
28
+ const entries = [];
29
+ for (const [key, mapValue] of Object.entries(value)) {
30
+ if (key.trim().length === 0 || typeof mapValue !== "number" || !Number.isFinite(mapValue)) {
31
+ continue;
32
+ }
33
+ entries.push([key, Math.floor(mapValue)]);
34
+ }
35
+ entries.sort((left, right) => left[1] - right[1]);
36
+ return new Map(clampEntries(entries, maxEntries));
37
+ }
38
+ function toModeRecord(snapshot) {
39
+ const seenEntries = clampEntries([...snapshot.seenSessionKeys.entries()].sort((left, right) => left[1] - right[1]), MAX_SESSION_AFFINITY_ENTRIES);
40
+ const stickyEntries = clampEntries([...snapshot.stickyBySessionKey.entries()], MAX_SESSION_AFFINITY_ENTRIES);
41
+ const hybridEntries = clampEntries([...snapshot.hybridBySessionKey.entries()], MAX_SESSION_AFFINITY_ENTRIES);
42
+ return {
43
+ seenSessionKeys: Object.fromEntries(seenEntries),
44
+ stickyBySessionKey: Object.fromEntries(stickyEntries),
45
+ hybridBySessionKey: Object.fromEntries(hybridEntries)
46
+ };
47
+ }
48
+ function sanitizeFile(input) {
49
+ if (!isRecord(input))
50
+ return { ...DEFAULT_FILE };
51
+ const out = { version: 1 };
52
+ for (const mode of ["native", "codex"]) {
53
+ const rawMode = input[mode];
54
+ if (!isRecord(rawMode))
55
+ continue;
56
+ const modeSnapshot = {
57
+ seenSessionKeys: sanitizeSeenMap(rawMode.seenSessionKeys),
58
+ stickyBySessionKey: sanitizeStringMap(rawMode.stickyBySessionKey),
59
+ hybridBySessionKey: sanitizeStringMap(rawMode.hybridBySessionKey)
60
+ };
61
+ if (modeSnapshot.seenSessionKeys.size > 0 ||
62
+ modeSnapshot.stickyBySessionKey.size > 0 ||
63
+ modeSnapshot.hybridBySessionKey.size > 0) {
64
+ out[mode] = toModeRecord(modeSnapshot);
65
+ }
66
+ }
67
+ return out;
68
+ }
69
+ export function readSessionAffinitySnapshot(file, mode) {
70
+ const modeRecord = file[mode];
71
+ return {
72
+ seenSessionKeys: sanitizeSeenMap(modeRecord?.seenSessionKeys),
73
+ stickyBySessionKey: sanitizeStringMap(modeRecord?.stickyBySessionKey),
74
+ hybridBySessionKey: sanitizeStringMap(modeRecord?.hybridBySessionKey)
75
+ };
76
+ }
77
+ export function writeSessionAffinitySnapshot(file, mode, snapshot) {
78
+ const next = sanitizeFile(file);
79
+ const modeRecord = toModeRecord(snapshot);
80
+ if (Object.keys(modeRecord.seenSessionKeys ?? {}).length === 0 &&
81
+ Object.keys(modeRecord.stickyBySessionKey ?? {}).length === 0 &&
82
+ Object.keys(modeRecord.hybridBySessionKey ?? {}).length === 0) {
83
+ delete next[mode];
84
+ }
85
+ else {
86
+ next[mode] = modeRecord;
87
+ }
88
+ return next;
89
+ }
90
+ function isSafeSessionKey(sessionKey) {
91
+ if (!sessionKey || !sessionKey.trim())
92
+ return false;
93
+ if (sessionKey.includes("/") || sessionKey.includes("\\") || sessionKey.includes(".."))
94
+ return false;
95
+ return true;
96
+ }
97
+ export function createSessionExistsFn(env = process.env) {
98
+ return async (sessionKey) => {
99
+ if (!isSafeSessionKey(sessionKey))
100
+ return false;
101
+ const filePath = opencodeSessionFilePath(sessionKey, env);
102
+ try {
103
+ await fs.access(filePath);
104
+ return true;
105
+ }
106
+ catch {
107
+ return false;
108
+ }
109
+ };
110
+ }
111
+ export async function pruneSessionAffinitySnapshot(snapshot, sessionExists) {
112
+ const keySet = new Set([
113
+ ...snapshot.seenSessionKeys.keys(),
114
+ ...snapshot.stickyBySessionKey.keys(),
115
+ ...snapshot.hybridBySessionKey.keys()
116
+ ]);
117
+ let removed = 0;
118
+ for (const sessionKey of keySet) {
119
+ const exists = await sessionExists(sessionKey);
120
+ if (exists)
121
+ continue;
122
+ if (snapshot.seenSessionKeys.delete(sessionKey))
123
+ removed += 1;
124
+ snapshot.stickyBySessionKey.delete(sessionKey);
125
+ snapshot.hybridBySessionKey.delete(sessionKey);
126
+ }
127
+ return removed;
128
+ }
129
+ async function readUnlocked(filePath) {
130
+ try {
131
+ const raw = await fs.readFile(filePath, "utf8");
132
+ const parsed = JSON.parse(raw);
133
+ return sanitizeFile(parsed);
134
+ }
135
+ catch (error) {
136
+ if (error && typeof error === "object" && "code" in error && error.code === "ENOENT") {
137
+ return { ...DEFAULT_FILE };
138
+ }
139
+ return { ...DEFAULT_FILE };
140
+ }
141
+ }
142
+ async function writeUnlocked(filePath, file) {
143
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
144
+ const tmpPath = `${filePath}.tmp`;
145
+ await fs.writeFile(tmpPath, `${JSON.stringify(file, null, 2)}\n`, {
146
+ encoding: "utf8",
147
+ mode: 0o600
148
+ });
149
+ await fs.rename(tmpPath, filePath);
150
+ try {
151
+ await fs.chmod(filePath, 0o600);
152
+ }
153
+ catch {
154
+ // best-effort permissions
155
+ }
156
+ }
157
+ export async function loadSessionAffinity(filePath = defaultSessionAffinityPath()) {
158
+ return readUnlocked(filePath);
159
+ }
160
+ export async function saveSessionAffinity(update, filePath = defaultSessionAffinityPath()) {
161
+ const current = await readUnlocked(filePath);
162
+ const next = sanitizeFile(await update(current));
163
+ await writeUnlocked(filePath, next);
164
+ return next;
165
+ }
166
+ //# sourceMappingURL=session-affinity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-affinity.js","sourceRoot":"","sources":["../../lib/session-affinity.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iam-brain/opencode-codex-auth",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "Native Codex auth with multi-account rotation for OpenCode",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",