agkan 3.15.2 → 3.17.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.
- package/README.ja.md +14 -0
- package/README.md +14 -0
- package/dist/cli/commands/board.d.ts.map +1 -1
- package/dist/cli/commands/board.js +25 -10
- package/dist/cli/commands/board.js.map +1 -1
- package/dist/cli/commands/context.js +1 -1
- package/dist/cli/commands/task/add-helpers.d.ts +5 -4
- package/dist/cli/commands/task/add-helpers.d.ts.map +1 -1
- package/dist/cli/commands/task/add-helpers.js +29 -2
- package/dist/cli/commands/task/add-helpers.js.map +1 -1
- package/dist/cli/commands/task/add.d.ts.map +1 -1
- package/dist/cli/commands/task/add.js +52 -17
- package/dist/cli/commands/task/add.js.map +1 -1
- package/dist/cli/commands/task/archive.d.ts.map +1 -1
- package/dist/cli/commands/task/archive.js +9 -110
- package/dist/cli/commands/task/archive.js.map +1 -1
- package/dist/cli/commands/task/find.d.ts.map +1 -1
- package/dist/cli/commands/task/find.js +3 -2
- package/dist/cli/commands/task/find.js.map +1 -1
- package/dist/cli/commands/task/get.d.ts.map +1 -1
- package/dist/cli/commands/task/get.js +19 -2
- package/dist/cli/commands/task/get.js.map +1 -1
- package/dist/cli/commands/task/list.d.ts.map +1 -1
- package/dist/cli/commands/task/list.js +69 -7
- package/dist/cli/commands/task/list.js.map +1 -1
- package/dist/cli/commands/task/purge-archive-helpers.d.ts +26 -0
- package/dist/cli/commands/task/purge-archive-helpers.d.ts.map +1 -0
- package/dist/cli/commands/task/purge-archive-helpers.js +133 -0
- package/dist/cli/commands/task/purge-archive-helpers.js.map +1 -0
- package/dist/cli/commands/task/purge.d.ts.map +1 -1
- package/dist/cli/commands/task/purge.js +9 -121
- package/dist/cli/commands/task/purge.js.map +1 -1
- package/dist/cli/commands/task/update.js +1 -1
- package/dist/cli/commands/task/update.js.map +1 -1
- package/dist/cli/utils/board-daemon.d.ts +8 -1
- package/dist/cli/utils/board-daemon.d.ts.map +1 -1
- package/dist/cli/utils/board-daemon.js +39 -4
- package/dist/cli/utils/board-daemon.js.map +1 -1
- package/dist/hooks/hook-attention.mjs +2 -1
- package/dist/hooks/hook-session-start.mjs +3 -1
- package/dist/hooks/hook-stop.mjs +10 -4
- package/dist/hooks/session-marker.mjs +6 -0
- package/dist/services/TaskService.d.ts +3 -1
- package/dist/services/TaskService.d.ts.map +1 -1
- package/dist/services/TaskService.js +5 -3
- package/dist/services/TaskService.js.map +1 -1
- package/dist/terminal/PtySessionService.d.ts +1 -0
- package/dist/terminal/PtySessionService.d.ts.map +1 -1
- package/dist/terminal/PtySessionService.js +49 -2
- package/dist/terminal/PtySessionService.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,130 +2,18 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Task purge command handler
|
|
4
4
|
*/
|
|
5
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
-
};
|
|
8
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
6
|
exports.setupTaskPurgeCommand = setupTaskPurgeCommand;
|
|
10
|
-
const
|
|
11
|
-
const service_container_1 = require("../../utils/service-container");
|
|
12
|
-
const error_handler_1 = require("../../utils/error-handler");
|
|
13
|
-
const validators_1 = require("../../utils/validators");
|
|
14
|
-
const output_formatter_1 = require("../../utils/output-formatter");
|
|
15
|
-
const format_1 = require("../../../utils/format");
|
|
16
|
-
const date_1 = require("../../../utils/date");
|
|
17
|
-
/** Default number of days before which tasks are eligible for purge */
|
|
18
|
-
const DEFAULT_DAYS_BEFORE = 3;
|
|
19
|
-
/**
|
|
20
|
-
* Resolve and validate the --before option value.
|
|
21
|
-
* Returns an ISO date string, or null on validation failure.
|
|
22
|
-
*/
|
|
23
|
-
function resolveBeforeDate(before) {
|
|
24
|
-
if (!before) {
|
|
25
|
-
return { date: (0, date_1.daysAgoIso)(DEFAULT_DAYS_BEFORE) };
|
|
26
|
-
}
|
|
27
|
-
const parsed = new Date(before);
|
|
28
|
-
if (isNaN(parsed.getTime())) {
|
|
29
|
-
return { error: `Invalid date: ${before}. Use ISO 8601 format, e.g. 2026-01-01` };
|
|
30
|
-
}
|
|
31
|
-
return { date: parsed.toISOString() };
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Resolve and validate the --status option value.
|
|
35
|
-
* Returns an array of TaskStatus values, or an error string.
|
|
36
|
-
*/
|
|
37
|
-
function resolveStatuses(statusOption) {
|
|
38
|
-
const parts = statusOption
|
|
39
|
-
.split(',')
|
|
40
|
-
.map((s) => s.trim())
|
|
41
|
-
.filter((s) => s !== '');
|
|
42
|
-
if (parts.length === 0) {
|
|
43
|
-
return { error: 'No statuses specified. Provide at least one status.' };
|
|
44
|
-
}
|
|
45
|
-
for (const s of parts) {
|
|
46
|
-
if (!(0, validators_1.validateTaskStatus)(s)) {
|
|
47
|
-
return {
|
|
48
|
-
error: `Invalid status: ${s}. Valid statuses: icebox, backlog, ready, in_progress, review, done, closed`,
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return { statuses: parts };
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Print human-readable purge result.
|
|
56
|
-
*/
|
|
57
|
-
function printPurgeResult(tasks, beforeDate, dryRun) {
|
|
58
|
-
if (tasks.length === 0) {
|
|
59
|
-
console.log(chalk_1.default.yellow('\nNo tasks matched the purge criteria.\n'));
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
if (dryRun) {
|
|
63
|
-
console.log(chalk_1.default.bold(`\n[Dry Run] ${tasks.length} task(s) would be purged (updated before ${beforeDate}):\n`));
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
console.log(chalk_1.default.green(`\n✓ Purged ${tasks.length} task(s) (updated before ${beforeDate}):\n`));
|
|
67
|
-
}
|
|
68
|
-
for (const t of tasks) {
|
|
69
|
-
console.log(` ${chalk_1.default.bold.cyan(`[${t.id}]`)} ${chalk_1.default.bold(t.title)} ` +
|
|
70
|
-
`${chalk_1.default.gray(`(${t.status})`)} ${chalk_1.default.gray('updated:')} ${(0, format_1.formatDate)(t.updated_at)}`);
|
|
71
|
-
}
|
|
72
|
-
console.log('');
|
|
73
|
-
}
|
|
7
|
+
const purge_archive_helpers_1 = require("./purge-archive-helpers");
|
|
74
8
|
function setupTaskPurgeCommand(program) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
.
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
.option('--dry-run', 'Preview tasks that would be purged without deleting them')
|
|
84
|
-
.option('--json', 'Output in JSON format')
|
|
85
|
-
.description('Delete done/closed tasks older than a given date to reduce database size')
|
|
86
|
-
.action(async (options) => {
|
|
87
|
-
const formatter = (0, output_formatter_1.createFormatter)(options);
|
|
88
|
-
try {
|
|
89
|
-
const { taskService } = (0, service_container_1.getServiceContainer)();
|
|
90
|
-
const beforeResult = resolveBeforeDate(options.before);
|
|
91
|
-
if ('error' in beforeResult) {
|
|
92
|
-
formatter.error(beforeResult.error, () => {
|
|
93
|
-
console.error(chalk_1.default.red(`\nError: ${beforeResult.error}\n`));
|
|
94
|
-
});
|
|
95
|
-
process.exit(1);
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
const beforeDate = beforeResult.date;
|
|
99
|
-
const statusResult = resolveStatuses(options.status);
|
|
100
|
-
if ('error' in statusResult) {
|
|
101
|
-
formatter.error(statusResult.error, () => {
|
|
102
|
-
console.error(chalk_1.default.red(`\nError: ${statusResult.error}\n`));
|
|
103
|
-
});
|
|
104
|
-
process.exit(1);
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
const statuses = statusResult.statuses;
|
|
108
|
-
const dryRun = !!options.dryRun;
|
|
109
|
-
const tasks = taskService.purgeTasksBefore(beforeDate, statuses, dryRun);
|
|
110
|
-
formatter.output(() => ({
|
|
111
|
-
dryRun,
|
|
112
|
-
beforeDate,
|
|
113
|
-
statuses,
|
|
114
|
-
count: tasks.length,
|
|
115
|
-
tasks: tasks.map((t) => ({ id: t.id, title: t.title, status: t.status, updated_at: t.updated_at })),
|
|
116
|
-
}), () => printPurgeResult(tasks, beforeDate, dryRun));
|
|
117
|
-
}
|
|
118
|
-
catch (error) {
|
|
119
|
-
if (error instanceof Error) {
|
|
120
|
-
(0, error_handler_1.handleError)(error, options);
|
|
121
|
-
}
|
|
122
|
-
else {
|
|
123
|
-
formatter.error('An unknown error occurred', () => {
|
|
124
|
-
console.error(chalk_1.default.red('\n✗ An unknown error occurred\n'));
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
process.exit(1);
|
|
128
|
-
}
|
|
9
|
+
(0, purge_archive_helpers_1.setupPurgeArchiveCommand)(program, {
|
|
10
|
+
commandName: 'purge',
|
|
11
|
+
verb: 'purge',
|
|
12
|
+
pastVerb: 'Purged',
|
|
13
|
+
description: 'Delete done/closed tasks older than a given date to reduce database size',
|
|
14
|
+
beforeHelp: 'Purge tasks last updated before this date (ISO 8601, e.g. 2026-01-01). Defaults to 3 days ago.',
|
|
15
|
+
dryRunHelp: 'Preview tasks that would be purged without deleting them',
|
|
16
|
+
serviceMethod: (taskService, beforeDate, statuses, dryRun) => taskService.purgeTasksBefore(beforeDate, statuses, dryRun),
|
|
129
17
|
});
|
|
130
18
|
}
|
|
131
19
|
//# sourceMappingURL=purge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"purge.js","sourceRoot":"","sources":["../../../../src/cli/commands/task/purge.ts"],"names":[],"mappings":";AAAA;;GAEG
|
|
1
|
+
{"version":3,"file":"purge.js","sourceRoot":"","sources":["../../../../src/cli/commands/task/purge.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAKH,sDAWC;AAbD,mEAAmE;AAEnE,SAAgB,qBAAqB,CAAC,OAAgB;IACpD,IAAA,gDAAwB,EAAC,OAAO,EAAE;QAChC,WAAW,EAAE,OAAO;QACpB,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,0EAA0E;QACvF,UAAU,EAAE,gGAAgG;QAC5G,UAAU,EAAE,0DAA0D;QACtE,aAAa,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,CAC3D,WAAW,CAAC,gBAAgB,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC;KAC7D,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -83,7 +83,7 @@ function setupTaskUpdateCommand(program) {
|
|
|
83
83
|
.option('--body <body>', 'Update body')
|
|
84
84
|
.option('--author <author>', 'Update author')
|
|
85
85
|
.option('--assignees <assignees>', 'Update assignees')
|
|
86
|
-
.option('--priority <priority>', 'Update priority (critical, high, medium, low, or empty to clear)')
|
|
86
|
+
.option('-p, --priority <priority>', 'Update priority (critical, high, medium, low, or empty to clear)')
|
|
87
87
|
.option('--branch <branch>', 'Update git branch name (or empty to clear)')
|
|
88
88
|
.option('--file <path>', 'Read body from file (only valid for body field)')
|
|
89
89
|
.option('--json', 'Output in JSON format')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../src/cli/commands/task/update.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AAwEH,wDAwBC;AA7FD,kDAA0B;AAE1B,qEAAoE;AAGpE,6DAA6E;AAC7E,kDAAmE;AACnE,mEAA+D;AAC/D,qDAA2G;AAC3G,yDAAsD;AAEtD,SAAS,eAAe,CACtB,WAAwB,EACxB,MAAc,EACd,WAAmC;IAEnC,OAAO,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE;QACpC,GAAG,CAAC,WAAW,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,MAAoB,EAAE,CAAC;QACrF,GAAG,CAAC,WAAW,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;QACpE,GAAG,CAAC,WAAW,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC;QACjE,GAAG,CAAC,WAAW,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC;QACvE,GAAG,CAAC,WAAW,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC;QAChF,GAAG,CAAC,WAAW,CAAC,QAAQ,KAAK,SAAS,IAAI;YACxC,QAAQ,EAAE,WAAW,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,WAAW,CAAC,QAAqB;SAClF,CAAC;QACF,GAAG,CAAC,WAAW,CAAC,MAAM,KAAK,SAAS,IAAI;YACtC,MAAM,EAAE,WAAW,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM;SAC9D,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,EAAU,EAAE,KAAa,EAAE,KAAa,EAAE,OAAsB;IAChG,MAAM,SAAS,GAAG,IAAA,kCAAe,EAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,EAAE,WAAW,EAAE,GAAG,IAAA,uCAAmB,GAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAA,mCAAmB,EAAC,EAAE,CAAC,CAAC;QACvC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,SAAS,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,EAAE;gBAC/C,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,WAAW,GAAG,IAAA,2BAAU,EAAC,OAAO,EAAE,KAAK,CAAC;YAC5C,CAAC,CAAC,IAAA,mCAAkB,EAAC,OAAO,EAAE,SAAS,CAAC;YACxC,CAAC,CAAC,IAAA,yCAAwB,EAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAC/D,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,IAAI,GAAG,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAC/D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,SAAS,CAAC,KAAK,CAAC,gBAAgB,EAAE,YAAY,EAAE,GAAG,EAAE;gBACnD,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,IAAA,yBAAW,GAAE,CAAC;QACpB,aAAa,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,IAAA,2BAAW,EAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,EAAE;gBAChD,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;YAC9D,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAgB,sBAAsB,CAAC,OAAgB;IACrD,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,CAAC;IAC1E,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IACD,WAAW;SACR,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;SAC3B,QAAQ,CACP,SAAS,EACT,iGAAiG,CAClG;SACA,QAAQ,CAAC,SAAS,EAAE,0CAA0C,CAAC;SAC/D,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC;SACzC,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC;SAC5C,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC;SACtC,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC;SAC5C,MAAM,CAAC,yBAAyB,EAAE,kBAAkB,CAAC;SACrD,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../src/cli/commands/task/update.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AAwEH,wDAwBC;AA7FD,kDAA0B;AAE1B,qEAAoE;AAGpE,6DAA6E;AAC7E,kDAAmE;AACnE,mEAA+D;AAC/D,qDAA2G;AAC3G,yDAAsD;AAEtD,SAAS,eAAe,CACtB,WAAwB,EACxB,MAAc,EACd,WAAmC;IAEnC,OAAO,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE;QACpC,GAAG,CAAC,WAAW,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,MAAoB,EAAE,CAAC;QACrF,GAAG,CAAC,WAAW,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;QACpE,GAAG,CAAC,WAAW,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC;QACjE,GAAG,CAAC,WAAW,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC;QACvE,GAAG,CAAC,WAAW,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC;QAChF,GAAG,CAAC,WAAW,CAAC,QAAQ,KAAK,SAAS,IAAI;YACxC,QAAQ,EAAE,WAAW,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,WAAW,CAAC,QAAqB;SAClF,CAAC;QACF,GAAG,CAAC,WAAW,CAAC,MAAM,KAAK,SAAS,IAAI;YACtC,MAAM,EAAE,WAAW,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM;SAC9D,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,EAAU,EAAE,KAAa,EAAE,KAAa,EAAE,OAAsB;IAChG,MAAM,SAAS,GAAG,IAAA,kCAAe,EAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,EAAE,WAAW,EAAE,GAAG,IAAA,uCAAmB,GAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAA,mCAAmB,EAAC,EAAE,CAAC,CAAC;QACvC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,SAAS,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,EAAE;gBAC/C,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,WAAW,GAAG,IAAA,2BAAU,EAAC,OAAO,EAAE,KAAK,CAAC;YAC5C,CAAC,CAAC,IAAA,mCAAkB,EAAC,OAAO,EAAE,SAAS,CAAC;YACxC,CAAC,CAAC,IAAA,yCAAwB,EAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAC/D,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,IAAI,GAAG,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAC/D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,SAAS,CAAC,KAAK,CAAC,gBAAgB,EAAE,YAAY,EAAE,GAAG,EAAE;gBACnD,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,IAAA,yBAAW,GAAE,CAAC;QACpB,aAAa,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,IAAA,2BAAW,EAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,EAAE;gBAChD,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;YAC9D,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAgB,sBAAsB,CAAC,OAAgB;IACrD,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,CAAC;IAC1E,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IACD,WAAW;SACR,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;SAC3B,QAAQ,CACP,SAAS,EACT,iGAAiG,CAClG;SACA,QAAQ,CAAC,SAAS,EAAE,0CAA0C,CAAC;SAC/D,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC;SACzC,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC;SAC5C,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC;SACtC,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC;SAC5C,MAAM,CAAC,yBAAyB,EAAE,kBAAkB,CAAC;SACrD,MAAM,CAAC,2BAA2B,EAAE,kEAAkE,CAAC;SACvG,MAAM,CAAC,mBAAmB,EAAE,4CAA4C,CAAC;SACzE,MAAM,CAAC,eAAe,EAAE,iDAAiD,CAAC;SAC1E,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;SACzC,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,aAAa,CACpB,WAAwB,EACxB,IAA2C,EAC3C,SAA6C;IAE7C,MAAM,YAAY,GAAG,WAAW,CAAC,oBAAoB,EAAE,CAAC;IACxD,MAAM,WAAW,GAAG,IAAA,uBAAc,EAAC,IAAK,CAAC,MAAM,CAAC,CAAC;IAEjD,SAAS,CAAC,MAAM,CACd,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EACrD,GAAG,EAAE;QACH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,eAAK,CAAC,WAAW,CAAC,CAAC,IAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAA,mBAAU,EAAC,IAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACjD,kBAAkB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,YAAyB,EACzB,YAA6D;IAE7D,MAAM,aAAa,GAAiD;QAClE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE;QAChD,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,CAAC,OAAO,EAAE;QAClD,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE;QAC9C,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,CAAC,WAAW,EAAE;QAC1D,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE;QAChD,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE;QAC5C,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE;KACjD,CAAC;IACF,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;QAC1C,MAAM,KAAK,GAAG,IAAA,uBAAc,EAAC,MAAM,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
export declare function getPidFilePath(): string;
|
|
2
2
|
export declare function readBoardPid(): number | null;
|
|
3
|
+
export declare function readBoardPort(): number | null;
|
|
3
4
|
export declare function isBoardRunning(): boolean;
|
|
4
5
|
export declare function removePidFile(): void;
|
|
5
|
-
export declare function spawnBoardDaemon(boardArgs: string[]): number;
|
|
6
|
+
export declare function spawnBoardDaemon(boardArgs: string[], port: number): number;
|
|
7
|
+
export interface WaitForBoardReadyOptions {
|
|
8
|
+
timeoutMs?: number;
|
|
9
|
+
intervalMs?: number;
|
|
10
|
+
fetchImpl?: typeof fetch;
|
|
11
|
+
}
|
|
12
|
+
export declare function waitForBoardReady(port: number, options?: WaitForBoardReadyOptions): Promise<boolean>;
|
|
6
13
|
export declare function killBoardProcess(): boolean;
|
|
7
14
|
//# sourceMappingURL=board-daemon.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board-daemon.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/board-daemon.ts"],"names":[],"mappings":"AAKA,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAM5C;AAED,wBAAgB,cAAc,IAAI,OAAO,CASxC;AAWD,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"board-daemon.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/board-daemon.ts"],"names":[],"mappings":"AAKA,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAM5C;AAED,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAO7C;AAED,wBAAgB,cAAc,IAAI,OAAO,CASxC;AAWD,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAY1E;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,wBAA6B,GAAG,OAAO,CAAC,OAAO,CAAC,CAqB9G;AAED,wBAAgB,gBAAgB,IAAI,OAAO,CAc1C"}
|
|
@@ -5,9 +5,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.getPidFilePath = getPidFilePath;
|
|
7
7
|
exports.readBoardPid = readBoardPid;
|
|
8
|
+
exports.readBoardPort = readBoardPort;
|
|
8
9
|
exports.isBoardRunning = isBoardRunning;
|
|
9
10
|
exports.removePidFile = removePidFile;
|
|
10
11
|
exports.spawnBoardDaemon = spawnBoardDaemon;
|
|
12
|
+
exports.waitForBoardReady = waitForBoardReady;
|
|
11
13
|
exports.killBoardProcess = killBoardProcess;
|
|
12
14
|
const fs_1 = __importDefault(require("fs"));
|
|
13
15
|
const path_1 = __importDefault(require("path"));
|
|
@@ -24,6 +26,16 @@ function readBoardPid() {
|
|
|
24
26
|
const pid = parseInt(content, 10);
|
|
25
27
|
return isNaN(pid) ? null : pid;
|
|
26
28
|
}
|
|
29
|
+
function readBoardPort() {
|
|
30
|
+
const pidFile = getPidFilePath();
|
|
31
|
+
if (!fs_1.default.existsSync(pidFile))
|
|
32
|
+
return null;
|
|
33
|
+
const lines = fs_1.default.readFileSync(pidFile, 'utf8').trim().split('\n');
|
|
34
|
+
if (lines.length < 2)
|
|
35
|
+
return null;
|
|
36
|
+
const port = parseInt(lines[1], 10);
|
|
37
|
+
return isNaN(port) ? null : port;
|
|
38
|
+
}
|
|
27
39
|
function isBoardRunning() {
|
|
28
40
|
const pid = readBoardPid();
|
|
29
41
|
if (pid === null)
|
|
@@ -36,13 +48,13 @@ function isBoardRunning() {
|
|
|
36
48
|
return false;
|
|
37
49
|
}
|
|
38
50
|
}
|
|
39
|
-
function writePidFile(pid) {
|
|
51
|
+
function writePidFile(pid, port) {
|
|
40
52
|
const pidFile = getPidFilePath();
|
|
41
53
|
const dir = path_1.default.dirname(pidFile);
|
|
42
54
|
if (!fs_1.default.existsSync(dir)) {
|
|
43
55
|
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
44
56
|
}
|
|
45
|
-
fs_1.default.writeFileSync(pidFile,
|
|
57
|
+
fs_1.default.writeFileSync(pidFile, `${pid}\n${port}`, { encoding: 'utf8', mode: 0o600 });
|
|
46
58
|
}
|
|
47
59
|
function removePidFile() {
|
|
48
60
|
const pidFile = getPidFilePath();
|
|
@@ -50,7 +62,7 @@ function removePidFile() {
|
|
|
50
62
|
fs_1.default.unlinkSync(pidFile);
|
|
51
63
|
}
|
|
52
64
|
}
|
|
53
|
-
function spawnBoardDaemon(boardArgs) {
|
|
65
|
+
function spawnBoardDaemon(boardArgs, port) {
|
|
54
66
|
const child = (0, child_process_1.spawn)(process.argv[0], [process.argv[1], 'board', ...boardArgs], {
|
|
55
67
|
detached: true,
|
|
56
68
|
stdio: 'ignore',
|
|
@@ -60,9 +72,32 @@ function spawnBoardDaemon(boardArgs) {
|
|
|
60
72
|
throw new Error('Failed to spawn board daemon: child process has no PID');
|
|
61
73
|
}
|
|
62
74
|
const pid = child.pid;
|
|
63
|
-
writePidFile(pid);
|
|
75
|
+
writePidFile(pid, port);
|
|
64
76
|
return pid;
|
|
65
77
|
}
|
|
78
|
+
async function waitForBoardReady(port, options = {}) {
|
|
79
|
+
const timeoutMs = options.timeoutMs ?? 5000;
|
|
80
|
+
const intervalMs = options.intervalMs ?? 100;
|
|
81
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
82
|
+
const deadline = Date.now() + timeoutMs;
|
|
83
|
+
do {
|
|
84
|
+
const controller = new AbortController();
|
|
85
|
+
const attemptTimeout = setTimeout(() => controller.abort(), Math.max(deadline - Date.now(), 50));
|
|
86
|
+
try {
|
|
87
|
+
const response = await fetchImpl(`http://localhost:${port}/api/version`, { signal: controller.signal });
|
|
88
|
+
if (response.ok)
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Server not accepting connections yet, or the request stalled/was aborted; retry until the deadline.
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
clearTimeout(attemptTimeout);
|
|
96
|
+
}
|
|
97
|
+
await new Promise((resolve) => setTimeout(resolve, intervalMs));
|
|
98
|
+
} while (Date.now() < deadline);
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
66
101
|
function killBoardProcess() {
|
|
67
102
|
const pid = readBoardPid();
|
|
68
103
|
if (pid === null)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board-daemon.js","sourceRoot":"","sources":["../../../src/cli/utils/board-daemon.ts"],"names":[],"mappings":";;;;;AAKA,wCAEC;AAED,oCAMC;AAED,wCASC;AAWD,sCAKC;AAED,4CAYC;AAED,4CAcC;
|
|
1
|
+
{"version":3,"file":"board-daemon.js","sourceRoot":"","sources":["../../../src/cli/utils/board-daemon.ts"],"names":[],"mappings":";;;;;AAKA,wCAEC;AAED,oCAMC;AAED,sCAOC;AAED,wCASC;AAWD,sCAKC;AAED,4CAYC;AAQD,8CAqBC;AAED,4CAcC;AA9GD,4CAAoB;AACpB,gDAAwB;AACxB,iDAAsC;AACtC,4CAAoD;AAEpD,SAAgB,cAAc;IAC5B,OAAO,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAA,0BAAiB,GAAE,EAAE,WAAW,CAAC,CAAC;AACpE,CAAC;AAED,SAAgB,YAAY;IAC1B,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAClC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AACjC,CAAC;AAED,SAAgB,aAAa;IAC3B,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,KAAK,GAAG,YAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACnC,CAAC;AAED,SAAgB,cAAc;IAC5B,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC/B,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAW,EAAE,IAAY;IAC7C,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,YAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,YAAE,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,GAAG,KAAK,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAClF,CAAC;AAED,SAAgB,aAAa;IAC3B,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,IAAI,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAgB,gBAAgB,CAAC,SAAmB,EAAE,IAAY;IAChE,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,EAAE;QAC7E,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACtB,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxB,OAAO,GAAG,CAAC;AACb,CAAC;AAQM,KAAK,UAAU,iBAAiB,CAAC,IAAY,EAAE,UAAoC,EAAE;IAC1F,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC;IAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAExC,GAAG,CAAC;QACF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACjG,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,oBAAoB,IAAI,cAAc,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YACxG,IAAI,QAAQ,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,sGAAsG;QACxG,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,cAAc,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;IAClE,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE;IAEhC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,gBAAgB;IAC9B,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC/B,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC7B,aAAa,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACpD,aAAa,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { readFileSync } from 'fs';
|
|
3
|
+
import { getSessionMarkerPath } from './session-marker.mjs';
|
|
3
4
|
|
|
4
5
|
const argSubcmd = process.argv[2];
|
|
5
6
|
const taskIdRaw = process.env.BOARD_TASK_ID;
|
|
@@ -18,7 +19,7 @@ if (!Number.isFinite(taskId)) {
|
|
|
18
19
|
|
|
19
20
|
// Ignore events from subagents — only the main session should trigger attention.
|
|
20
21
|
try {
|
|
21
|
-
const mainSessionId = readFileSync(
|
|
22
|
+
const mainSessionId = readFileSync(getSessionMarkerPath(taskIdRaw), 'utf-8').trim();
|
|
22
23
|
if (mainSessionId) {
|
|
23
24
|
const chunks = [];
|
|
24
25
|
for await (const chunk of process.stdin) chunks.push(chunk);
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// Records the main session_id so hook-attention.mjs can ignore subagent events.
|
|
4
|
+
import { getSessionMarkerPath } from './session-marker.mjs';
|
|
5
|
+
|
|
4
6
|
const taskIdRaw = process.env.BOARD_TASK_ID;
|
|
5
7
|
|
|
6
8
|
if (!taskIdRaw) {
|
|
@@ -14,7 +16,7 @@ try {
|
|
|
14
16
|
const sessionId = payload?.session_id;
|
|
15
17
|
if (sessionId) {
|
|
16
18
|
const { writeFileSync } = await import('fs');
|
|
17
|
-
writeFileSync(
|
|
19
|
+
writeFileSync(getSessionMarkerPath(taskIdRaw), sessionId, 'utf-8');
|
|
18
20
|
}
|
|
19
21
|
} catch {
|
|
20
22
|
// best-effort; don't block startup
|
package/dist/hooks/hook-stop.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { promises as fs } from 'fs';
|
|
3
|
+
import { getSessionMarkerPath } from './session-marker.mjs';
|
|
3
4
|
|
|
4
5
|
async function readStdin() {
|
|
5
6
|
const chunks = [];
|
|
@@ -98,8 +99,10 @@ function isBackgroundJobComplete(entries, toolUseId) {
|
|
|
98
99
|
|
|
99
100
|
// Fetches the current task status from the board and checks whether it has reached the
|
|
100
101
|
// run's target status. Reached = current status matches target, or has advanced to a
|
|
101
|
-
// terminal status (done/closed)
|
|
102
|
-
//
|
|
102
|
+
// terminal status (review/done/closed) — review means a PR was created and the agent's
|
|
103
|
+
// work has been handed off, which is a valid completion signal even for run/direct
|
|
104
|
+
// sessions whose target is 'done'. On fetch failure or non-200, returns false so the
|
|
105
|
+
// caller falls through to the normal guard checks instead of overriding them.
|
|
103
106
|
async function isTargetStatusReached(apiUrl, token, taskId, targetStatus) {
|
|
104
107
|
try {
|
|
105
108
|
const res = await fetch(`${apiUrl}/api/internal/tasks/${taskId}/status`, {
|
|
@@ -109,7 +112,7 @@ async function isTargetStatusReached(apiUrl, token, taskId, targetStatus) {
|
|
|
109
112
|
if (!res.ok) return false;
|
|
110
113
|
const data = await res.json();
|
|
111
114
|
const status = data && data.status;
|
|
112
|
-
return status === targetStatus || status === 'done' || status === 'closed';
|
|
115
|
+
return status === targetStatus || status === 'review' || status === 'done' || status === 'closed';
|
|
113
116
|
} catch (err) {
|
|
114
117
|
process.stderr.write(`hook-stop: status check failed: ${(err && err.message) || err}\n`);
|
|
115
118
|
return false;
|
|
@@ -176,10 +179,13 @@ async function main() {
|
|
|
176
179
|
// interactive guard below causes an early return, we would lose the marker needed to
|
|
177
180
|
// tell the main session apart from a sub-agent. It is only unlinked inside
|
|
178
181
|
// notifyComplete, right before the completion POST is actually sent.
|
|
179
|
-
const sessionFile =
|
|
182
|
+
const sessionFile = getSessionMarkerPath(taskIdRaw);
|
|
180
183
|
try {
|
|
181
184
|
const mainSessionId = (await fs.readFile(sessionFile, 'utf-8')).trim();
|
|
182
185
|
if (mainSessionId && mainSessionId !== payload?.session_id) {
|
|
186
|
+
process.stderr.write(
|
|
187
|
+
`hook-stop: main session mismatch (main=${mainSessionId}, current=${payload?.session_id}); treating as sub-agent Stop\n`
|
|
188
|
+
);
|
|
183
189
|
return; // Sub-agent's Stop
|
|
184
190
|
}
|
|
185
191
|
} catch {
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// Resolves the main-session marker file path shared by hook-session-start.mjs,
|
|
2
|
+
// hook-stop.mjs, and hook-attention.mjs. BOARD_SESSION_MARKER_FILE lets callers
|
|
3
|
+
// (tests) redirect this to an isolated path instead of the real /tmp location.
|
|
4
|
+
export function getSessionMarkerPath(taskId) {
|
|
5
|
+
return process.env.BOARD_SESSION_MARKER_FILE || `/tmp/board-main-session-${taskId}`;
|
|
6
|
+
}
|
|
@@ -89,9 +89,11 @@ export declare class TaskService {
|
|
|
89
89
|
* @param keyword - Search keyword (LIKE search on title and body)
|
|
90
90
|
* @param includeAll - If true, include done/closed tasks in search (default: false)
|
|
91
91
|
* @param statuses - Optional array of statuses to filter by (overrides includeAll)
|
|
92
|
+
* @param includeArchived - If true, include archived tasks in search; also skips the default
|
|
93
|
+
* done/closed status narrowing, since archived tasks are typically done/closed (default: false)
|
|
92
94
|
* @returns Array of matched tasks
|
|
93
95
|
*/
|
|
94
|
-
searchTasks(keyword: string, includeAll?: boolean, statuses?: TaskStatus[]): Task[];
|
|
96
|
+
searchTasks(keyword: string, includeAll?: boolean, statuses?: TaskStatus[], includeArchived?: boolean): Task[];
|
|
95
97
|
/**
|
|
96
98
|
* Get child tasks (direct children only)
|
|
97
99
|
* @param parentId - Parent task ID
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskService.d.ts","sourceRoot":"","sources":["../../src/services/TaskService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAI/E,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,2CAA2C;AAC3C,eAAO,MAAM,mBAAmB,4EAA6E,CAAC;AAC9G,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvC;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,iBAAiB,CAAC,CAAoB;gBAElC,OAAO,CAAC,EAAE,cAAc,EAAE,iBAAiB,CAAC,EAAE,iBAAiB;IAK3E;;;;;;OAMG;IACH,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IA8CxC;;;;OAIG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIhC;;;;;;OAMG;IACH,SAAS,CACP,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,CAAC;QACnC,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,EACD,IAAI,CAAC,EAAE,SAAS,EAChB,KAAK,CAAC,EAAE,SAAS,GAChB,IAAI,EAAE;IAuBT;;;;;OAKG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IA8B3D;;;;OAIG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAU/B;;;OAGG;IACH,oBAAoB,IAAI,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC;IAIlD;;;;;;OAMG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,GAAE,UAAU,EAAuB,EAAE,MAAM,GAAE,OAAe,GAAG,IAAI,EAAE;IAclH;;;;;;;OAOG;IACH,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,GAAE,UAAU,EAAuB,EAAE,MAAM,GAAE,OAAe,GAAG,IAAI,EAAE;IAcpH;;;;OAIG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAUtC
|
|
1
|
+
{"version":3,"file":"TaskService.d.ts","sourceRoot":"","sources":["../../src/services/TaskService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAI/E,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,2CAA2C;AAC3C,eAAO,MAAM,mBAAmB,4EAA6E,CAAC;AAC9G,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvC;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,iBAAiB,CAAC,CAAoB;gBAElC,OAAO,CAAC,EAAE,cAAc,EAAE,iBAAiB,CAAC,EAAE,iBAAiB;IAK3E;;;;;;OAMG;IACH,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IA8CxC;;;;OAIG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIhC;;;;;;OAMG;IACH,SAAS,CACP,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,CAAC;QACnC,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,EACD,IAAI,CAAC,EAAE,SAAS,EAChB,KAAK,CAAC,EAAE,SAAS,GAChB,IAAI,EAAE;IAuBT;;;;;OAKG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IA8B3D;;;;OAIG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAU/B;;;OAGG;IACH,oBAAoB,IAAI,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC;IAIlD;;;;;;OAMG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,GAAE,UAAU,EAAuB,EAAE,MAAM,GAAE,OAAe,GAAG,IAAI,EAAE;IAclH;;;;;;;OAOG;IACH,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,GAAE,UAAU,EAAuB,EAAE,MAAM,GAAE,OAAe,GAAG,IAAI,EAAE;IAcpH;;;;OAIG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAUtC;;;;;;;;OAQG;IACH,WAAW,CACT,OAAO,EAAE,MAAM,EACf,UAAU,GAAE,OAAe,EAC3B,QAAQ,CAAC,EAAE,UAAU,EAAE,EACvB,eAAe,GAAE,OAAe,GAC/B,IAAI,EAAE;IAmBT;;;;OAIG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE;IAIvC;;;;OAIG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAQ1C;;;;OAIG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE;IAwB5C;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;CAuBzC"}
|
|
@@ -205,20 +205,22 @@ class TaskService {
|
|
|
205
205
|
* @param keyword - Search keyword (LIKE search on title and body)
|
|
206
206
|
* @param includeAll - If true, include done/closed tasks in search (default: false)
|
|
207
207
|
* @param statuses - Optional array of statuses to filter by (overrides includeAll)
|
|
208
|
+
* @param includeArchived - If true, include archived tasks in search; also skips the default
|
|
209
|
+
* done/closed status narrowing, since archived tasks are typically done/closed (default: false)
|
|
208
210
|
* @returns Array of matched tasks
|
|
209
211
|
*/
|
|
210
|
-
searchTasks(keyword, includeAll = false, statuses) {
|
|
212
|
+
searchTasks(keyword, includeAll = false, statuses, includeArchived = false) {
|
|
211
213
|
let statusFilter;
|
|
212
214
|
if (statuses && statuses.length > 0) {
|
|
213
215
|
statusFilter = statuses;
|
|
214
216
|
}
|
|
215
|
-
else if (!includeAll) {
|
|
217
|
+
else if (!includeAll && !includeArchived) {
|
|
216
218
|
// Exclude done/closed/icebox by filtering to all other statuses
|
|
217
219
|
const allStatuses = ['backlog', 'ready', 'in_progress', 'review'];
|
|
218
220
|
statusFilter = allStatuses;
|
|
219
221
|
}
|
|
220
222
|
const searchId = /^\d+$/.test(keyword) ? parseInt(keyword, 10) : undefined;
|
|
221
|
-
return this.backend.tasks.findAll({ search: keyword, status: statusFilter, searchId }, { field: 'created_at', order: 'desc' });
|
|
223
|
+
return this.backend.tasks.findAll({ search: keyword, status: statusFilter, searchId, includeArchived }, { field: 'created_at', order: 'desc' });
|
|
222
224
|
}
|
|
223
225
|
/**
|
|
224
226
|
* Get child tasks (direct children only)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskService.js","sourceRoot":"","sources":["../../src/services/TaskService.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"TaskService.js","sourceRoot":"","sources":["../../src/services/TaskService.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,6 +33,7 @@ export declare class PtySessionService {
|
|
|
33
33
|
notifyCompletionConfirm(taskId: number, targetStatus: string): void;
|
|
34
34
|
isUserStopped(taskId: number): boolean;
|
|
35
35
|
private notifyRunningTasksChange;
|
|
36
|
+
private sendEnterWithRetry;
|
|
36
37
|
startProcess(taskId: number, prompt: string, command?: string, model?: string, effort?: string): Promise<void>;
|
|
37
38
|
stopProcess(taskId: number): boolean;
|
|
38
39
|
listRunningTasks(): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PtySessionService.d.ts","sourceRoot":"","sources":["../../src/terminal/PtySessionService.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EAAE,MAAM,EAAoC,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAK7G,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAG1E,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAY9C;
|
|
1
|
+
{"version":3,"file":"PtySessionService.d.ts","sourceRoot":"","sources":["../../src/terminal/PtySessionService.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EAAE,MAAM,EAAoC,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAK7G,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAG1E,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAY9C;AAmBD,KAAK,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAC3F,KAAK,iBAAiB,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AA4BtD,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,kBAAkB,CAAkC;IAC5D,OAAO,CAAC,EAAE,CAAwB;IAClC,OAAO,CAAC,6BAA6B,CAA8B;IACnE,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,4BAA4B,CAA6C;IACjF,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,qBAAqB,CAA+B;IAC5D,OAAO,CAAC,mBAAmB,CAAgB;IAC3C,OAAO,CAAC,gBAAgB,CAAuB;gBAEnC,EAAE,CAAC,EAAE,cAAc,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,wBAAwB;IAU1E,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIjC,2BAA2B,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAO7D,0BAA0B,CAAC,QAAQ,EAAE,yBAAyB,GAAG,MAAM,IAAI;IAO3E,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAInE,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAItC,OAAO,CAAC,wBAAwB;IAQhC,OAAO,CAAC,kBAAkB;IAiCpB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,SAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4KnH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IA0BpC,gBAAgB,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE;IAIzD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAInC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,MAAM,IAAI;IAqBxE,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAkBvE,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;IAShF,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAIxD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9C,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;CAarC"}
|
|
@@ -64,6 +64,9 @@ function resolveClaudePath() {
|
|
|
64
64
|
const CLAUDE_BIN = resolveClaudePath();
|
|
65
65
|
const PROMPT_FALLBACK_DELAY_MS = 10000;
|
|
66
66
|
const PROMPT_ENTER_DELAY_MS = 200;
|
|
67
|
+
const ENTER_RETRY_INTERVAL_MS = 2000;
|
|
68
|
+
const MAX_ENTER_RETRIES = 3;
|
|
69
|
+
const CLAUDE_BUSY_SIGNAL = 'esc to interrupt';
|
|
67
70
|
const MAX_SNAPSHOT_BYTES = 500_000;
|
|
68
71
|
const MAX_COMPLETED_SNAPSHOTS = 10;
|
|
69
72
|
function hasWorkspaceTrustPrompt(text) {
|
|
@@ -116,6 +119,39 @@ class PtySessionService {
|
|
|
116
119
|
notifyRunningTasksChange() {
|
|
117
120
|
this.runningTasksChangeSubscribers.forEach((cb) => cb());
|
|
118
121
|
}
|
|
122
|
+
// Claude Code's TUI treats fast consecutive writes as a paste, which can absorb the
|
|
123
|
+
// final '\r' as a soft newline instead of submitting when the terminal is slow to
|
|
124
|
+
// render (e.g. right after startup). Watch the output for the busy signal and resend
|
|
125
|
+
// '\r' until it appears or we run out of retries.
|
|
126
|
+
sendEnterWithRetry(taskId, info) {
|
|
127
|
+
const ptyProcess = info.ptyProcess;
|
|
128
|
+
// Use the monotonic total-output counter rather than an index into outputBuffer:
|
|
129
|
+
// outputBuffer is truncated from the front once it exceeds MAX_SNAPSHOT_BYTES, which
|
|
130
|
+
// would desync a raw string-length mark recorded before the truncation happened.
|
|
131
|
+
const markLength = info.totalOutputLength;
|
|
132
|
+
let attempts = 0;
|
|
133
|
+
const scheduleCheck = () => {
|
|
134
|
+
info.enterWatchdogTimer = setTimeout(() => {
|
|
135
|
+
info.enterWatchdogTimer = null;
|
|
136
|
+
if (!this.sessions.has(taskId))
|
|
137
|
+
return;
|
|
138
|
+
const removedSoFar = info.totalOutputLength - info.outputBuffer.length;
|
|
139
|
+
const sinceMarkStart = Math.max(0, markLength - removedSoFar);
|
|
140
|
+
if (info.outputBuffer.slice(sinceMarkStart).includes(CLAUDE_BUSY_SIGNAL)) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (attempts >= MAX_ENTER_RETRIES) {
|
|
144
|
+
console.error(`[pty][enter-watchdog] taskId=${taskId} gave up resending Enter after ${MAX_ENTER_RETRIES} retries`);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
attempts += 1;
|
|
148
|
+
ptyProcess.write('\r');
|
|
149
|
+
scheduleCheck();
|
|
150
|
+
}, ENTER_RETRY_INTERVAL_MS);
|
|
151
|
+
};
|
|
152
|
+
ptyProcess.write('\r');
|
|
153
|
+
scheduleCheck();
|
|
154
|
+
}
|
|
119
155
|
async startProcess(taskId, prompt, command = 'run', model, effort) {
|
|
120
156
|
if (this.sessions.has(taskId)) {
|
|
121
157
|
throw new errors_1.ConflictError(`Process for taskId ${taskId} is already running`);
|
|
@@ -155,12 +191,14 @@ class PtySessionService {
|
|
|
155
191
|
ptyProcess,
|
|
156
192
|
startedAt: new Date(),
|
|
157
193
|
outputBuffer: '',
|
|
194
|
+
totalOutputLength: 0,
|
|
158
195
|
exitSubscribers: new Set(),
|
|
159
196
|
rawOutputSubscribers: new Set(),
|
|
160
197
|
outputUpdateSubscribers: new Set(),
|
|
161
198
|
runLogId: null,
|
|
162
199
|
pendingPrompt: prompt,
|
|
163
200
|
promptTimer: null,
|
|
201
|
+
enterWatchdogTimer: null,
|
|
164
202
|
workspaceTrustHandled: false,
|
|
165
203
|
lastEventsUpdate: 0,
|
|
166
204
|
};
|
|
@@ -178,13 +216,14 @@ class PtySessionService {
|
|
|
178
216
|
ptyProcess.write(fallbackPrompt);
|
|
179
217
|
setTimeout(() => {
|
|
180
218
|
if (this.sessions.has(taskId)) {
|
|
181
|
-
|
|
219
|
+
this.sendEnterWithRetry(taskId, info);
|
|
182
220
|
}
|
|
183
221
|
}, PROMPT_ENTER_DELAY_MS);
|
|
184
222
|
}
|
|
185
223
|
}, PROMPT_FALLBACK_DELAY_MS);
|
|
186
224
|
ptyProcess.onData((data) => {
|
|
187
225
|
info.outputBuffer += data;
|
|
226
|
+
info.totalOutputLength += data.length;
|
|
188
227
|
if (info.outputBuffer.length > MAX_SNAPSHOT_BYTES) {
|
|
189
228
|
info.outputBuffer = info.outputBuffer.slice(-MAX_SNAPSHOT_BYTES);
|
|
190
229
|
}
|
|
@@ -208,7 +247,7 @@ class PtySessionService {
|
|
|
208
247
|
ptyProcess.write(prompt);
|
|
209
248
|
setTimeout(() => {
|
|
210
249
|
if (this.sessions.has(taskId)) {
|
|
211
|
-
|
|
250
|
+
this.sendEnterWithRetry(taskId, info);
|
|
212
251
|
}
|
|
213
252
|
}, PROMPT_ENTER_DELAY_MS);
|
|
214
253
|
}
|
|
@@ -230,6 +269,10 @@ class PtySessionService {
|
|
|
230
269
|
clearTimeout(info.promptTimer);
|
|
231
270
|
info.promptTimer = null;
|
|
232
271
|
}
|
|
272
|
+
if (info.enterWatchdogTimer !== null) {
|
|
273
|
+
clearTimeout(info.enterWatchdogTimer);
|
|
274
|
+
info.enterWatchdogTimer = null;
|
|
275
|
+
}
|
|
233
276
|
info.pendingPrompt = null;
|
|
234
277
|
if (this.db && info.runLogId) {
|
|
235
278
|
const finishedAt = new Date().toISOString();
|
|
@@ -266,6 +309,10 @@ class PtySessionService {
|
|
|
266
309
|
clearTimeout(info.promptTimer);
|
|
267
310
|
info.promptTimer = null;
|
|
268
311
|
}
|
|
312
|
+
if (info.enterWatchdogTimer !== null) {
|
|
313
|
+
clearTimeout(info.enterWatchdogTimer);
|
|
314
|
+
info.enterWatchdogTimer = null;
|
|
315
|
+
}
|
|
269
316
|
info.pendingPrompt = null;
|
|
270
317
|
// Mark as user-stopped before emitting so synchronous subscribers (e.g. boardRoutes.ts)
|
|
271
318
|
// observe isUserStopped() === true and skip auto-advancing status on this done event.
|