panopticon-cli 0.5.0 → 0.5.1

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 (55) hide show
  1. package/dist/{agents-E43Y3HNU.js → agents-5OPQKM5K.js} +4 -3
  2. package/dist/{chunk-OMNXYPXC.js → chunk-2V4NF7J2.js} +14 -1
  3. package/dist/chunk-2V4NF7J2.js.map +1 -0
  4. package/dist/{chunk-WQG2TYCB.js → chunk-4YSYJ4HM.js} +2 -2
  5. package/dist/{chunk-NTO3EDB3.js → chunk-76F6DSVS.js} +47 -8
  6. package/dist/chunk-76F6DSVS.js.map +1 -0
  7. package/dist/{chunk-GR6ZZMCX.js → chunk-F5555J3A.js} +18 -1
  8. package/dist/chunk-F5555J3A.js.map +1 -0
  9. package/dist/{chunk-PPRFKTVC.js → chunk-NLQRED36.js} +2 -2
  10. package/dist/{chunk-AAFQANKW.js → chunk-OWHXCGVO.js} +29 -29
  11. package/dist/chunk-OWHXCGVO.js.map +1 -0
  12. package/dist/{chunk-HZT2AOPN.js → chunk-VHKSS7QX.js} +28 -5
  13. package/dist/chunk-VHKSS7QX.js.map +1 -0
  14. package/dist/{chunk-GFP3PIPB.js → chunk-YGJ54GW2.js} +1 -1
  15. package/dist/chunk-YGJ54GW2.js.map +1 -0
  16. package/dist/cli/index.js +401 -318
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/dashboard/public/assets/{index-DQHkwvvJ.js → index-Ce6q21Fm.js} +135 -135
  19. package/dist/dashboard/public/assets/{index-BxpjweAL.css → index-NzpI0ItZ.css} +1 -1
  20. package/dist/dashboard/public/index.html +2 -2
  21. package/dist/dashboard/server.js +1420 -1007
  22. package/dist/{feedback-writer-LVZ5TFYZ.js → feedback-writer-VRMMWWTW.js} +2 -2
  23. package/dist/git-utils-I2UDKNZH.js +131 -0
  24. package/dist/git-utils-I2UDKNZH.js.map +1 -0
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.js +2 -2
  27. package/dist/{projects-JEIVIYC6.js → projects-CFX3RTDL.js} +4 -2
  28. package/dist/{remote-workspace-AHVHQEES.js → remote-workspace-7FPGF2RM.js} +2 -2
  29. package/dist/{review-status-EPFG4XM7.js → review-status-TDPSOU5J.js} +2 -2
  30. package/dist/{specialist-context-ZC6A4M3I.js → specialist-context-WGUUYDWY.js} +3 -3
  31. package/dist/{specialist-logs-KLGJCEUL.js → specialist-logs-XJB5TCKJ.js} +3 -3
  32. package/dist/{specialists-O4HWDJL5.js → specialists-5LBRHYFA.js} +3 -3
  33. package/dist/{traefik-QN7R5I6V.js → traefik-WFMQX2LY.js} +3 -3
  34. package/dist/{workspace-manager-IE4JL2JP.js → workspace-manager-E434Z45T.js} +2 -2
  35. package/package.json +1 -1
  36. package/scripts/record-cost-event.js +5 -5
  37. package/skills/pan-new-project/SKILL.md +304 -0
  38. package/dist/chunk-AAFQANKW.js.map +0 -1
  39. package/dist/chunk-GFP3PIPB.js.map +0 -1
  40. package/dist/chunk-GR6ZZMCX.js.map +0 -1
  41. package/dist/chunk-HZT2AOPN.js.map +0 -1
  42. package/dist/chunk-NTO3EDB3.js.map +0 -1
  43. package/dist/chunk-OMNXYPXC.js.map +0 -1
  44. /package/dist/{agents-E43Y3HNU.js.map → agents-5OPQKM5K.js.map} +0 -0
  45. /package/dist/{chunk-WQG2TYCB.js.map → chunk-4YSYJ4HM.js.map} +0 -0
  46. /package/dist/{chunk-PPRFKTVC.js.map → chunk-NLQRED36.js.map} +0 -0
  47. /package/dist/{feedback-writer-LVZ5TFYZ.js.map → feedback-writer-VRMMWWTW.js.map} +0 -0
  48. /package/dist/{projects-JEIVIYC6.js.map → projects-CFX3RTDL.js.map} +0 -0
  49. /package/dist/{remote-workspace-AHVHQEES.js.map → remote-workspace-7FPGF2RM.js.map} +0 -0
  50. /package/dist/{review-status-EPFG4XM7.js.map → review-status-TDPSOU5J.js.map} +0 -0
  51. /package/dist/{specialist-context-ZC6A4M3I.js.map → specialist-context-WGUUYDWY.js.map} +0 -0
  52. /package/dist/{specialist-logs-KLGJCEUL.js.map → specialist-logs-XJB5TCKJ.js.map} +0 -0
  53. /package/dist/{specialists-O4HWDJL5.js.map → specialists-5LBRHYFA.js.map} +0 -0
  54. /package/dist/{traefik-QN7R5I6V.js.map → traefik-WFMQX2LY.js.map} +0 -0
  55. /package/dist/{workspace-manager-IE4JL2JP.js.map → workspace-manager-E434Z45T.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  init_projects,
3
3
  resolveProjectFromIssue
4
- } from "./chunk-OMNXYPXC.js";
4
+ } from "./chunk-2V4NF7J2.js";
5
5
  import "./chunk-ZTFNYOC7.js";
