unfairly 0.8.1 → 0.8.3

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 (89) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +17 -2
  3. package/dist/auth/browser-flow.d.ts +9 -0
  4. package/dist/auth/browser-flow.d.ts.map +1 -1
  5. package/dist/auth/browser-flow.js +11 -4
  6. package/dist/auth/browser-flow.js.map +1 -1
  7. package/dist/cmd/invite.js +2 -2
  8. package/dist/cmd/invite.js.map +1 -1
  9. package/dist/cmd/pace.d.ts +101 -0
  10. package/dist/cmd/pace.d.ts.map +1 -0
  11. package/dist/cmd/pace.js +426 -0
  12. package/dist/cmd/pace.js.map +1 -0
  13. package/dist/cmd/setup.d.ts +2 -0
  14. package/dist/cmd/setup.d.ts.map +1 -1
  15. package/dist/cmd/setup.js +20 -6
  16. package/dist/cmd/setup.js.map +1 -1
  17. package/dist/index.js +96 -2
  18. package/dist/index.js.map +1 -1
  19. package/dist/lib/types/index.d.ts +6 -6
  20. package/dist/pace/device.d.ts +104 -0
  21. package/dist/pace/device.d.ts.map +1 -0
  22. package/dist/pace/device.js +149 -0
  23. package/dist/pace/device.js.map +1 -0
  24. package/dist/pace/enroll.d.ts +80 -0
  25. package/dist/pace/enroll.d.ts.map +1 -0
  26. package/dist/pace/enroll.js +138 -0
  27. package/dist/pace/enroll.js.map +1 -0
  28. package/dist/pace/identity.d.ts +10 -0
  29. package/dist/pace/identity.d.ts.map +1 -0
  30. package/dist/pace/identity.js +17 -0
  31. package/dist/pace/identity.js.map +1 -0
  32. package/dist/pace/install.d.ts +28 -0
  33. package/dist/pace/install.d.ts.map +1 -0
  34. package/dist/pace/install.js +127 -0
  35. package/dist/pace/install.js.map +1 -0
  36. package/dist/pace/local-evidence.d.ts +75 -0
  37. package/dist/pace/local-evidence.d.ts.map +1 -0
  38. package/dist/pace/local-evidence.js +228 -0
  39. package/dist/pace/local-evidence.js.map +1 -0
  40. package/dist/pace/local-sessions.d.ts +48 -0
  41. package/dist/pace/local-sessions.d.ts.map +1 -0
  42. package/dist/pace/local-sessions.js +254 -0
  43. package/dist/pace/local-sessions.js.map +1 -0
  44. package/dist/pace/managed-config.d.ts +21 -0
  45. package/dist/pace/managed-config.d.ts.map +1 -0
  46. package/dist/pace/managed-config.js +102 -0
  47. package/dist/pace/managed-config.js.map +1 -0
  48. package/dist/pace/normalize.d.ts +10 -0
  49. package/dist/pace/normalize.d.ts.map +1 -0
  50. package/dist/pace/normalize.js +293 -0
  51. package/dist/pace/normalize.js.map +1 -0
  52. package/dist/pace/repository.d.ts +72 -0
  53. package/dist/pace/repository.d.ts.map +1 -0
  54. package/dist/pace/repository.js +120 -0
  55. package/dist/pace/repository.js.map +1 -0
  56. package/dist/pace/schema.d.ts +1325 -0
  57. package/dist/pace/schema.d.ts.map +1 -0
  58. package/dist/pace/schema.js +134 -0
  59. package/dist/pace/schema.js.map +1 -0
  60. package/dist/pace/session-summary.d.ts +179 -0
  61. package/dist/pace/session-summary.d.ts.map +1 -0
  62. package/dist/pace/session-summary.js +140 -0
  63. package/dist/pace/session-summary.js.map +1 -0
  64. package/dist/pace/spool.d.ts +6 -0
  65. package/dist/pace/spool.d.ts.map +1 -0
  66. package/dist/pace/spool.js +87 -0
  67. package/dist/pace/spool.js.map +1 -0
  68. package/dist/pace-runtime.d.ts +2 -0
  69. package/dist/pace-runtime.d.ts.map +1 -0
  70. package/dist/pace-runtime.js +67 -0
  71. package/dist/pace-runtime.js.map +1 -0
  72. package/package.json +5 -2
  73. package/plugin/.claude-plugin/plugin.json +9 -0
  74. package/plugin/.codex-plugin/plugin.json +21 -0
  75. package/plugin/.cursor-plugin/plugin.json +16 -0
  76. package/plugin/.mcp.json +8 -0
  77. package/plugin/README.md +15 -0
  78. package/plugin/deploy/README.md +30 -0
  79. package/plugin/gemini/GEMINI.md +3 -0
  80. package/plugin/gemini/gemini-extension.json +12 -0
  81. package/plugin/gemini/hooks/hooks.json +52 -0
  82. package/plugin/hooks/cursor-hooks.json +25 -0
  83. package/plugin/hooks/hooks.json +56 -0
  84. package/plugin/mcp.json +10 -0
  85. package/plugin/plugin.json +32 -0
  86. package/plugin/runtime/unfairly-intelligence.mjs +5513 -0
  87. package/plugin/scripts/capture.cjs +68 -0
  88. package/plugin/skills/find-company-playbook/SKILL.md +12 -0
  89. package/plugin/skills/publish-learning/SKILL.md +8 -0
