@straiffi/archon 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 (124) hide show
  1. package/README.md +224 -0
  2. package/dist/cli.js +216 -0
  3. package/dist/client/assets/index-8_-boBBA.css +2 -0
  4. package/dist/client/assets/index-s_jjeqha.js +176 -0
  5. package/dist/client/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  6. package/dist/client/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  7. package/dist/client/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  8. package/dist/client/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  9. package/dist/client/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  10. package/dist/client/favicon.svg +62 -0
  11. package/dist/client/icons.svg +24 -0
  12. package/dist/client/index.html +14 -0
  13. package/dist/server/db.js +764 -0
  14. package/dist/server/db.js.map +1 -0
  15. package/dist/server/index.js +5134 -0
  16. package/dist/server/index.js.map +1 -0
  17. package/dist/server/lib/agent.js +1302 -0
  18. package/dist/server/lib/agent.js.map +1 -0
  19. package/dist/server/lib/buildChains.js +2 -0
  20. package/dist/server/lib/buildChains.js.map +1 -0
  21. package/dist/server/lib/buildFlow.js +59 -0
  22. package/dist/server/lib/buildFlow.js.map +1 -0
  23. package/dist/server/lib/buildSequences.js +599 -0
  24. package/dist/server/lib/buildSequences.js.map +1 -0
  25. package/dist/server/lib/bundleActivity.js +95 -0
  26. package/dist/server/lib/bundleActivity.js.map +1 -0
  27. package/dist/server/lib/bundlePullRequests.js +126 -0
  28. package/dist/server/lib/bundlePullRequests.js.map +1 -0
  29. package/dist/server/lib/chatMessages.js +60 -0
  30. package/dist/server/lib/chatMessages.js.map +1 -0
  31. package/dist/server/lib/chatTargets.js +123 -0
  32. package/dist/server/lib/chatTargets.js.map +1 -0
  33. package/dist/server/lib/chatTicketProposals.js +180 -0
  34. package/dist/server/lib/chatTicketProposals.js.map +1 -0
  35. package/dist/server/lib/chats.js +279 -0
  36. package/dist/server/lib/chats.js.map +1 -0
  37. package/dist/server/lib/config.js +3 -0
  38. package/dist/server/lib/config.js.map +1 -0
  39. package/dist/server/lib/cors.js +30 -0
  40. package/dist/server/lib/cors.js.map +1 -0
  41. package/dist/server/lib/directoryPicker.js +174 -0
  42. package/dist/server/lib/directoryPicker.js.map +1 -0
  43. package/dist/server/lib/git.js +1284 -0
  44. package/dist/server/lib/git.js.map +1 -0
  45. package/dist/server/lib/integrations/github.js +511 -0
  46. package/dist/server/lib/integrations/github.js.map +1 -0
  47. package/dist/server/lib/integrations/index.js +162 -0
  48. package/dist/server/lib/integrations/index.js.map +1 -0
  49. package/dist/server/lib/integrations/jira.js +283 -0
  50. package/dist/server/lib/integrations/jira.js.map +1 -0
  51. package/dist/server/lib/integrations/planning.js +27 -0
  52. package/dist/server/lib/integrations/planning.js.map +1 -0
  53. package/dist/server/lib/integrations/types.js +2 -0
  54. package/dist/server/lib/integrations/types.js.map +1 -0
  55. package/dist/server/lib/lightweightPrompt.js +88 -0
  56. package/dist/server/lib/lightweightPrompt.js.map +1 -0
  57. package/dist/server/lib/models.js +219 -0
  58. package/dist/server/lib/models.js.map +1 -0
  59. package/dist/server/lib/preview.js +377 -0
  60. package/dist/server/lib/preview.js.map +1 -0
  61. package/dist/server/lib/previewProxy.js +659 -0
  62. package/dist/server/lib/previewProxy.js.map +1 -0
  63. package/dist/server/lib/projectAutoConfig.js +682 -0
  64. package/dist/server/lib/projectAutoConfig.js.map +1 -0
  65. package/dist/server/lib/projectFileSuggestions.js +133 -0
  66. package/dist/server/lib/projectFileSuggestions.js.map +1 -0
  67. package/dist/server/lib/projectMemory.js +1519 -0
  68. package/dist/server/lib/projectMemory.js.map +1 -0
  69. package/dist/server/lib/projectMemoryPrompt.js +390 -0
  70. package/dist/server/lib/projectMemoryPrompt.js.map +1 -0
  71. package/dist/server/lib/projectMemoryScan.js +681 -0
  72. package/dist/server/lib/projectMemoryScan.js.map +1 -0
  73. package/dist/server/lib/projectMemorySuggestions.js +166 -0
  74. package/dist/server/lib/projectMemorySuggestions.js.map +1 -0
  75. package/dist/server/lib/projectMemoryTransfer.js +958 -0
  76. package/dist/server/lib/projectMemoryTransfer.js.map +1 -0
  77. package/dist/server/lib/projects.js +569 -0
  78. package/dist/server/lib/projects.js.map +1 -0
  79. package/dist/server/lib/promptSkills.js +28 -0
  80. package/dist/server/lib/promptSkills.js.map +1 -0
  81. package/dist/server/lib/queue.js +15 -0
  82. package/dist/server/lib/queue.js.map +1 -0
  83. package/dist/server/lib/reviewFindings.js +390 -0
  84. package/dist/server/lib/reviewFindings.js.map +1 -0
  85. package/dist/server/lib/run.js +416 -0
  86. package/dist/server/lib/run.js.map +1 -0
  87. package/dist/server/lib/runtimePaths.js +93 -0
  88. package/dist/server/lib/runtimePaths.js.map +1 -0
  89. package/dist/server/lib/shell.js +27 -0
  90. package/dist/server/lib/shell.js.map +1 -0
  91. package/dist/server/lib/skills.js +124 -0
  92. package/dist/server/lib/skills.js.map +1 -0
  93. package/dist/server/lib/startDev.js +18 -0
  94. package/dist/server/lib/startDev.js.map +1 -0
  95. package/dist/server/lib/staticClient.js +80 -0
  96. package/dist/server/lib/staticClient.js.map +1 -0
  97. package/dist/server/lib/terminal.js +366 -0
  98. package/dist/server/lib/terminal.js.map +1 -0
  99. package/dist/server/lib/ticketDependencies.js +174 -0
  100. package/dist/server/lib/ticketDependencies.js.map +1 -0
  101. package/dist/server/lib/ticketMessages.js +65 -0
  102. package/dist/server/lib/ticketMessages.js.map +1 -0
  103. package/dist/server/lib/ticketOpenQuestions.js +128 -0
  104. package/dist/server/lib/ticketOpenQuestions.js.map +1 -0
  105. package/dist/server/lib/ticketUndo.js +549 -0
  106. package/dist/server/lib/ticketUndo.js.map +1 -0
  107. package/dist/server/lib/tickets.js +981 -0
  108. package/dist/server/lib/tickets.js.map +1 -0
  109. package/dist/server/lib/types.js +2 -0
  110. package/dist/server/lib/types.js.map +1 -0
  111. package/dist/server/package.json +3 -0
  112. package/dist/server/workers/build.js +229 -0
  113. package/dist/server/workers/build.js.map +1 -0
  114. package/dist/server/workers/chat.js +190 -0
  115. package/dist/server/workers/chat.js.map +1 -0
  116. package/dist/server/workers/followUp.js +204 -0
  117. package/dist/server/workers/followUp.js.map +1 -0
  118. package/dist/server/workers/plan.js +1130 -0
  119. package/dist/server/workers/plan.js.map +1 -0
  120. package/dist/server/workers/planFollowUp.js +360 -0
  121. package/dist/server/workers/planFollowUp.js.map +1 -0
  122. package/dist/server/workers/review.js +167 -0
  123. package/dist/server/workers/review.js.map +1 -0
  124. package/package.json +40 -0