6
6
  import {
7
7
  __esm,
@@ -112,4 +112,4 @@ init_feedback_writer();
112
112
  export {
113
113
  writeFeedbackFile
114
114
  };
115
- //# sourceMappingURL=feedback-writer-LVZ5TFYZ.js.map
115
+ //# sourceMappingURL=feedback-writer-VRMMWWTW.js.map
@@ -0,0 +1,131 @@
1
+ import {
2
+ init_esm_shims
3
+ } from "./chunk-ZHC57RCV.js";
4
+
5
+ // src/lib/git-utils.ts
6
+ init_esm_shims();
7
+ import { existsSync, unlinkSync, readdirSync } from "fs";
8
+ import { join } from "path";
9
+ import { exec } from "child_process";
10
+ import { promisify } from "util";
11
+ var execAsync = promisify(exec);
12
+ async function hasRunningGitProcesses(repoPath) {
13
+ try {
14
+ try {
15
+ const gitDir = join(repoPath, ".git");
16
+ const { stdout } = await execAsync(`fuser "${gitDir}" 2>/dev/null`, {
17
+ encoding: "utf-8"
18
+ });
19
+ return stdout.trim().length > 0;
20
+ } catch {
21
+ try {
22
+ const { stdout } = await execAsync(
23
+ `ps aux | grep -E "git.*${repoPath.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}" | grep -v grep`,
24
+ { encoding: "utf-8" }
25
+ );
26
+ return stdout.trim().length > 0;
27
+ } catch {
28
+ return false;
29
+ }
30
+ }
31
+ } catch {
32
+ return false;
33
+ }
34
+ }
35
+ function findGitLockFiles(repoPath) {
36
+ const lockFiles = [];
37
+ const indexLock = join(repoPath, ".git", "index.lock");
38
+ if (existsSync(indexLock)) {
39
+ lockFiles.push(indexLock);
40
+ }
41
+ const refsDir = join(repoPath, ".git", "refs");
42
+ if (existsSync(refsDir)) {
43
+ const findLocksRecursive = (dir) => {
44
+ const entries = readdirSync(dir, { withFileTypes: true });
45
+ for (const entry of entries) {
46
+ const fullPath = join(dir, entry.name);
47
+ if (entry.isDirectory()) {
48
+ findLocksRecursive(fullPath);
49
+ } else if (entry.name.endsWith(".lock")) {
50
+ lockFiles.push(fullPath);
51
+ }
52
+ }
53
+ };
54
+ try {
55
+ findLocksRecursive(refsDir);
56
+ } catch {
57
+ }
58
+ }
59
+ return lockFiles;
60
+ }
61
+ async function cleanupStaleLocks(repoPath) {
62
+ const result = {
63
+ found: [],
64
+ removed: [],
65
+ errors: []
66
+ };
67
+ const lockFiles = findGitLockFiles(repoPath);
68
+ result.found = lockFiles;
69
+ if (lockFiles.length === 0) {
70
+ return result;
71
+ }
72
+ const hasGitProcesses = await hasRunningGitProcesses(repoPath);
73
+ if (hasGitProcesses) {
74
+ result.errors.push({
75
+ file: "N/A",
76
+ error: "Git processes are running - not safe to remove locks"
77
+ });
78
+ return result;
79
+ }
80
+ for (const lockFile of lockFiles) {
81
+ try {
82
+ unlinkSync(lockFile);
83
+ result.removed.push(lockFile);
84
+ } catch (error) {
85
+ const msg = error instanceof Error ? error.message : String(error);
86
+ result.errors.push({ file: lockFile, error: msg });
87
+ }
88
+ }
89
+ return result;
90
+ }
91
+ async function getWorkspaceCommitHashes(workspacePath) {
92
+ const result = {};
93
+ const hasTopLevelGit = existsSync(join(workspacePath, ".git"));
94
+ if (hasTopLevelGit) {
95
+ try {
96
+ const { stdout } = await execAsync("git rev-parse HEAD", { cwd: workspacePath, encoding: "utf-8" });
97
+ result["."] = stdout.trim();
98
+ } catch {
99
+ }
100
+ } else {
101
+ try {
102
+ const entries = readdirSync(workspacePath, { withFileTypes: true });
103
+ for (const entry of entries) {
104
+ if (!entry.isDirectory() || entry.name.startsWith(".")) continue;
105
+ const subPath = join(workspacePath, entry.name);
106
+ if (!existsSync(join(subPath, ".git"))) continue;
107
+ try {
108
+ const { stdout } = await execAsync("git rev-parse HEAD", { cwd: subPath, encoding: "utf-8" });
109
+ result[entry.name] = stdout.trim();
110
+ } catch {
111
+ }
112
+ }
113
+ } catch {
114
+ }
115
+ }
116
+ return result;
117
+ }
118
+ async function hasStaleLocks(repoPath) {
119
+ const lockFiles = findGitLockFiles(repoPath);
120
+ if (lockFiles.length === 0) {
121
+ return false;
122
+ }
123
+ const hasGitProcesses = await hasRunningGitProcesses(repoPath);
124
+ return !hasGitProcesses;
125
+ }
126
+ export {
127
+ cleanupStaleLocks,
128
+ getWorkspaceCommitHashes,
129
+ hasStaleLocks
130
+ };
131
+ //# sourceMappingURL=git-utils-I2UDKNZH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/git-utils.ts"],"sourcesContent":["/**\n * Git utilities for handling common git operations and recovery\n */\n\nimport { existsSync, unlinkSync, readdirSync } from 'fs';\nimport { join } from 'path';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\n\nconst execAsync = promisify(exec);\n\n/**\n * Check if any git processes are currently running in a specific repository\n *\n * This checks if there are git processes with the repository path in their command line.\n * If we can't determine repository-specific processes, we conservatively return false\n * (no processes detected) to allow cleanup to proceed.\n */\nasync function hasRunningGitProcesses(repoPath: string): Promise<boolean> {\n try {\n // Try to find git processes that reference this specific repository\n // Use fuser to check if any process has the .git directory open (more reliable)\n try {\n const gitDir = join(repoPath, '.git');\n const { stdout } = await execAsync(`fuser \"${gitDir}\" 2>/dev/null`, {\n encoding: 'utf-8',\n });\n // fuser returns PIDs if any process has the directory open\n return stdout.trim().length > 0;\n } catch {\n // fuser not available or no processes found\n // Fall back to checking ps for git processes in this directory\n try {\n const { stdout } = await execAsync(\n `ps aux | grep -E \"git.*${repoPath.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\" | grep -v grep`,\n { encoding: 'utf-8' }\n );\n return stdout.trim().length > 0;\n } catch {\n // No git processes found for this repo\n return false;\n }\n }\n } catch {\n // Error checking - conservatively assume no processes\n return false;\n }\n}\n\n/**\n * Find all git lock files in a repository\n */\nfunction findGitLockFiles(repoPath: string): string[] {\n const lockFiles: string[] = [];\n\n // Check for index.lock in .git directory\n const indexLock = join(repoPath, '.git', 'index.lock');\n if (existsSync(indexLock)) {\n lockFiles.push(indexLock);\n }\n\n // Check for ref locks in .git/refs\n const refsDir = join(repoPath, '.git', 'refs');\n if (existsSync(refsDir)) {\n const findLocksRecursive = (dir: string) => {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n findLocksRecursive(fullPath);\n } else if (entry.name.endsWith('.lock')) {\n lockFiles.push(fullPath);\n }\n }\n };\n try {\n findLocksRecursive(refsDir);\n } catch {\n // Ignore errors reading refs directory\n }\n }\n\n return lockFiles;\n}\n\n/**\n * Check for and clean up stale git lock files\n *\n * A lock file is considered stale if:\n * 1. It exists\n * 2. No git processes are currently running\n *\n * @param repoPath - Path to the git repository\n * @returns Object with cleanup results\n */\nexport async function cleanupStaleLocks(repoPath: string): Promise<{\n found: string[];\n removed: string[];\n errors: Array<{ file: string; error: string }>;\n}> {\n const result = {\n found: [] as string[],\n removed: [] as string[],\n errors: [] as Array<{ file: string; error: string }>,\n };\n\n // Find all lock files\n const lockFiles = findGitLockFiles(repoPath);\n result.found = lockFiles;\n\n if (lockFiles.length === 0) {\n return result;\n }\n\n // Check if git processes are running for this repository\n const hasGitProcesses = await hasRunningGitProcesses(repoPath);\n\n if (hasGitProcesses) {\n // Don't remove locks if git is actively running\n result.errors.push({\n file: 'N/A',\n error: 'Git processes are running - not safe to remove locks',\n });\n return result;\n }\n\n // Remove stale lock files\n for (const lockFile of lockFiles) {\n try {\n unlinkSync(lockFile);\n result.removed.push(lockFile);\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n result.errors.push({ file: lockFile, error: msg });\n }\n }\n\n return result;\n}\n\n/**\n * Get the HEAD commit SHA for each git repository in a workspace.\n *\n * Handles both monorepo (single .git at top level) and polyrepo (subdirs with .git).\n * Returns a map of repo identifier → HEAD SHA:\n * - Monorepo: { '.': 'abc123...' }\n * - Polyrepo: { 'frontend': 'abc123...', 'api': 'def456...' }\n */\nexport async function getWorkspaceCommitHashes(workspacePath: string): Promise<Record<string, string>> {\n const result: Record<string, string> = {};\n\n const hasTopLevelGit = existsSync(join(workspacePath, '.git'));\n\n if (hasTopLevelGit) {\n try {\n const { stdout } = await execAsync('git rev-parse HEAD', { cwd: workspacePath, encoding: 'utf-8' });\n result['.'] = stdout.trim();\n } catch { /* skip */ }\n } else {\n try {\n const entries = readdirSync(workspacePath, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) continue;\n const subPath = join(workspacePath, entry.name);\n if (!existsSync(join(subPath, '.git'))) continue;\n try {\n const { stdout } = await execAsync('git rev-parse HEAD', { cwd: subPath, encoding: 'utf-8' });\n result[entry.name] = stdout.trim();\n } catch { /* skip this sub-repo */ }\n }\n } catch { /* skip */ }\n }\n\n return result;\n}\n\n/**\n * Check if a repository has stale lock files\n *\n * @param repoPath - Path to the git repository\n * @returns True if stale locks exist\n */\nexport async function hasStaleLocks(repoPath: string): Promise<boolean> {\n const lockFiles = findGitLockFiles(repoPath);\n if (lockFiles.length === 0) {\n return false;\n }\n\n const hasGitProcesses = await hasRunningGitProcesses(repoPath);\n return !hasGitProcesses;\n}\n"],"mappings":"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","names":[]}
package/dist/index.d.ts CHANGED
@@ -523,6 +523,8 @@ declare class GitHubTracker implements IssueTracker {
523
523
  getComments(issueId: string): Promise<Comment[]>;
524
524
  addComment(issueId: string, body: string): Promise<Comment>;
525
525
  transitionIssue(id: string, state: IssueState): Promise<void>;
526
+ /** Ensure a label exists in the repo, creating it if needed. */
527
+ private ensureLabelExists;
526
528
  linkPR(issueId: string, prUrl: string): Promise<void>;
527
529
  private normalizeIssue;
528
530
  private mapStateFromGitHub;
package/dist/index.js CHANGED
@@ -21,7 +21,7 @@ import {
21
21
  restoreBackup,
22
22
  syncHooks,
23
23
  syncStatusline
24
- } from "./chunk-WQG2TYCB.js";
24
+ } from "./chunk-4YSYJ4HM.js";
25
25
  import "./chunk-AQXETQHW.js";
26
26
  import {
27
27
  GitHubTracker,
@@ -32,7 +32,7 @@ import {
32
32
  getAllTrackers,
33
33
  getPrimaryTracker,
34
34
  getSecondaryTracker
35
- } from "./chunk-NTO3EDB3.js";
35
+ } from "./chunk-76F6DSVS.js";
36
36
  import {
37
37
  PROVIDERS,
38
38
  clearCredentialFileAuth,
@@ -2,6 +2,7 @@ import {
2
2
  PROJECTS_CONFIG_FILE,
3
3
  createDefaultProjectsConfig,
4
4
  extractTeamPrefix,
5
+ findProjectByPath,
5
6
  findProjectByTeam,
6
7
  findProjectsByRallyProject,
7
8
  getProject,
@@ -18,7 +19,7 @@ import {
18
19
  resolveProjectPath,
19
20
  saveProjectsConfig,
20
21
  unregisterProject
21
- } from "./chunk-OMNXYPXC.js";
22
+ } from "./chunk-2V4NF7J2.js";
22
23
  import "./chunk-ZTFNYOC7.js";
23
24
  import "./chunk-ZHC57RCV.js";
24
25
  init_projects();
@@ -26,6 +27,7 @@ export {
26
27
  PROJECTS_CONFIG_FILE,
27
28
  createDefaultProjectsConfig,
28
29
  extractTeamPrefix,
30
+ findProjectByPath,
29
31
  findProjectByTeam,
30
32
  findProjectsByRallyProject,
31
33
  getProject,
@@ -42,4 +44,4 @@ export {
42
44
  saveProjectsConfig,
43
45
  unregisterProject
44
46
  };
45
- //# sourceMappingURL=projects-JEIVIYC6.js.map
47
+ //# sourceMappingURL=projects-CFX3RTDL.js.map
@@ -13,7 +13,7 @@ import {
13
13
  extractTeamPrefix,
14
14
  findProjectByTeam,
15
15
  init_projects
16
- } from "./chunk-OMNXYPXC.js";
16
+ } from "./chunk-2V4NF7J2.js";
17
17
  import "./chunk-ZTFNYOC7.js";
18
18
  import {
19
19
  init_esm_shims
@@ -178,4 +178,4 @@ EOF`);
178
178
  export {
179
179
  createRemoteWorkspace
180
180
  };
181
- //# sourceMappingURL=remote-workspace-AHVHQEES.js.map
181
+ //# sourceMappingURL=remote-workspace-7FPGF2RM.js.map
@@ -5,7 +5,7 @@ import {
5
5
  loadReviewStatuses,
6
6
  saveReviewStatuses,
7
7
  setReviewStatus
8
- } from "./chunk-GFP3PIPB.js";
8
+ } from "./chunk-YGJ54GW2.js";
9
9
  import "./chunk-JQBV3Q2W.js";
10
10
  import "./chunk-ZHC57RCV.js";
11
11
  init_review_status();
@@ -16,4 +16,4 @@ export {
16
16
  saveReviewStatuses,
17
17
  setReviewStatus
18
18
  };
19
- //# sourceMappingURL=review-status-EPFG4XM7.js.map
19
+ //# sourceMappingURL=review-status-TDPSOU5J.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getRecentRunLogs,
3
3
  init_specialist_logs
4
- } from "./chunk-AAFQANKW.js";
4
+ } from "./chunk-OWHXCGVO.js";
5
5
  import {
6
6
  getModelId,
7
7
  init_work_type_router
@@ -11,7 +11,7 @@ import "./chunk-HJSM6E6U.js";
11
11
  import {
12
12
  getProject,
13
13
  init_projects
14
- } from "./chunk-OMNXYPXC.js";
14
+ } from "./chunk-2V4NF7J2.js";
15
15
  import {
16
16
  getPanopticonHome,
17
17
  init_paths
@@ -254,4 +254,4 @@ export {
254
254
  regenerateContextDigest,
255
255
  scheduleDigestGeneration
256
256
  };
257
- //# sourceMappingURL=specialist-context-ZC6A4M3I.js.map
257
+ //# sourceMappingURL=specialist-context-WGUUYDWY.js.map
@@ -16,11 +16,11 @@ import {
16
16
  isRunLogActive,
17
17
  listRunLogs,
18
18
  parseLogMetadata
19
- } from "./chunk-AAFQANKW.js";
19
+ } from "./chunk-OWHXCGVO.js";
20
20
  import "./chunk-FTCPTHIJ.js";
21
21
  import "./chunk-JQBV3Q2W.js";
22
22
  import "./chunk-HJSM6E6U.js";
23
- import "./chunk-OMNXYPXC.js";
23
+ import "./chunk-2V4NF7J2.js";
24
24
  import "./chunk-ZTFNYOC7.js";
25
25
  import "./chunk-ZHC57RCV.js";
26
26
  init_specialist_logs();
@@ -42,4 +42,4 @@ export {
42
42
  listRunLogs,
43
43
  parseLogMetadata
44
44
  };
45
- //# sourceMappingURL=specialist-logs-KLGJCEUL.js.map
45
+ //# sourceMappingURL=specialist-logs-XJB5TCKJ.js.map
@@ -55,11 +55,11 @@ import {
55
55
  wakeSpecialist,
56
56
  wakeSpecialistOrQueue,
57
57
  wakeSpecialistWithTask
58
- } from "./chunk-AAFQANKW.js";
58
+ } from "./chunk-OWHXCGVO.js";
59
59
  import "./chunk-FTCPTHIJ.js";
60
60
  import "./chunk-JQBV3Q2W.js";
61
61
  import "./chunk-HJSM6E6U.js";
62
- import "./chunk-OMNXYPXC.js";
62
+ import "./chunk-2V4NF7J2.js";
63
63
  import "./chunk-ZTFNYOC7.js";
64
64
  import "./chunk-ZHC57RCV.js";
65
65
  init_specialists();
@@ -120,4 +120,4 @@ export {
120
120
  wakeSpecialistOrQueue,
121
121
  wakeSpecialistWithTask
122
122
  };
123
- //# sourceMappingURL=specialists-O4HWDJL5.js.map
123
+ //# sourceMappingURL=specialists-5LBRHYFA.js.map
@@ -4,9 +4,9 @@ import {
4
4
  ensureProjectCerts,
5
5
  generatePanopticonTraefikConfig,
6
6
  generateTlsConfig
7
- } from "./chunk-PPRFKTVC.js";
7
+ } from "./chunk-NLQRED36.js";
8
8
  import "./chunk-FQ66DECN.js";
9
- import "./chunk-OMNXYPXC.js";
9
+ import "./chunk-2V4NF7J2.js";
10
10
  import "./chunk-ZTFNYOC7.js";
11
11
  import "./chunk-ZHC57RCV.js";
12
12
  export {
@@ -16,4 +16,4 @@ export {
16
16
  generatePanopticonTraefikConfig,
17
17
  generateTlsConfig
18
18
  };
19
- //# sourceMappingURL=traefik-QN7R5I6V.js.map
19
+ //# sourceMappingURL=traefik-WFMQX2LY.js.map
@@ -4,7 +4,7 @@ import {
4
4
  preTrustDirectory,
5
5
  removeWorkspace,
6
6
  stopWorkspaceDocker
7
- } from "./chunk-GR6ZZMCX.js";
7
+ } from "./chunk-F5555J3A.js";
8
8
  import "./chunk-7SN4L4PH.js";
9
9
  import "./chunk-AQXETQHW.js";
10
10
  import "./chunk-ZTFNYOC7.js";
@@ -19,4 +19,4 @@ export {
19
19
  removeWorkspace,
20
20
  stopWorkspaceDocker
21
21
  };
22
- //# sourceMappingURL=workspace-manager-IE4JL2JP.js.map
22
+ //# sourceMappingURL=workspace-manager-E434Z45T.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "panopticon-cli",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "Multi-agent orchestration for AI coding assistants (Claude Code, Codex, Cursor, Gemini CLI)",
5
5
  "keywords": [
6
6
  "ai-agents",
@@ -69,10 +69,10 @@ var PRD_PUBLISHED_DIR = join(PRDS_DIR, "published");
69
69
 
70
70
  // src/lib/cost.ts
71
71
  var DEFAULT_PRICING = [
72
- // Anthropic - 4.6 series
73
- { provider: "anthropic", model: "claude-opus-4.6", inputPer1k: 5e-3, outputPer1k: 0.025, cacheReadPer1k: 5e-4, cacheWrite5mPer1k: 625e-5, cacheWrite1hPer1k: 0.01, currency: "USD" },
74
- { provider: "anthropic", model: "claude-sonnet-4.5", inputPer1k: 3e-3, outputPer1k: 0.015, cacheReadPer1k: 3e-4, cacheWrite5mPer1k: 375e-5, cacheWrite1hPer1k: 6e-3, currency: "USD" },
75
- { provider: "anthropic", model: "claude-haiku-4.5", inputPer1k: 1e-3, outputPer1k: 5e-3, cacheReadPer1k: 1e-4, cacheWrite5mPer1k: 125e-5, cacheWrite1hPer1k: 2e-3, currency: "USD" },
72
+ // Anthropic - 4.6 series (API IDs use dashes: claude-opus-4-6, claude-sonnet-4-6, claude-haiku-4-5)
73
+ { provider: "anthropic", model: "claude-opus-4-6", inputPer1k: 5e-3, outputPer1k: 0.025, cacheReadPer1k: 5e-4, cacheWrite5mPer1k: 625e-5, cacheWrite1hPer1k: 0.01, currency: "USD" },
74
+ { provider: "anthropic", model: "claude-sonnet-4-6", inputPer1k: 3e-3, outputPer1k: 0.015, cacheReadPer1k: 3e-4, cacheWrite5mPer1k: 375e-5, cacheWrite1hPer1k: 6e-3, currency: "USD" },
75
+ { provider: "anthropic", model: "claude-haiku-4-5", inputPer1k: 1e-3, outputPer1k: 5e-3, cacheReadPer1k: 1e-4, cacheWrite5mPer1k: 125e-5, cacheWrite1hPer1k: 2e-3, currency: "USD" },
76
76
  // Anthropic - 4.x series
77
77
  { provider: "anthropic", model: "claude-opus-4-1", inputPer1k: 0.015, outputPer1k: 0.075, cacheReadPer1k: 15e-4, cacheWrite5mPer1k: 0.01875, cacheWrite1hPer1k: 0.03, currency: "USD" },
78
78
  { provider: "anthropic", model: "claude-opus-4", inputPer1k: 0.015, outputPer1k: 0.075, cacheReadPer1k: 15e-4, cacheWrite5mPer1k: 0.01875, cacheWrite1hPer1k: 0.03, currency: "USD" },
@@ -95,7 +95,7 @@ function calculateCost(usage, pricing) {
95
95
  let inputMultiplier = 1;
96
96
  let outputMultiplier = 1;
97
97
  const totalInputTokens = usage.inputTokens + (usage.cacheReadTokens || 0) + (usage.cacheWriteTokens || 0);
98
- if ((pricing.model === "claude-sonnet-4" || pricing.model === "claude-sonnet-4.5") && totalInputTokens > 2e5) {
98
+ if ((pricing.model === "claude-sonnet-4" || pricing.model === "claude-sonnet-4-6") && totalInputTokens > 2e5) {
99
99
  inputMultiplier = 2;
100
100
  outputMultiplier = 1.5;
101
101
  }