@@ -0,0 +1,228 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { z } from "zod";
6
+ import { PaceEventSchema } from "./schema.js";
7
+ import { deterministicWorkflowId } from "./identity.js";
8
+ const sourceAppSchema = z.enum(["chatgpt", "claude_desktop", "other"]);
9
+ const evidenceRootSchema = z.object({
10
+ path: z.string().trim().min(1),
11
+ label: z.string().trim().min(1).max(128),
12
+ kind: z.enum(["output", "app_state"]),
13
+ source_app: sourceAppSchema.optional(),
14
+ extensions: z.array(z.string().trim().min(1).max(32)).max(100).optional(),
15
+ }).strict().superRefine((root, context) => {
16
+ if (root.kind === "app_state" && !root.source_app) {
17
+ context.addIssue({ code: z.ZodIssueCode.custom, path: ["source_app"], message: "app_state roots require source_app" });
18
+ }
19
+ });
20
+ export const localEvidencePolicySchema = z.object({
21
+ version: z.literal(1),
22
+ include_file_names: z.boolean().default(false),
23
+ scan_interval_seconds: z.number().int().min(15).max(3600).default(60),
24
+ max_files_per_root: z.number().int().min(1).max(50_000).default(5_000),
25
+ roots: z.array(evidenceRootSchema).max(50),
26
+ }).strict();
27
+ const DEFAULT_OUTPUT_EXTENSIONS = new Set([
28
+ ".doc", ".docx", ".gdoc", ".md", ".pdf", ".ppt", ".pptx", ".gslides",
29
+ ".xls", ".xlsx", ".gsheet", ".csv", ".tsv", ".txt", ".rtf", ".html",
30
+ ".js", ".jsx", ".ts", ".tsx", ".py", ".go", ".rs", ".java", ".sql",
31
+ ]);
32
+ const IGNORED_DIRECTORIES = new Set([".git", "node_modules", ".next", "dist", "build"]);
33
+ export function localEvidencePolicyPath() {
34
+ return process.env.UNFAIRLY_PACE_EVIDENCE_POLICY ?? path.join(os.homedir(), ".unfairly", "pace", "evidence-policy.json");
35
+ }
36
+ export function localEvidenceStatePath() {
37
+ return process.env.UNFAIRLY_PACE_EVIDENCE_STATE ?? path.join(os.homedir(), ".unfairly", "pace", "evidence-state.json");
38
+ }
39
+ function expandHome(value) {
40
+ if (value === "~")
41
+ return os.homedir();
42
+ if (value.startsWith(`~${path.sep}`))
43
+ return path.join(os.homedir(), value.slice(2));
44
+ return path.resolve(value);
45
+ }
46
+ export async function readLocalEvidencePolicy(policyPath = localEvidencePolicyPath()) {
47
+ const raw = await fs.readFile(policyPath, "utf8").catch((error) => {
48
+ if (error.code === "ENOENT")
49
+ throw new Error(`Unfairly Intelligence local evidence policy not found: ${policyPath}`);
50
+ throw error;
51
+ });
52
+ const policy = localEvidencePolicySchema.parse(JSON.parse(raw));
53
+ const labels = new Set();
54
+ for (const root of policy.roots) {
55
+ if (labels.has(root.label))
56
+ throw new Error(`Unfairly Intelligence evidence root labels must be unique: ${root.label}`);
57
+ const resolved = expandHome(root.path);
58
+ if (resolved === path.parse(resolved).root || resolved === path.resolve(os.homedir())) {
59
+ throw new Error(`Unfairly Intelligence evidence roots must be narrower than a filesystem or home directory: ${root.path}`);
60
+ }
61
+ labels.add(root.label);
62
+ }
63
+ return policy;
64
+ }
65
+ function fingerprint(label, relativePath) {
66
+ return createHash("sha256").update(label).update("\0").update(relativePath).digest("hex");
67
+ }
68
+ function artifactType(extension) {
69
+ if ([".ppt", ".pptx", ".gslides"].includes(extension))
70
+ return "deck";
71
+ if ([".xls", ".xlsx", ".gsheet", ".csv", ".tsv"].includes(extension))
72
+ return "spreadsheet";
73
+ if ([".js", ".jsx", ".ts", ".tsx", ".py", ".go", ".rs", ".java", ".sql"].includes(extension))
74
+ return "code";
75
+ if ([".doc", ".docx", ".gdoc", ".md", ".pdf", ".txt", ".rtf", ".html"].includes(extension))
76
+ return "document";
77
+ return "other";
78
+ }
79
+ function localSession(root, occurredAt) {
80
+ return fingerprint(root.label, occurredAt.toISOString().slice(0, 10)).slice(0, 32);
81
+ }
82
+ function filesChangedBucket(value) {
83
+ if (value <= 1)
84
+ return "one";
85
+ if (value <= 5)
86
+ return "two_to_five";
87
+ if (value <= 20)
88
+ return "six_to_twenty";
89
+ return "over_twenty";
90
+ }
91
+ async function walkRoot(root, maxFiles) {
92
+ const absoluteRoot = expandHome(root.path);
93
+ const allowed = root.extensions?.length
94
+ ? new Set(root.extensions.map((item) => item.startsWith(".") ? item.toLowerCase() : `.${item.toLowerCase()}`))
95
+ : DEFAULT_OUTPUT_EXTENSIONS;
96
+ const facts = [];
97
+ const pending = [absoluteRoot];
98
+ while (pending.length && facts.length < maxFiles) {
99
+ const directory = pending.pop();
100
+ let entries;
101
+ try {
102
+ entries = await fs.readdir(directory, { withFileTypes: true });
103
+ }
104
+ catch {
105
+ continue;
106
+ }
107
+ for (const entry of entries) {
108
+ if (facts.length >= maxFiles)
109
+ break;
110
+ if (entry.name.startsWith(".") || IGNORED_DIRECTORIES.has(entry.name))
111
+ continue;
112
+ const fullPath = path.join(directory, entry.name);
113
+ if (entry.isDirectory()) {
114
+ pending.push(fullPath);
115
+ continue;
116
+ }
117
+ if (!entry.isFile())
118
+ continue;
119
+ const extension = path.extname(entry.name).toLowerCase();
120
+ if (root.kind === "output" && !allowed.has(extension))
121
+ continue;
122
+ const relativePath = path.relative(absoluteRoot, fullPath);
123
+ const stat = await fs.stat(fullPath).catch(() => null);
124
+ if (!stat?.isFile())
125
+ continue;
126
+ facts.push({ fingerprint: fingerprint(root.label, relativePath), relativePath, extension, size: stat.size, mtimeMs: stat.mtimeMs });
127
+ }
128
+ }
129
+ return facts;
130
+ }
131
+ async function readState() {
132
+ try {
133
+ const parsed = JSON.parse(await fs.readFile(localEvidenceStatePath(), "utf8"));
134
+ if (parsed.version === 1 && Array.isArray(parsed.initialized_roots) && parsed.files && typeof parsed.files === "object")
135
+ return parsed;
136
+ }
137
+ catch {
138
+ // A missing or invalid state file is safely rebuilt as a baseline.
139
+ }
140
+ return { version: 1, initialized_roots: [], files: {} };
141
+ }
142
+ async function writeState(state) {
143
+ const statePath = localEvidenceStatePath();
144
+ await fs.mkdir(path.dirname(statePath), { recursive: true, mode: 0o700 });
145
+ await fs.writeFile(statePath, `${JSON.stringify(state, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
146
+ await fs.chmod(statePath, 0o600).catch(() => undefined);
147
+ }
148
+ function outputEvent(input) {
149
+ const sourceApp = input.root.source_app ?? "other";
150
+ const occurredAt = new Date(input.fact.mtimeMs);
151
+ const sessionId = sourceApp !== "other" ? localSession(input.root, occurredAt) : undefined;
152
+ const workflowId = input.installationId && sessionId
153
+ ? deterministicWorkflowId({ installationId: input.installationId, source: sourceApp, sessionId })
154
+ : undefined;
155
+ return PaceEventSchema.parse({
156
+ schema_version: 3,
157
+ collection_policy_version: "metadata-v3",
158
+ event_id: randomUUID(),
159
+ installation_id: input.installationId,
160
+ occurred_at: occurredAt.toISOString(),
161
+ source: "local_filesystem",
162
+ event_type: input.previous ? "artifact.modified" : "artifact.created",
163
+ evidence_level: "exact",
164
+ session_id: sessionId,
165
+ workflow_id: workflowId,
166
+ artifact_type: artifactType(input.fact.extension),
167
+ attributes: {
168
+ client_event: "local_output",
169
+ local_signal: "approved_output",
170
+ },
171
+ });
172
+ }
173
+ function appActivityEvent(input) {
174
+ const latest = Math.max(...input.facts.map((fact) => fact.mtimeMs));
175
+ const occurredAt = new Date(latest);
176
+ const sessionId = localSession(input.root, occurredAt);
177
+ const workflowId = input.installationId
178
+ ? deterministicWorkflowId({ installationId: input.installationId, source: input.root.source_app, sessionId })
179
+ : undefined;
180
+ return PaceEventSchema.parse({
181
+ schema_version: 3,
182
+ collection_policy_version: "metadata-v3",
183
+ event_id: randomUUID(),
184
+ installation_id: input.installationId,
185
+ occurred_at: occurredAt.toISOString(),
186
+ source: input.root.source_app,
187
+ event_type: "desktop.activity",
188
+ evidence_level: "correlated",
189
+ session_id: sessionId,
190
+ workflow_id: workflowId,
191
+ attributes: {
192
+ client_event: "local_activity",
193
+ files_changed_bucket: filesChangedBucket(input.facts.length),
194
+ local_signal: "app_state_change",
195
+ },
196
+ });
197
+ }
198
+ export async function scanLocalEvidence(input = {}) {
199
+ const policy = await readLocalEvidencePolicy(input.policyPath);
200
+ const state = await readState();
201
+ const initialized = new Set(state.initialized_roots);
202
+ const nextFiles = {};
203
+ const events = [];
204
+ const baselineRoots = [];
205
+ for (const root of policy.roots) {
206
+ const facts = await walkRoot(root, policy.max_files_per_root);
207
+ const isBaseline = !initialized.has(root.label);
208
+ if (isBaseline)
209
+ baselineRoots.push(root.label);
210
+ const changed = [];
211
+ for (const fact of facts) {
212
+ const previous = state.files[fact.fingerprint];
213
+ nextFiles[fact.fingerprint] = { size: fact.size, mtime_ms: fact.mtimeMs };
214
+ if (!isBaseline && (!previous || previous.size !== fact.size || previous.mtime_ms !== fact.mtimeMs))
215
+ changed.push({ fact, previous });
216
+ }
217
+ if (root.kind === "output") {
218
+ events.push(...changed.map(({ fact, previous }) => outputEvent({ root, fact, previous, installationId: input.installationId })));
219
+ }
220
+ else if (changed.length) {
221
+ events.push(appActivityEvent({ root, facts: changed.map(({ fact }) => fact), installationId: input.installationId }));
222
+ }
223
+ initialized.add(root.label);
224
+ }
225
+ await writeState({ version: 1, initialized_roots: [...initialized], files: nextFiles });
226
+ return { events, baselineRoots };
227
+ }
228
+ //# sourceMappingURL=local-evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-evidence.js","sourceRoot":"","sources":["../../src/pace/local-evidence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Content-free summaries of local AI coding sessions.
3
+ *
4
+ * Claude Code and Codex already keep a JSONL transcript per session on the
5
+ * developer's machine. This reader walks those files and keeps only metadata:
6
+ * client, model, token counts, timestamps, and counters, plus the working
7
+ * directory, which stays on the device to resolve an approved repository. Prompts, responses, tool arguments, tool output, and file
8
+ * contents are read line by line and discarded; nothing but the fields on
9
+ * `LocalSessionSummary` leaves this module.
10
+ */
11
+ export type LocalClient = "claude_code" | "codex";
12
+ export type TokenCounts = {
13
+ input: number;
14
+ output: number;
15
+ cacheRead: number;
16
+ cacheWrite: number;
17
+ };
18
+ export type LocalSessionSummary = {
19
+ sessionId: string;
20
+ client: LocalClient;
21
+ /** Launched by another agent (a Claude Code subagent, or Codex spawned as a subagent). */
22
+ delegated: boolean;
23
+ /** Codex sessions started from inside Claude Code (e.g. a rescue/review hand-off). */
24
+ launchedBy: "claude_code" | null;
25
+ startedAt: string;
26
+ endedAt: string;
27
+ models: Record<string, number>;
28
+ primaryModel: string | null;
29
+ tokens: TokenCounts;
30
+ userTurns: number;
31
+ toolCalls: number;
32
+ toolErrors: number;
33
+ approvalDenials: number;
34
+ /** Working directory. Device-local only: used to resolve an approved repository and its commits, never uploaded. */
35
+ cwd: string | null;
36
+ /** Git branch. Device-local only: used to find the session's commits after a worktree is gone, never uploaded. */
37
+ branch: string | null;
38
+ /** Skill and playbook names the session invoked. Filtered against an allowlist before upload. */
39
+ skills: string[];
40
+ };
41
+ export declare function readClaudeCodeSession(file: string): Promise<LocalSessionSummary | null>;
42
+ export declare function readCodexSession(file: string): Promise<LocalSessionSummary | null>;
43
+ /** Sessions whose transcript changed at or after `since` (epoch ms). */
44
+ export declare function collectLocalSessions(options: {
45
+ since: number;
46
+ home?: string;
47
+ }): Promise<LocalSessionSummary[]>;
48
+ //# sourceMappingURL=local-sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-sessions.d.ts","sourceRoot":"","sources":["../../src/pace/local-sessions.ts"],"names":[],"mappings":"AAMA;;;;;;;;;GASG;AAEH,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,OAAO,CAAC;AAElD,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,0FAA0F;IAC1F,SAAS,EAAE,OAAO,CAAC;IACnB,sFAAsF;IACtF,UAAU,EAAE,aAAa,GAAG,IAAI,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,oHAAoH;IACpH,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,kHAAkH;IAClH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,iGAAiG;IACjG,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAmCF,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAoF7F;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAuExF;AAwBD,wEAAwE;AACxE,wBAAsB,oBAAoB,CAAC,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAYpH"}
@@ -0,0 +1,254 @@
1
+ import fs from "node:fs/promises";
2
+ import { createReadStream } from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import readline from "node:readline";
6
+ const RUN_SKILL_TOOL = /^mcp__.+__(run_skill|get_playbook)$/;
7
+ const emptyTokens = () => ({ input: 0, output: 0, cacheRead: 0, cacheWrite: 0 });
8
+ function topKey(counts) {
9
+ let best = null;
10
+ for (const [key, value] of Object.entries(counts))
11
+ if (best === null || value > counts[best])
12
+ best = key;
13
+ return best;
14
+ }
15
+ async function* jsonLines(file) {
16
+ const lines = readline.createInterface({ input: createReadStream(file, { encoding: "utf8" }), crlfDelay: Infinity });
17
+ for await (const line of lines) {
18
+ if (!line)
19
+ continue;
20
+ try {
21
+ const parsed = JSON.parse(line);
22
+ if (parsed && typeof parsed === "object")
23
+ yield parsed;
24
+ }
25
+ catch {
26
+ // A partially written trailing line is normal for a live session.
27
+ }
28
+ }
29
+ }
30
+ const DENIAL = /doesn't want to proceed|user denied|permission denied|was rejected|not allowed/i;
31
+ function asRecord(value) {
32
+ return value && typeof value === "object" ? value : {};
33
+ }
34
+ function num(value) {
35
+ return typeof value === "number" && Number.isFinite(value) ? value : 0;
36
+ }
37
+ export async function readClaudeCodeSession(file) {
38
+ const models = {};
39
+ const branches = {};
40
+ const skills = new Set();
41
+ const tokens = emptyTokens();
42
+ const seenMessages = new Set();
43
+ let startedAt = null;
44
+ let endedAt = null;
45
+ let cwd = null;
46
+ let sessionId = path.basename(file, ".jsonl");
47
+ let userTurns = 0;
48
+ let toolCalls = 0;
49
+ let toolErrors = 0;
50
+ let approvalDenials = 0;
51
+ const delegated = file.includes(`${path.sep}subagents${path.sep}`);
52
+ for await (const line of jsonLines(file)) {
53
+ const ts = typeof line.timestamp === "string" ? line.timestamp : null;
54
+ if (ts) {
55
+ startedAt ??= ts;
56
+ endedAt = ts;
57
+ }
58
+ // Subagent transcripts repeat their parent's sessionId; keep the file's own id so the two never collide.
59
+ if (typeof line.sessionId === "string" && !delegated)
60
+ sessionId = line.sessionId;
61
+ if (typeof line.cwd === "string")
62
+ cwd ??= line.cwd;
63
+ if (typeof line.gitBranch === "string" && line.gitBranch && line.gitBranch !== "HEAD")
64
+ branches[line.gitBranch] = (branches[line.gitBranch] ?? 0) + 1;
65
+ const message = asRecord(line.message);
66
+ if (line.type === "user") {
67
+ const content = message.content;
68
+ if (typeof content === "string")
69
+ userTurns += 1;
70
+ else if (Array.isArray(content)) {
71
+ for (const block of content.map(asRecord)) {
72
+ if (block.type === "text")
73
+ userTurns += 1;
74
+ if (block.type === "tool_result" && block.is_error === true) {
75
+ toolErrors += 1;
76
+ // Classified in memory and immediately discarded; only the count survives.
77
+ if (DENIAL.test(JSON.stringify(block.content ?? "").slice(0, 400)))
78
+ approvalDenials += 1;
79
+ }
80
+ }
81
+ }
82
+ }
83
+ if (line.type === "assistant") {
84
+ const model = typeof message.model === "string" ? message.model : null;
85
+ if (!model || model === "<synthetic>")
86
+ continue;
87
+ for (const block of Array.isArray(message.content) ? message.content.map(asRecord) : []) {
88
+ if (block.type !== "tool_use")
89
+ continue;
90
+ toolCalls += 1;
91
+ const input = asRecord(block.input);
92
+ const name = typeof block.name === "string" ? block.name : "";
93
+ const skill = name === "Skill" ? input.skill : RUN_SKILL_TOOL.test(name) ? input.name ?? input.skill ?? input.slug : undefined;
94
+ if (typeof skill === "string" && skill.trim())
95
+ skills.add(skill.trim().toLowerCase().slice(0, 120));
96
+ }
97
+ // Claude Code writes one line per content block and repeats the message's
98
+ // usage on each; count each API message once.
99
+ const messageId = typeof message.id === "string" ? message.id : null;
100
+ if (messageId && seenMessages.has(messageId))
101
+ continue;
102
+ if (messageId)
103
+ seenMessages.add(messageId);
104
+ models[model] = (models[model] ?? 0) + 1;
105
+ const usage = asRecord(message.usage);
106
+ tokens.input += num(usage.input_tokens);
107
+ tokens.output += num(usage.output_tokens);
108
+ tokens.cacheRead += num(usage.cache_read_input_tokens);
109
+ tokens.cacheWrite += num(usage.cache_creation_input_tokens);
110
+ }
111
+ }
112
+ if (!startedAt || !endedAt || !Object.keys(models).length)
113
+ return null;
114
+ return {
115
+ sessionId,
116
+ client: "claude_code",
117
+ delegated,
118
+ launchedBy: null,
119
+ startedAt,
120
+ endedAt,
121
+ models,
122
+ primaryModel: topKey(models),
123
+ tokens,
124
+ userTurns,
125
+ toolCalls,
126
+ toolErrors,
127
+ approvalDenials,
128
+ cwd,
129
+ branch: topKey(branches),
130
+ skills: [...skills],
131
+ };
132
+ }
133
+ export async function readCodexSession(file) {
134
+ const models = {};
135
+ let tokens = emptyTokens();
136
+ let startedAt = null;
137
+ let endedAt = null;
138
+ let cwd = null;
139
+ let branch = null;
140
+ let sessionId = path.basename(file, ".jsonl");
141
+ let delegated = false;
142
+ let launchedBy = null;
143
+ let userTurns = 0;
144
+ let toolCalls = 0;
145
+ let toolErrors = 0;
146
+ const skills = new Set();
147
+ for await (const line of jsonLines(file)) {
148
+ const ts = typeof line.timestamp === "string" ? line.timestamp : null;
149
+ if (ts) {
150
+ startedAt ??= ts;
151
+ endedAt = ts;
152
+ }
153
+ const payload = asRecord(line.payload);
154
+ if (line.type === "response_item" && payload.type === "function_call" && typeof payload.name === "string" && RUN_SKILL_TOOL.test(payload.name)) {
155
+ try {
156
+ const args = asRecord(JSON.parse(String(payload.arguments ?? "{}")));
157
+ const skill = args.name ?? args.skill ?? args.slug;
158
+ if (typeof skill === "string" && skill.trim())
159
+ skills.add(skill.trim().toLowerCase().slice(0, 120));
160
+ }
161
+ catch {
162
+ // Arguments are discarded; only a recognizable skill name is kept.
163
+ }
164
+ }
165
+ if (line.type === "session_meta") {
166
+ if (typeof payload.id === "string")
167
+ sessionId = payload.id;
168
+ if (typeof payload.cwd === "string")
169
+ cwd = payload.cwd;
170
+ const git = asRecord(payload.git);
171
+ if (typeof git.branch === "string" && git.branch && git.branch !== "HEAD")
172
+ branch = git.branch;
173
+ if (payload.originator === "Claude Code")
174
+ launchedBy = "claude_code";
175
+ if (payload.source && typeof payload.source === "object")
176
+ delegated = true;
177
+ }
178
+ if (line.type === "turn_context" && typeof payload.model === "string")
179
+ models[payload.model] = (models[payload.model] ?? 0) + 1;
180
+ if (line.type === "event_msg" && payload.type === "user_message")
181
+ userTurns += 1;
182
+ if (line.type === "event_msg" && payload.type === "token_count") {
183
+ // Codex reports a cumulative total; the last one wins. Input includes the cached share.
184
+ const total = asRecord(asRecord(payload.info).total_token_usage);
185
+ if (Object.keys(total).length) {
186
+ const cached = num(total.cached_input_tokens);
187
+ tokens = { input: Math.max(0, num(total.input_tokens) - cached), output: num(total.output_tokens), cacheRead: cached, cacheWrite: num(total.cache_write_input_tokens) };
188
+ }
189
+ }
190
+ if (line.type === "response_item" && (payload.type === "function_call" || payload.type === "custom_tool_call"))
191
+ toolCalls += 1;
192
+ if (line.type === "event_msg" && payload.type === "exec_command_end" && num(payload.exit_code) !== 0)
193
+ toolErrors += 1;
194
+ }
195
+ if (!startedAt || !endedAt || !Object.keys(models).length)
196
+ return null;
197
+ return {
198
+ sessionId,
199
+ client: "codex",
200
+ delegated: delegated || launchedBy !== null,
201
+ launchedBy,
202
+ startedAt,
203
+ endedAt,
204
+ models,
205
+ primaryModel: topKey(models),
206
+ tokens,
207
+ userTurns,
208
+ toolCalls,
209
+ toolErrors,
210
+ approvalDenials: 0,
211
+ cwd,
212
+ branch,
213
+ skills: [...skills],
214
+ };
215
+ }
216
+ async function listJsonl(root, maxDepth, since) {
217
+ const found = [];
218
+ const walk = async (dir, depth) => {
219
+ let entries;
220
+ try {
221
+ entries = await fs.readdir(dir, { withFileTypes: true });
222
+ }
223
+ catch {
224
+ return;
225
+ }
226
+ for (const entry of entries) {
227
+ const full = path.join(dir, entry.name);
228
+ if (entry.isDirectory() && depth < maxDepth)
229
+ await walk(full, depth + 1);
230
+ else if (entry.isFile() && entry.name.endsWith(".jsonl")) {
231
+ const stat = await fs.stat(full).catch(() => null);
232
+ if (stat && stat.mtimeMs >= since)
233
+ found.push(full);
234
+ }
235
+ }
236
+ };
237
+ await walk(root, 0);
238
+ return found;
239
+ }
240
+ /** Sessions whose transcript changed at or after `since` (epoch ms). */
241
+ export async function collectLocalSessions(options) {
242
+ const home = options.home ?? os.homedir();
243
+ const since = options.since;
244
+ const [claudeFiles, codexFiles] = await Promise.all([
245
+ listJsonl(path.join(home, ".claude", "projects"), 4, since),
246
+ listJsonl(path.join(home, ".codex", "sessions"), 4, since),
247
+ ]);
248
+ const results = await Promise.all([
249
+ ...claudeFiles.map((file) => readClaudeCodeSession(file).catch(() => null)),
250
+ ...codexFiles.map((file) => readCodexSession(file).catch(() => null)),
251
+ ]);
252
+ return results.filter((item) => item !== null);
253
+ }
254
+ //# sourceMappingURL=local-sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-sessions.js","sourceRoot":"","sources":["../../src/pace/local-sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ type ManagedConfigOptions = {
2
+ command: string;
3
+ managedDir: string;
4
+ };
5
+ export declare function renderEvidencePolicy(input: {
6
+ evidenceRoots?: string[];
7
+ includeFileNames?: boolean;
8
+ }): Record<string, unknown>;
9
+ export declare function renderCodexRequirements(options: ManagedConfigOptions): string;
10
+ export declare function renderClaudeSettings(command: string): Record<string, unknown>;
11
+ export declare function renderGeminiSettings(command: string): Record<string, unknown>;
12
+ export declare function renderCursorSettings(command: string): Record<string, unknown>;
13
+ export declare function writeManagedConfigs(input: {
14
+ outputDir: string;
15
+ command: string;
16
+ managedDir: string;
17
+ evidenceRoots?: string[];
18
+ includeFileNames?: boolean;
19
+ }): Promise<string[]>;
20
+ export {};
21
+ //# sourceMappingURL=managed-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managed-config.d.ts","sourceRoot":"","sources":["../../src/pace/managed-config.ts"],"names":[],"mappings":"AAGA,KAAK,oBAAoB,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAY7H;AAwBD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CA2B7E;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAO7E;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQ7E;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkB7E;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAcpB"}