@@ -0,0 +1,124 @@
1
+ import { existsSync, readFileSync, readdirSync, statSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { resolveOpencodeSkillRoots } from './runtimePaths.js';
4
+ const CACHE_TTL_MS = 30_000;
5
+ const skillCache = new Map();
6
+ const readDirectoryNames = (directoryPath) => {
7
+ if (!existsSync(directoryPath)) {
8
+ return [];
9
+ }
10
+ try {
11
+ return readdirSync(directoryPath)
12
+ .map(entry => join(directoryPath, entry))
13
+ .filter(entryPath => {
14
+ try {
15
+ return statSync(entryPath).isDirectory();
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ });
21
+ }
22
+ catch {
23
+ return [];
24
+ }
25
+ };
26
+ const parseSkillFrontmatter = (fileContents) => {
27
+ const trimmed = fileContents.trimStart();
28
+ if (!trimmed.startsWith('---\n')) {
29
+ return null;
30
+ }
31
+ const endIndex = trimmed.indexOf('\n---\n', 4);
32
+ if (endIndex === -1) {
33
+ return null;
34
+ }
35
+ const frontmatter = trimmed.slice(4, endIndex);
36
+ const lines = frontmatter.split(/\r?\n/);
37
+ let name = '';
38
+ let description = '';
39
+ for (const line of lines) {
40
+ const separatorIndex = line.indexOf(':');
41
+ if (separatorIndex === -1) {
42
+ continue;
43
+ }
44
+ const key = line.slice(0, separatorIndex).trim();
45
+ const rawValue = line.slice(separatorIndex + 1).trim();
46
+ const value = rawValue.replace(/^['"]|['"]$/g, '').trim();
47
+ if (key === 'name') {
48
+ name = value;
49
+ }
50
+ if (key === 'description') {
51
+ description = value;
52
+ }
53
+ }
54
+ if (!name || !description) {
55
+ return null;
56
+ }
57
+ return {
58
+ name,
59
+ description,
60
+ };
61
+ };
62
+ const readSkill = (skillDirectory) => {
63
+ const skillFilePath = join(skillDirectory, 'SKILL.md');
64
+ if (!existsSync(skillFilePath)) {
65
+ return null;
66
+ }
67
+ try {
68
+ const frontmatter = parseSkillFrontmatter(readFileSync(skillFilePath, 'utf8'));
69
+ if (!frontmatter) {
70
+ return null;
71
+ }
72
+ return {
73
+ name: frontmatter.name,
74
+ description: frontmatter.description,
75
+ };
76
+ }
77
+ catch {
78
+ return null;
79
+ }
80
+ };
81
+ const discoverOpencodeSkills = (projectPath = null) => {
82
+ const skillsByName = new Map();
83
+ for (const rootPath of resolveOpencodeSkillRoots({ projectPath })) {
84
+ for (const skillDirectory of readDirectoryNames(rootPath)) {
85
+ const skill = readSkill(skillDirectory);
86
+ if (!skill || skillsByName.has(skill.name)) {
87
+ continue;
88
+ }
89
+ skillsByName.set(skill.name, skill);
90
+ }
91
+ }
92
+ return [...skillsByName.values()].sort((left, right) => left.name.localeCompare(right.name));
93
+ };
94
+ export const normalizeSkillNames = (value) => {
95
+ if (!Array.isArray(value)) {
96
+ return [];
97
+ }
98
+ return value
99
+ .filter((entry) => typeof entry === 'string')
100
+ .map(entry => entry.trim())
101
+ .filter(Boolean)
102
+ .filter((entry, index, values) => values.indexOf(entry) === index);
103
+ };
104
+ export const getDiscoveredSkills = async (tool, options = {}) => {
105
+ if (tool !== 'opencode') {
106
+ return [];
107
+ }
108
+ const projectPath = options.projectPath ?? null;
109
+ const cacheKey = `${tool}:${projectPath ?? ''}`;
110
+ const cached = skillCache.get(cacheKey);
111
+ if (cached && Date.now() - cached.timestamp < CACHE_TTL_MS) {
112
+ return cached.skills;
113
+ }
114
+ const skills = discoverOpencodeSkills(projectPath);
115
+ skillCache.set(cacheKey, {
116
+ skills,
117
+ timestamp: Date.now(),
118
+ });
119
+ return skills;
120
+ };
121
+ export const clearSkillCache = () => {
122
+ skillCache.clear();
123
+ };
124
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../server/lib/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { execFileSync } from 'child_process';
2
+ import { resolve } from 'path';
3
+ export const resolveCheckoutRoot = (cwd) => {
4
+ try {
5
+ const repoRoot = execFileSync('git', ['rev-parse', '--show-toplevel'], {
6
+ cwd,
7
+ encoding: 'utf8',
8
+ }).trim();
9
+ if (!repoRoot) {
10
+ return cwd;
11
+ }
12
+ return resolve(cwd, repoRoot);
13
+ }
14
+ catch {
15
+ return cwd;
16
+ }
17
+ };
18
+ //# sourceMappingURL=startDev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startDev.js","sourceRoot":"","sources":["../../../server/lib/startDev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAE9B,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAE,EAAE;IACjD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,EAAE;YACrE,GAAG;YACH,QAAQ,EAAE,MAAM;SACjB,CAAC,CAAC,IAAI,EAAE,CAAA;QAET,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,GAAG,CAAA;QACZ,CAAC;QAED,OAAO,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAA;IACZ,CAAC;AACH,CAAC,CAAA"}
@@ -0,0 +1,80 @@
1
+ import { existsSync, statSync } from 'fs';
2
+ import { dirname, join, resolve } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ const BACKEND_ROUTE_PREFIXES = [
5
+ '/socket.io',
6
+ '/run-config',
7
+ '/run-status',
8
+ '/preview-status',
9
+ '/projects',
10
+ '/tickets',
11
+ '/bundles',
12
+ '/ticket-dependencies',
13
+ '/tool',
14
+ '/models',
15
+ '/skills',
16
+ '/integrations',
17
+ '/plan',
18
+ '/planning-agent',
19
+ '/_archon',
20
+ ];
21
+ const STATIC_ASSET_PATH_PATTERN = /\/[^/?]+\.[^/]+$/;
22
+ const isDirectory = (path) => {
23
+ try {
24
+ return statSync(path).isDirectory();
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ };
30
+ const acceptsHtml = (acceptHeader) => {
31
+ if (Array.isArray(acceptHeader)) {
32
+ return acceptHeader.some(acceptsHtml);
33
+ }
34
+ if (typeof acceptHeader !== 'string') {
35
+ return false;
36
+ }
37
+ return acceptHeader.includes('text/html');
38
+ };
39
+ const isBackendRoutePath = (path) => {
40
+ return BACKEND_ROUTE_PREFIXES.some(prefix => path === prefix || path.startsWith(`${prefix}/`));
41
+ };
42
+ const uniquePaths = (paths) => {
43
+ return paths.filter((path, index, values) => Boolean(path) && values.indexOf(path) === index);
44
+ };
45
+ export const shouldServeClientApp = ({ method, path, acceptHeader }) => {
46
+ if (method !== 'GET') {
47
+ return false;
48
+ }
49
+ if (!acceptsHtml(acceptHeader)) {
50
+ return false;
51
+ }
52
+ if (isBackendRoutePath(path)) {
53
+ return false;
54
+ }
55
+ if (STATIC_ASSET_PATH_PATTERN.test(path)) {
56
+ return false;
57
+ }
58
+ return true;
59
+ };
60
+ export const resolveClientBuildPaths = (serverModuleUrl) => {
61
+ const configuredDirectory = process.env.ARCHON_CLIENT_DIST_DIR?.trim() || null;
62
+ const serverDirectory = dirname(fileURLToPath(serverModuleUrl));
63
+ const candidates = uniquePaths([
64
+ configuredDirectory,
65
+ resolve(serverDirectory, '../client'),
66
+ resolve(serverDirectory, '../client/dist'),
67
+ ]);
68
+ for (const candidate of candidates) {
69
+ const indexPath = join(candidate, 'index.html');
70
+ if (!isDirectory(candidate) || !existsSync(indexPath)) {
71
+ continue;
72
+ }
73
+ return {
74
+ directoryPath: candidate,
75
+ indexPath,
76
+ };
77
+ }
78
+ return null;
79
+ };
80
+ //# sourceMappingURL=staticClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staticClient.js","sourceRoot":"","sources":["../../../server/lib/staticClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,366 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { accessSync, chmodSync, constants, existsSync } from 'fs';
3
+ import { createRequire } from 'module';
4
+ import { dirname, join } from 'path';
5
+ import * as nodePty from 'node-pty';
6
+ import { resolveWorktreePath } from './git.js';
7
+ import { getEffectiveProject } from './projects.js';
8
+ import { resolveShell } from './shell.js';
9
+ import { resolveTicketBranch, resolveTicketContextKey } from './tickets.js';
10
+ const DEFAULT_TERM = 'xterm-256color';
11
+ const DEFAULT_COLS = 120;
12
+ const DEFAULT_ROWS = 30;
13
+ const IDLE_TIMEOUT_MS = 120_000;
14
+ const MAX_INITIAL_OUTPUT_BUFFER_BYTES = 32 * 1024;
15
+ const require = createRequire(import.meta.url);
16
+ const sessionsById = new Map();
17
+ const sessionIdByContextKey = new Map();
18
+ const sessionIdsBySocketId = new Map();
19
+ const resolveSpawnHelperPath = () => {
20
+ const packageDir = dirname(require.resolve('node-pty/package.json'));
21
+ const candidateDirs = [
22
+ `prebuilds/${process.platform}-${process.arch}`,
23
+ 'build/Release',
24
+ 'build/Debug',
25
+ ];
26
+ for (const dir of candidateDirs) {
27
+ const helperPath = join(packageDir, dir, 'spawn-helper');
28
+ if (existsSync(helperPath)) {
29
+ return helperPath;
30
+ }
31
+ }
32
+ return null;
33
+ };
34
+ const assertTerminalRuntimeReady = () => {
35
+ if (process.platform === 'win32') {
36
+ return;
37
+ }
38
+ const helperPath = resolveSpawnHelperPath();
39
+ if (!helperPath) {
40
+ return;
41
+ }
42
+ try {
43
+ accessSync(helperPath, constants.X_OK);
44
+ }
45
+ catch {
46
+ try {
47
+ chmodSync(helperPath, 0o755);
48
+ accessSync(helperPath, constants.X_OK);
49
+ }
50
+ catch {
51
+ throw new Error(`Terminal helper is not executable: ${helperPath}. Reinstall server dependencies or run chmod +x \"${helperPath}\".`);
52
+ }
53
+ }
54
+ };
55
+ const createTerminalEnv = () => {
56
+ const env = {
57
+ ...process.env,
58
+ TERM: DEFAULT_TERM,
59
+ };
60
+ delete env.npm_config_prefix;
61
+ return env;
62
+ };
63
+ const getRoomName = (sessionId) => `terminal:${sessionId}`;
64
+ const addSocketSession = (socketId, sessionId) => {
65
+ const existing = sessionIdsBySocketId.get(socketId);
66
+ if (existing) {
67
+ existing.add(sessionId);
68
+ return;
69
+ }
70
+ sessionIdsBySocketId.set(socketId, new Set([sessionId]));
71
+ };
72
+ const removeSocketSession = (socketId, sessionId) => {
73
+ const existing = sessionIdsBySocketId.get(socketId);
74
+ if (!existing) {
75
+ return;
76
+ }
77
+ existing.delete(sessionId);
78
+ if (existing.size === 0) {
79
+ sessionIdsBySocketId.delete(socketId);
80
+ }
81
+ };
82
+ const clearIdleTimer = (session) => {
83
+ if (!session.idleTimer) {
84
+ return;
85
+ }
86
+ clearTimeout(session.idleTimer);
87
+ session.idleTimer = null;
88
+ };
89
+ const pruneDisconnectedSocketIds = (session, io) => {
90
+ for (const socketId of [...session.connectedSocketIds]) {
91
+ if (io.sockets.sockets.has(socketId)) {
92
+ continue;
93
+ }
94
+ session.connectedSocketIds.delete(socketId);
95
+ removeSocketSession(socketId, session.id);
96
+ }
97
+ };
98
+ const destroyTerminalSession = (sessionId, options = {}) => {
99
+ const session = sessionsById.get(sessionId);
100
+ if (!session) {
101
+ return;
102
+ }
103
+ clearIdleTimer(session);
104
+ sessionsById.delete(sessionId);
105
+ if (sessionIdByContextKey.get(session.contextKey) === sessionId) {
106
+ sessionIdByContextKey.delete(session.contextKey);
107
+ }
108
+ for (const socketId of session.connectedSocketIds) {
109
+ removeSocketSession(socketId, sessionId);
110
+ }
111
+ if (options.killPty !== false) {
112
+ try {
113
+ session.pty.kill();
114
+ }
115
+ catch {
116
+ }
117
+ }
118
+ };
119
+ const scheduleIdleCleanup = (sessionId) => {
120
+ const session = sessionsById.get(sessionId);
121
+ if (!session || session.persistent || session.connectedSocketIds.size > 0) {
122
+ return;
123
+ }
124
+ clearIdleTimer(session);
125
+ session.idleTimer = setTimeout(() => {
126
+ const activeSession = sessionsById.get(sessionId);
127
+ if (!activeSession || activeSession.persistent || activeSession.connectedSocketIds.size > 0) {
128
+ return;
129
+ }
130
+ destroyTerminalSession(sessionId);
131
+ }, IDLE_TIMEOUT_MS);
132
+ };
133
+ export const closeAllTerminalSessions = () => {
134
+ for (const sessionId of [...sessionsById.keys()]) {
135
+ destroyTerminalSession(sessionId);
136
+ }
137
+ };
138
+ export const getTerminalSession = (sessionId) => sessionsById.get(sessionId) ?? null;
139
+ export const destroyTerminalSessionById = (sessionId) => {
140
+ destroyTerminalSession(sessionId);
141
+ };
142
+ export const resolveTerminalCwd = (ticket) => {
143
+ return resolveTerminalCwdForWorkspace(ticket, null);
144
+ };
145
+ export const resolveTerminalCwdForWorkspace = (ticket, workspaceCwd = null) => {
146
+ if (workspaceCwd) {
147
+ return workspaceCwd;
148
+ }
149
+ const project = getEffectiveProject(ticket);
150
+ if (!project) {
151
+ throw new Error('Ticket project no longer exists');
152
+ }
153
+ const branch = resolveTicketBranch(ticket);
154
+ if (branch) {
155
+ const candidatePath = resolveWorktreePath(branch, project);
156
+ if (existsSync(candidatePath)) {
157
+ return candidatePath;
158
+ }
159
+ }
160
+ return project.repo_path;
161
+ };
162
+ export const resolveProjectTerminalCwd = (project, cwd = null) => cwd ?? project.repo_path;
163
+ const createManagedTerminalSession = ({ contextKey, cwd, persistent = false }, io) => {
164
+ const existingSessionId = sessionIdByContextKey.get(contextKey);
165
+ if (existingSessionId) {
166
+ const existingSession = sessionsById.get(existingSessionId);
167
+ if (existingSession) {
168
+ pruneDisconnectedSocketIds(existingSession, io);
169
+ if (existingSession.persistent && existingSession.connectedSocketIds.size === 0) {
170
+ destroyTerminalSession(existingSession.id);
171
+ }
172
+ else {
173
+ scheduleIdleCleanup(existingSession.id);
174
+ return {
175
+ session_id: existingSession.id,
176
+ cwd: existingSession.cwd,
177
+ shell: existingSession.shell,
178
+ reused: true,
179
+ };
180
+ }
181
+ }
182
+ sessionIdByContextKey.delete(contextKey);
183
+ }
184
+ const shell = resolveShell();
185
+ assertTerminalRuntimeReady();
186
+ const sessionId = randomUUID();
187
+ const pty = nodePty.spawn(shell, ['-i'], {
188
+ name: DEFAULT_TERM,
189
+ cols: DEFAULT_COLS,
190
+ rows: DEFAULT_ROWS,
191
+ cwd,
192
+ env: createTerminalEnv(),
193
+ });
194
+ const session = {
195
+ id: sessionId,
196
+ contextKey,
197
+ cwd,
198
+ shell,
199
+ pty,
200
+ connectedSocketIds: new Set(),
201
+ idleTimer: null,
202
+ persistent,
203
+ initialOutputBuffer: [],
204
+ initialOutputBufferBytes: 0,
205
+ shouldBufferInitialOutput: true,
206
+ };
207
+ pty.onData(data => {
208
+ if (session.shouldBufferInitialOutput && session.connectedSocketIds.size === 0) {
209
+ const dataBytes = Buffer.byteLength(data);
210
+ if (dataBytes >= MAX_INITIAL_OUTPUT_BUFFER_BYTES) {
211
+ session.initialOutputBuffer = [data];
212
+ session.initialOutputBufferBytes = dataBytes;
213
+ }
214
+ else {
215
+ while (session.initialOutputBuffer.length > 0
216
+ && session.initialOutputBufferBytes + dataBytes > MAX_INITIAL_OUTPUT_BUFFER_BYTES) {
217
+ const removed = session.initialOutputBuffer.shift();
218
+ if (!removed) {
219
+ break;
220
+ }
221
+ session.initialOutputBufferBytes -= Buffer.byteLength(removed);
222
+ }
223
+ session.initialOutputBuffer.push(data);
224
+ session.initialOutputBufferBytes += dataBytes;
225
+ }
226
+ }
227
+ io.to(getRoomName(session.id)).emit('terminal:data', { sessionId: session.id, data });
228
+ });
229
+ pty.onExit(({ exitCode, signal }) => {
230
+ io.to(getRoomName(session.id)).emit('terminal:exit', {
231
+ sessionId: session.id,
232
+ exitCode,
233
+ signal,
234
+ });
235
+ destroyTerminalSession(session.id, { killPty: false });
236
+ });
237
+ sessionsById.set(session.id, session);
238
+ sessionIdByContextKey.set(contextKey, session.id);
239
+ scheduleIdleCleanup(session.id);
240
+ return {
241
+ session_id: session.id,
242
+ cwd: session.cwd,
243
+ shell: session.shell,
244
+ reused: false,
245
+ };
246
+ };
247
+ export const createTerminalSession = (ticket, io) => {
248
+ return createTerminalSessionForWorkspace(ticket, io, null);
249
+ };
250
+ export const createTerminalSessionForWorkspace = (ticket, io, workspaceCwd = null) => {
251
+ const contextKey = resolveTicketContextKey(ticket);
252
+ if (!contextKey) {
253
+ throw new Error('Ticket context is not available for terminal sessions');
254
+ }
255
+ return createManagedTerminalSession({
256
+ contextKey,
257
+ cwd: resolveTerminalCwdForWorkspace(ticket, workspaceCwd),
258
+ }, io);
259
+ };
260
+ export const createProjectTerminalSession = (project, io, options = {}) => createManagedTerminalSession({
261
+ contextKey: options.contextKey ?? `project:${project.id}`,
262
+ cwd: resolveProjectTerminalCwd(project, options.cwd ?? null),
263
+ persistent: true,
264
+ }, io);
265
+ const handleSessionJoin = (socket, sessionId) => {
266
+ const session = sessionsById.get(sessionId);
267
+ if (!session) {
268
+ socket.emit('terminal:error', {
269
+ sessionId,
270
+ message: 'Terminal session is no longer available.',
271
+ });
272
+ return;
273
+ }
274
+ clearIdleTimer(session);
275
+ session.connectedSocketIds.add(socket.id);
276
+ addSocketSession(socket.id, session.id);
277
+ void socket.join(getRoomName(session.id));
278
+ if (session.shouldBufferInitialOutput && session.initialOutputBuffer.length > 0) {
279
+ socket.emit('terminal:data', {
280
+ sessionId: session.id,
281
+ data: session.initialOutputBuffer.join(''),
282
+ });
283
+ }
284
+ session.initialOutputBuffer = [];
285
+ session.initialOutputBufferBytes = 0;
286
+ session.shouldBufferInitialOutput = false;
287
+ socket.emit('terminal:ready', {
288
+ sessionId: session.id,
289
+ cwd: session.cwd,
290
+ shell: session.shell,
291
+ });
292
+ };
293
+ const handleSessionLeave = (socket, sessionId) => {
294
+ const session = sessionsById.get(sessionId);
295
+ if (!session) {
296
+ removeSocketSession(socket.id, sessionId);
297
+ return;
298
+ }
299
+ session.connectedSocketIds.delete(socket.id);
300
+ removeSocketSession(socket.id, sessionId);
301
+ void socket.leave(getRoomName(session.id));
302
+ scheduleIdleCleanup(session.id);
303
+ };
304
+ export const registerTerminalSocketHandlers = (io, socket) => {
305
+ socket.on('terminal:join', (payload) => {
306
+ if (!payload || typeof payload.sessionId !== 'string' || payload.sessionId.trim() === '') {
307
+ socket.emit('terminal:error', {
308
+ sessionId: null,
309
+ message: 'terminal:join requires a sessionId.',
310
+ });
311
+ return;
312
+ }
313
+ handleSessionJoin(socket, payload.sessionId);
314
+ });
315
+ socket.on('terminal:input', (payload) => {
316
+ if (!payload || typeof payload.sessionId !== 'string' || typeof payload.input !== 'string') {
317
+ return;
318
+ }
319
+ const session = sessionsById.get(payload.sessionId);
320
+ if (!session || !session.connectedSocketIds.has(socket.id)) {
321
+ return;
322
+ }
323
+ session.pty.write(payload.input);
324
+ });
325
+ socket.on('terminal:resize', (payload) => {
326
+ if (!payload
327
+ || typeof payload.sessionId !== 'string'
328
+ || !Number.isInteger(payload.cols)
329
+ || !Number.isInteger(payload.rows)
330
+ || payload.cols <= 0
331
+ || payload.rows <= 0) {
332
+ return;
333
+ }
334
+ const session = sessionsById.get(payload.sessionId);
335
+ if (!session || !session.connectedSocketIds.has(socket.id)) {
336
+ return;
337
+ }
338
+ session.pty.resize(payload.cols, payload.rows);
339
+ });
340
+ socket.on('terminal:leave', (payload) => {
341
+ if (!payload || typeof payload.sessionId !== 'string') {
342
+ return;
343
+ }
344
+ handleSessionLeave(socket, payload.sessionId);
345
+ });
346
+ socket.on('terminal:destroy', (payload) => {
347
+ if (!payload || typeof payload.sessionId !== 'string') {
348
+ return;
349
+ }
350
+ const session = sessionsById.get(payload.sessionId);
351
+ if (!session || !session.connectedSocketIds.has(socket.id)) {
352
+ return;
353
+ }
354
+ destroyTerminalSession(payload.sessionId);
355
+ });
356
+ socket.on('disconnect', () => {
357
+ const sessionIds = sessionIdsBySocketId.get(socket.id);
358
+ if (!sessionIds) {
359
+ return;
360
+ }
361
+ for (const sessionId of [...sessionIds]) {
362
+ handleSessionLeave(socket, sessionId);
363
+ }
364
+ });
365
+ };
366
+ //# sourceMappingURL=terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../../server/lib/terminal.ts"],"names":[],"mappings":"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"}