@autopilot-harness/core 0.1.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 (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +8 -0
  3. package/dist/autopilot-ignore.d.ts +23 -0
  4. package/dist/autopilot-ignore.d.ts.map +1 -0
  5. package/dist/autopilot-ignore.js +271 -0
  6. package/dist/autopilot-ignore.js.map +1 -0
  7. package/dist/checklist-md.d.ts +62 -0
  8. package/dist/checklist-md.d.ts.map +1 -0
  9. package/dist/checklist-md.js +217 -0
  10. package/dist/checklist-md.js.map +1 -0
  11. package/dist/code-edit-detector.d.ts +10 -0
  12. package/dist/code-edit-detector.d.ts.map +1 -0
  13. package/dist/code-edit-detector.js +44 -0
  14. package/dist/code-edit-detector.js.map +1 -0
  15. package/dist/i18n-render.d.ts +3 -0
  16. package/dist/i18n-render.d.ts.map +1 -0
  17. package/dist/i18n-render.js +8 -0
  18. package/dist/i18n-render.js.map +1 -0
  19. package/dist/index.d.ts +20 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +20 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/list-tracks.d.ts +29 -0
  24. package/dist/list-tracks.d.ts.map +1 -0
  25. package/dist/list-tracks.js +232 -0
  26. package/dist/list-tracks.js.map +1 -0
  27. package/dist/migrate.d.ts +19 -0
  28. package/dist/migrate.d.ts.map +1 -0
  29. package/dist/migrate.js +101 -0
  30. package/dist/migrate.js.map +1 -0
  31. package/dist/phase-actions.d.ts +35 -0
  32. package/dist/phase-actions.d.ts.map +1 -0
  33. package/dist/phase-actions.js +480 -0
  34. package/dist/phase-actions.js.map +1 -0
  35. package/dist/project-config.d.ts +29 -0
  36. package/dist/project-config.d.ts.map +1 -0
  37. package/dist/project-config.js +301 -0
  38. package/dist/project-config.js.map +1 -0
  39. package/dist/project-path.d.ts +26 -0
  40. package/dist/project-path.d.ts.map +1 -0
  41. package/dist/project-path.js +104 -0
  42. package/dist/project-path.js.map +1 -0
  43. package/dist/review-engine.d.ts +263 -0
  44. package/dist/review-engine.d.ts.map +1 -0
  45. package/dist/review-engine.js +2273 -0
  46. package/dist/review-engine.js.map +1 -0
  47. package/dist/review-i18n.d.ts +29 -0
  48. package/dist/review-i18n.d.ts.map +1 -0
  49. package/dist/review-i18n.js +54 -0
  50. package/dist/review-i18n.js.map +1 -0
  51. package/dist/review-lenses.d.ts +13 -0
  52. package/dist/review-lenses.d.ts.map +1 -0
  53. package/dist/review-lenses.js +43 -0
  54. package/dist/review-lenses.js.map +1 -0
  55. package/dist/review-runtime.d.ts +12 -0
  56. package/dist/review-runtime.d.ts.map +1 -0
  57. package/dist/review-runtime.js +37 -0
  58. package/dist/review-runtime.js.map +1 -0
  59. package/dist/review-scope.d.ts +9 -0
  60. package/dist/review-scope.d.ts.map +1 -0
  61. package/dist/review-scope.js +92 -0
  62. package/dist/review-scope.js.map +1 -0
  63. package/dist/sqlite.d.ts +15 -0
  64. package/dist/sqlite.d.ts.map +1 -0
  65. package/dist/sqlite.js +38 -0
  66. package/dist/sqlite.js.map +1 -0
  67. package/dist/state-store.d.ts +277 -0
  68. package/dist/state-store.d.ts.map +1 -0
  69. package/dist/state-store.js +1091 -0
  70. package/dist/state-store.js.map +1 -0
  71. package/dist/track-slug.d.ts +4 -0
  72. package/dist/track-slug.d.ts.map +1 -0
  73. package/dist/track-slug.js +18 -0
  74. package/dist/track-slug.js.map +1 -0
  75. package/dist/transcript-followup.d.ts +59 -0
  76. package/dist/transcript-followup.d.ts.map +1 -0
  77. package/dist/transcript-followup.js +310 -0
  78. package/dist/transcript-followup.js.map +1 -0
  79. package/dist/trigger-parser.d.ts +54 -0
  80. package/dist/trigger-parser.d.ts.map +1 -0
  81. package/dist/trigger-parser.js +250 -0
  82. package/dist/trigger-parser.js.map +1 -0
  83. package/dist/verify-report.d.ts +52 -0
  84. package/dist/verify-report.d.ts.map +1 -0
  85. package/dist/verify-report.js +195 -0
  86. package/dist/verify-report.js.map +1 -0
  87. package/package.json +41 -0
@@ -0,0 +1,44 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { DEFAULT_AUTOPILOT_IGNORE_PATTERNS, isAutopilotIgnoredPath, loadAutopilotIgnorePatterns, toProjectRelativePath, } from "./autopilot-ignore.js";
3
+ /**
4
+ * Option A: untracked + gitignored → not product.
5
+ * Tracked files are not reported by `git check-ignore` without `--no-index`,
6
+ * so they still count (unless `.autopilotignore` excludes them).
7
+ */
8
+ function isUntrackedGitIgnored(projectRoot, relativePath) {
9
+ // Untrusted path fragment — never pass through a shell; reject NUL.
10
+ if (!relativePath || relativePath.includes("\0"))
11
+ return false;
12
+ try {
13
+ const r = spawnSync("git", ["check-ignore", "-q", "--", relativePath], {
14
+ cwd: projectRoot,
15
+ encoding: "utf8",
16
+ timeout: 5_000,
17
+ windowsHide: true,
18
+ shell: false,
19
+ });
20
+ return r.status === 0;
21
+ }
22
+ catch {
23
+ return false;
24
+ }
25
+ }
26
+ /**
27
+ * Returns true if the edited path counts as product code (triggers fix review).
28
+ * No extension allowlist — exclusions live in `.autopilotignore` (+ gitignore A).
29
+ */
30
+ export function isProductCodeEdit(filePath, opts) {
31
+ const relative = toProjectRelativePath(filePath, opts?.projectRoot);
32
+ if (!relative)
33
+ return false;
34
+ const patterns = opts?.projectRoot?.trim()
35
+ ? loadAutopilotIgnorePatterns(opts.projectRoot)
36
+ : DEFAULT_AUTOPILOT_IGNORE_PATTERNS;
37
+ if (isAutopilotIgnoredPath(relative, patterns))
38
+ return false;
39
+ const root = opts?.projectRoot?.trim();
40
+ if (root && isUntrackedGitIgnored(root, relative))
41
+ return false;
42
+ return true;
43
+ }
44
+ //# sourceMappingURL=code-edit-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-edit-detector.js","sourceRoot":"","sources":["../src/code-edit-detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EACL,iCAAiC,EACjC,sBAAsB,EACtB,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAO/B;;;;GAIG;AACH,SAAS,qBAAqB,CAC5B,WAAmB,EACnB,YAAoB;IAEpB,oEAAoE;IACpE,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/D,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,SAAS,CACjB,KAAK,EACL,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,EAC1C;YACE,GAAG,EAAE,WAAW;YAChB,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,KAAK;SACb,CACF,CAAC;QACF,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAgB,EAChB,IAA6B;IAE7B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACpE,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE5B,MAAM,QAAQ,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;QACxC,CAAC,CAAC,2BAA2B,CAAC,IAAI,CAAC,WAAW,CAAC;QAC/C,CAAC,CAAC,iCAAiC,CAAC;IAEtC,IAAI,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAE7D,MAAM,IAAI,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACvC,IAAI,IAAI,IAAI,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAEhE,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Render `{placeholder}` templates. */
2
+ export declare function renderTemplate(template: string, vars: Record<string, string | number | boolean | undefined>): string;
3
+ //# sourceMappingURL=i18n-render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n-render.d.ts","sourceRoot":"","sources":["../src/i18n-render.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAC1D,MAAM,CAKR"}
@@ -0,0 +1,8 @@
1
+ /** Render `{placeholder}` templates. */
2
+ export function renderTemplate(template, vars) {
3
+ return template.replace(/\{(\w+)\}/g, (_, key) => {
4
+ const v = vars[key];
5
+ return v === undefined || v === null ? "" : String(v);
6
+ });
7
+ }
8
+ //# sourceMappingURL=i18n-render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n-render.js","sourceRoot":"","sources":["../src/i18n-render.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,MAAM,UAAU,cAAc,CAC5B,QAAgB,EAChB,IAA2D;IAE3D,OAAO,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE;QACvD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,20 @@
1
+ export { parseChecklist, parseChecklistMarkdown, MAX_CHECKLIST_BYTES, countUnchecked, firstUnchecked, secondUnchecked, uncheckedAfter, effectiveReviewingItemId, resolveAdvanceTargets, parseAdvanceNextItemId, isLastUnchecked, itemsMissingSeparatorId, slugify, type ChecklistItem, type ChecklistMd, } from "./checklist-md.js";
2
+ export { evaluateVerifyReport, hasNoCodeCompletionEvidence, readVerifyReport, defaultVerifyReportPath, MAX_VERIFY_REPORT_BYTES, type VerifyLastReport, type VerifyCommandConfig, type VerifyCommandResult, type VerifyEvaluation, type VerifyOutcome, } from "./verify-report.js";
3
+ export { StateStore, getLatestSchemaVersion, shortConversationId, SESSION_TITLE_MAX_LENGTH, normalizeSessionTitle, sanitizeSessionDisplayText, type SessionRow, type ReviewChainRow, type Phase, type PausedReason, } from "./state-store.js";
4
+ export { migrate, getCurrentSchemaVersion, parseSchemaVersionValue, } from "./migrate.js";
5
+ export { ReviewEngine, applyOff, applyOn, applyResume, applyResumeReview, type ApplyResumeResult, type FollowupAction, type FollowupKind, type ReviewEngineConfig, type StopHandlerInput, } from "./review-engine.js";
6
+ export { loadProjectReviewConfig, normalizeProjectReviewConfig, DEFAULT_PROJECT_REVIEW_CONFIG, type ProjectReviewConfig, type ReviewScope, } from "./project-config.js";
7
+ export { ensureAmbientReviewSession, isChecklistExecuting, sessionReviewRunnable, } from "./review-scope.js";
8
+ export { createRenderFollowup, createResolveLens, type FollowupLocaleBundle, } from "./review-i18n.js";
9
+ export { createConfiguredReviewEngine } from "./review-runtime.js";
10
+ export { isSafeTrackSlug, MAX_SLUG_LEN } from "./track-slug.js";
11
+ export { applyRun, applyReplan, applyTrackPick, type ConcurrencyMode, type PhaseActionConfig, type PhaseActionResult, type PhaseActionOk, type PhaseActionFail, } from "./phase-actions.js";
12
+ export { CONFIRM_LENSES, getLens, lensNumberForRound, type ConfirmLens } from "./review-lenses.js";
13
+ export { readTranscriptTail, followupInFlight, automationFollowupPresent, pendingRedeliverAllowed, userQueryText, inFlightUserQuery, harnessTipBeforeTrailingTurnEnded, isDeliveryNoiseUserQuery, inRecoverDebounceWindow, sleepSyncMs, transcriptTipIsAssistant, latestUnresolvedTurnEndedError, latestUnresolvedTurnEndedErrorIndex, transcriptHasUnresolvedTurnEndedError, PENDING_REDELIVER_COOLDOWN_MS, RECOVER_DEBOUNCE_MS, type TranscriptEvent, } from "./transcript-followup.js";
14
+ export { isProductCodeEdit, type ProductCodeEditOptions } from "./code-edit-detector.js";
15
+ export { DEFAULT_AUTOPILOT_IGNORE_TEXT, autopilotIgnorePath, parseAutopilotIgnore, loadAutopilotIgnorePatterns, } from "./autopilot-ignore.js";
16
+ export { parseTrigger, firstSubstantiveLine, substantivePromptBody, isHarnessFollowupMessage, isRecoverOrStuckFollowupMessage, isRecoverFollowupMessage, isUserAbortText, USER_ABORT_MARKERS, DEFAULT_TRIGGERS, HARNESS_FOLLOWUP_PREFIXES, type TriggerEvent, type TriggerKind, type TriggerConfig, } from "./trigger-parser.js";
17
+ export { listTracks, isRunnableTrack, canEnterExecuting, type TrackSummary, } from "./list-tracks.js";
18
+ export { isRealpathInsideProject, isLexicallyInsideProject, normalizeProjectRoot, normalizeInProjectPlansDir, } from "./project-path.js";
19
+ export { renderTemplate } from "./i18n-render.js";
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ export { parseChecklist, parseChecklistMarkdown, MAX_CHECKLIST_BYTES, countUnchecked, firstUnchecked, secondUnchecked, uncheckedAfter, effectiveReviewingItemId, resolveAdvanceTargets, parseAdvanceNextItemId, isLastUnchecked, itemsMissingSeparatorId, slugify, } from "./checklist-md.js";
2
+ export { evaluateVerifyReport, hasNoCodeCompletionEvidence, readVerifyReport, defaultVerifyReportPath, MAX_VERIFY_REPORT_BYTES, } from "./verify-report.js";
3
+ export { StateStore, getLatestSchemaVersion, shortConversationId, SESSION_TITLE_MAX_LENGTH, normalizeSessionTitle, sanitizeSessionDisplayText, } from "./state-store.js";
4
+ export { migrate, getCurrentSchemaVersion, parseSchemaVersionValue, } from "./migrate.js";
5
+ export { ReviewEngine, applyOff, applyOn, applyResume, applyResumeReview, } from "./review-engine.js";
6
+ export { loadProjectReviewConfig, normalizeProjectReviewConfig, DEFAULT_PROJECT_REVIEW_CONFIG, } from "./project-config.js";
7
+ export { ensureAmbientReviewSession, isChecklistExecuting, sessionReviewRunnable, } from "./review-scope.js";
8
+ export { createRenderFollowup, createResolveLens, } from "./review-i18n.js";
9
+ export { createConfiguredReviewEngine } from "./review-runtime.js";
10
+ export { isSafeTrackSlug, MAX_SLUG_LEN } from "./track-slug.js";
11
+ export { applyRun, applyReplan, applyTrackPick, } from "./phase-actions.js";
12
+ export { CONFIRM_LENSES, getLens, lensNumberForRound } from "./review-lenses.js";
13
+ export { readTranscriptTail, followupInFlight, automationFollowupPresent, pendingRedeliverAllowed, userQueryText, inFlightUserQuery, harnessTipBeforeTrailingTurnEnded, isDeliveryNoiseUserQuery, inRecoverDebounceWindow, sleepSyncMs, transcriptTipIsAssistant, latestUnresolvedTurnEndedError, latestUnresolvedTurnEndedErrorIndex, transcriptHasUnresolvedTurnEndedError, PENDING_REDELIVER_COOLDOWN_MS, RECOVER_DEBOUNCE_MS, } from "./transcript-followup.js";
14
+ export { isProductCodeEdit } from "./code-edit-detector.js";
15
+ export { DEFAULT_AUTOPILOT_IGNORE_TEXT, autopilotIgnorePath, parseAutopilotIgnore, loadAutopilotIgnorePatterns, } from "./autopilot-ignore.js";
16
+ export { parseTrigger, firstSubstantiveLine, substantivePromptBody, isHarnessFollowupMessage, isRecoverOrStuckFollowupMessage, isRecoverFollowupMessage, isUserAbortText, USER_ABORT_MARKERS, DEFAULT_TRIGGERS, HARNESS_FOLLOWUP_PREFIXES, } from "./trigger-parser.js";
17
+ export { listTracks, isRunnableTrack, canEnterExecuting, } from "./list-tracks.js";
18
+ export { isRealpathInsideProject, isLexicallyInsideProject, normalizeProjectRoot, normalizeInProjectPlansDir, } from "./project-path.js";
19
+ export { renderTemplate } from "./i18n-render.js";
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,eAAe,EACf,cAAc,EACd,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,EACf,uBAAuB,EACvB,OAAO,GAGR,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,gBAAgB,EAChB,uBAAuB,EACvB,uBAAuB,GAMxB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,UAAU,EACV,sBAAsB,EACtB,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,0BAA0B,GAK3B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,OAAO,EACP,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,OAAO,EACP,WAAW,EACX,iBAAiB,GAMlB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,uBAAuB,EACvB,4BAA4B,EAC5B,6BAA6B,GAG9B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,oBAAoB,EACpB,iBAAiB,GAElB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEhE,OAAO,EACL,QAAQ,EACR,WAAW,EACX,cAAc,GAMf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,kBAAkB,EAAoB,MAAM,oBAAoB,CAAC;AAEnG,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,yBAAyB,EACzB,uBAAuB,EACvB,aAAa,EACb,iBAAiB,EACjB,iCAAiC,EACjC,wBAAwB,EACxB,uBAAuB,EACvB,WAAW,EACX,wBAAwB,EACxB,8BAA8B,EAC9B,mCAAmC,EACnC,qCAAqC,EACrC,6BAA6B,EAC7B,mBAAmB,GAEpB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,iBAAiB,EAA+B,MAAM,yBAAyB,CAAC;AAEzF,OAAO,EACL,6BAA6B,EAC7B,mBAAmB,EACnB,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,EACxB,+BAA+B,EAC/B,wBAAwB,EACxB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,yBAAyB,GAI1B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,UAAU,EACV,eAAe,EACf,iBAAiB,GAElB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { Phase, StateStore } from "./state-store.js";
2
+ export { isLexicallyInsideProject, isRealpathInsideProject, normalizeInProjectPlansDir, normalizeProjectRoot, } from "./project-path.js";
3
+ export interface TrackSummary {
4
+ slug: string;
5
+ title: string;
6
+ phase: Phase;
7
+ paused: boolean;
8
+ pausedReason?: "stuck" | "repeated_errors" | "human_gate";
9
+ checklistTotal: number;
10
+ checklistDone: number;
11
+ planPath: string;
12
+ updatedAt: string;
13
+ }
14
+ export declare function isRunnableTrack(t: TrackSummary): boolean;
15
+ export declare function listTracks(root: string, store?: StateStore, filter?: "runnable" | "planning" | "all", plansDir?: string): TrackSummary[];
16
+ /** RUN gate: need concrete slug, in-project checklist with ≥1 unchecked, not paused. */
17
+ export declare function canEnterExecuting(options: {
18
+ slug: string | undefined;
19
+ checklistPath: string;
20
+ paused: boolean;
21
+ /** Required — refuse checklist paths whose realpath escapes the project. */
22
+ projectRoot: string;
23
+ }): {
24
+ ok: true;
25
+ } | {
26
+ ok: false;
27
+ reason: string;
28
+ };
29
+ //# sourceMappingURL=list-tracks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-tracks.d.ts","sourceRoot":"","sources":["../src/list-tracks.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG1D,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,GAAG,iBAAiB,GAAG,YAAY,CAAC;IAC1D,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO,CAUxD;AAmFD,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,UAAU,EAClB,MAAM,GAAE,UAAU,GAAG,UAAU,GAAG,KAAa,EAC/C,QAAQ,SAAU,GACjB,YAAY,EAAE,CAoGhB;AAED,wFAAwF;AACxF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CA8B/C"}
@@ -0,0 +1,232 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { countUnchecked, parseChecklist, } from "./checklist-md.js";
4
+ import { isRealpathInsideProject, normalizeInProjectPlansDir, normalizeProjectRoot, } from "./project-path.js";
5
+ import { isSafeTrackSlug } from "./track-slug.js";
6
+ export { isLexicallyInsideProject, isRealpathInsideProject, normalizeInProjectPlansDir, normalizeProjectRoot, } from "./project-path.js";
7
+ export function isRunnableTrack(t) {
8
+ if (t.paused)
9
+ return false;
10
+ const unchecked = t.checklistTotal - t.checklistDone;
11
+ if (unchecked <= 0)
12
+ return false;
13
+ return (t.phase === "planning" ||
14
+ t.phase === "executing" ||
15
+ t.phase === "idle" ||
16
+ t.phase === "done");
17
+ }
18
+ function readPlansDir(root, plansDir = "plans") {
19
+ // Refuse symlink / escaped plansDir — open(path.join(root, plans, …)) follows
20
+ // intermediate directory symlinks and would otherwise read files outside the project.
21
+ // root must already be normalizeProjectRoot'd by listTracks.
22
+ if (typeof plansDir !== "string" ||
23
+ !root ||
24
+ root.includes("\0") ||
25
+ plansDir.includes("\0")) {
26
+ return [];
27
+ }
28
+ const dir = path.join(root, plansDir);
29
+ try {
30
+ const lst = fs.lstatSync(dir);
31
+ if (lst.isSymbolicLink() || !lst.isDirectory())
32
+ return [];
33
+ if (!isRealpathInsideProject(root, dir))
34
+ return [];
35
+ }
36
+ catch {
37
+ return [];
38
+ }
39
+ const names = fs
40
+ .readdirSync(dir, { withFileTypes: true })
41
+ .filter((d) => d.isDirectory() &&
42
+ !d.isSymbolicLink() &&
43
+ isSafeTrackSlug(d.name))
44
+ .map((d) => d.name);
45
+ // Re-check after readdir — TOCTOU if plans was swapped for an escaping symlink.
46
+ try {
47
+ const lst = fs.lstatSync(dir);
48
+ if (lst.isSymbolicLink() || !lst.isDirectory())
49
+ return [];
50
+ if (!isRealpathInsideProject(root, dir))
51
+ return [];
52
+ }
53
+ catch {
54
+ return [];
55
+ }
56
+ return names;
57
+ }
58
+ function titleFromPlan(planPath, slug, projectRoot) {
59
+ // Untrusted plans/*/plan.md — refuse symlink follow / oversized read (listing OOM).
60
+ if (!planPath || planPath.includes("\0"))
61
+ return slug;
62
+ const root = normalizeProjectRoot(projectRoot);
63
+ if (!root)
64
+ return slug;
65
+ const maxBytes = 65_536;
66
+ try {
67
+ const nofollow = typeof fs.constants.O_NOFOLLOW === "number" ? fs.constants.O_NOFOLLOW : 0;
68
+ if (nofollow === 0) {
69
+ const lst = fs.lstatSync(planPath);
70
+ if (lst.isSymbolicLink() || !lst.isFile())
71
+ return slug;
72
+ }
73
+ const fd = fs.openSync(planPath, fs.constants.O_RDONLY | nofollow);
74
+ try {
75
+ const st = fs.fstatSync(fd);
76
+ if (!st.isFile() || st.size <= 0)
77
+ return slug;
78
+ // Bind fd to path identity always (not only when O_NOFOLLOW is missing).
79
+ const lst = fs.lstatSync(planPath);
80
+ if (lst.isSymbolicLink() || !lst.isFile())
81
+ return slug;
82
+ if (lst.ino !== st.ino || lst.dev !== st.dev)
83
+ return slug;
84
+ // Re-check containment after open (same intermediate-dir TOCTOU as checklist).
85
+ if (!isRealpathInsideProject(root, planPath))
86
+ return slug;
87
+ const len = Math.min(st.size, maxBytes);
88
+ const buf = Buffer.alloc(len);
89
+ const n = fs.readSync(fd, buf, 0, len, 0);
90
+ const first = buf.subarray(0, n).toString("utf8").split(/\r?\n/)[0] ?? "";
91
+ const m = first.match(/^#\s+(.+)/);
92
+ return m?.[1]?.trim() ?? slug;
93
+ }
94
+ finally {
95
+ fs.closeSync(fd);
96
+ }
97
+ }
98
+ catch {
99
+ return slug;
100
+ }
101
+ }
102
+ export function listTracks(root, store, filter = "all", plansDir = "plans") {
103
+ // Trim before join/resolve — padded absolute roots become cwd-relative otherwise.
104
+ const normalized = normalizeProjectRoot(root);
105
+ if (!normalized)
106
+ return [];
107
+ root = normalized;
108
+ const safePlans = normalizeInProjectPlansDir(root, plansDir);
109
+ if (!safePlans)
110
+ return [];
111
+ plansDir = safePlans;
112
+ const slugs = readPlansDir(root, plansDir);
113
+ const tracks = [];
114
+ for (const slug of slugs) {
115
+ const trackDir = path.join(root, plansDir, slug);
116
+ // Slug dir must stay a real in-project directory (not swapped for a symlink).
117
+ try {
118
+ const lst = fs.lstatSync(trackDir);
119
+ if (lst.isSymbolicLink() || !lst.isDirectory())
120
+ continue;
121
+ if (!isRealpathInsideProject(root, trackDir))
122
+ continue;
123
+ }
124
+ catch {
125
+ continue;
126
+ }
127
+ const planPath = path.join(trackDir, "plan.md");
128
+ const checklistPath = path.join(trackDir, "checklist.md");
129
+ let checklistTotal = 0;
130
+ let checklistDone = 0;
131
+ const checklistInProject = isRealpathInsideProject(root, checklistPath);
132
+ const planInProject = isRealpathInsideProject(root, planPath);
133
+ if (checklistInProject) {
134
+ try {
135
+ const cl = parseChecklist(checklistPath, { projectRoot: root });
136
+ checklistTotal = cl.items.length;
137
+ checklistDone = cl.items.filter((i) => i.checked).length;
138
+ }
139
+ catch {
140
+ // Symlink / unreadable checklist — list track without item counts.
141
+ }
142
+ }
143
+ else if (!planInProject) {
144
+ continue;
145
+ }
146
+ let phase = "idle";
147
+ let paused = false;
148
+ let pausedReason;
149
+ let updatedAt = new Date(0).toISOString();
150
+ if (store) {
151
+ const sessions = store.db
152
+ .prepare(`SELECT * FROM sessions WHERE track_id = ? ORDER BY last_active_at DESC LIMIT 1`)
153
+ .all(slug);
154
+ const latest = sessions[0];
155
+ if (latest) {
156
+ phase = latest.phase;
157
+ paused = latest.paused === 1;
158
+ if (latest.paused_reason === "stuck" ||
159
+ latest.paused_reason === "repeated_errors" ||
160
+ latest.paused_reason === "human_gate") {
161
+ pausedReason = latest.paused_reason;
162
+ }
163
+ updatedAt = latest.last_active_at;
164
+ }
165
+ else {
166
+ if (checklistTotal > 0 && checklistDone === checklistTotal) {
167
+ phase = "done";
168
+ }
169
+ else if (checklistTotal - checklistDone > 0 && planInProject) {
170
+ phase = "idle";
171
+ }
172
+ }
173
+ }
174
+ else {
175
+ if (checklistTotal > 0 && checklistDone === checklistTotal) {
176
+ phase = "done";
177
+ }
178
+ else if (checklistTotal - checklistDone > 0) {
179
+ phase = "idle";
180
+ }
181
+ }
182
+ tracks.push({
183
+ slug,
184
+ title: planInProject ? titleFromPlan(planPath, slug, root) : slug,
185
+ phase,
186
+ paused,
187
+ pausedReason,
188
+ checklistTotal,
189
+ checklistDone,
190
+ planPath,
191
+ updatedAt,
192
+ });
193
+ }
194
+ if (filter === "all")
195
+ return tracks;
196
+ if (filter === "planning") {
197
+ return tracks.filter((t) => t.phase === "planning");
198
+ }
199
+ return tracks.filter(isRunnableTrack);
200
+ }
201
+ /** RUN gate: need concrete slug, in-project checklist with ≥1 unchecked, not paused. */
202
+ export function canEnterExecuting(options) {
203
+ const { slug, checklistPath, paused, projectRoot } = options;
204
+ if (!slug || slug === "_pending") {
205
+ return { ok: false, reason: "no track slug" };
206
+ }
207
+ const root = normalizeProjectRoot(projectRoot);
208
+ if (!root) {
209
+ return { ok: false, reason: "invalid project root" };
210
+ }
211
+ if (!checklistPath || !fs.existsSync(checklistPath)) {
212
+ return { ok: false, reason: "checklist missing" };
213
+ }
214
+ if (!isRealpathInsideProject(root, checklistPath)) {
215
+ return { ok: false, reason: "checklist outside project" };
216
+ }
217
+ let unchecked = 0;
218
+ try {
219
+ unchecked = countUnchecked(parseChecklist(checklistPath, { projectRoot: root }));
220
+ }
221
+ catch {
222
+ return { ok: false, reason: "checklist unreadable" };
223
+ }
224
+ if (unchecked < 1) {
225
+ return { ok: false, reason: "no unchecked items" };
226
+ }
227
+ if (paused) {
228
+ return { ok: false, reason: "session paused" };
229
+ }
230
+ return { ok: true };
231
+ }
232
+ //# sourceMappingURL=list-tracks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-tracks.js","sourceRoot":"","sources":["../src/list-tracks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { SqlDatabase } from "./sqlite.js";
2
+ export declare function readMigrationSql(version: number): string;
3
+ /**
4
+ * Latest schema = highest contiguous version from 001 that `readMigrationSql`
5
+ * can resolve (not a hardcoded constant). Stops before a missing/ambiguous
6
+ * file so migrate never claims a ceiling it cannot apply (e.g. stray
7
+ * `099_*.sql` or two `003_*.sql` in one dir).
8
+ *
9
+ * Package layout: `../migrations` is git-tracked SQL next to `dist/`, so a
10
+ * build that includes this scanner sees new files without bumping a constant —
11
+ * but the scanner itself must be in the running build (cli `build` compiles
12
+ * core first).
13
+ */
14
+ export declare function getLatestSchemaVersion(): number;
15
+ /** Non-finite / non-integer / negative meta must not be treated as "already latest". */
16
+ export declare function parseSchemaVersionValue(raw: unknown): number;
17
+ export declare function getCurrentSchemaVersion(db: SqlDatabase): number;
18
+ export declare function migrate(db: SqlDatabase): number;
19
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAa/C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAiBxD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAc/C;AAED,wFAAwF;AACxF,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAQ5D;AAED,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,WAAW,GAAG,MAAM,CAW/D;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,WAAW,GAAG,MAAM,CAqB/C"}
@@ -0,0 +1,101 @@
1
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ const __dirname = dirname(fileURLToPath(import.meta.url));
5
+ function migrationDirs() {
6
+ // Package layout: packages/core/{src,dist}/../migrations
7
+ // Vendor layout: .autopilot/bin/vendor/migrations (beside runtime.mjs)
8
+ return [
9
+ join(__dirname, "..", "migrations"),
10
+ join(__dirname, "migrations"),
11
+ ];
12
+ }
13
+ export function readMigrationSql(version) {
14
+ const prefix = `${String(version).padStart(3, "0")}_`;
15
+ for (const dir of migrationDirs()) {
16
+ if (!existsSync(dir))
17
+ continue;
18
+ const matches = readdirSync(dir).filter((f) => f.startsWith(prefix) && f.endsWith(".sql"));
19
+ if (matches.length === 1) {
20
+ return readFileSync(join(dir, matches[0]), "utf8");
21
+ }
22
+ if (matches.length > 1) {
23
+ throw new Error(`Ambiguous migration SQL for version ${version}: ${matches.join(", ")}`);
24
+ }
25
+ }
26
+ throw new Error(`Missing migration SQL for version ${version}`);
27
+ }
28
+ /**
29
+ * Latest schema = highest contiguous version from 001 that `readMigrationSql`
30
+ * can resolve (not a hardcoded constant). Stops before a missing/ambiguous
31
+ * file so migrate never claims a ceiling it cannot apply (e.g. stray
32
+ * `099_*.sql` or two `003_*.sql` in one dir).
33
+ *
34
+ * Package layout: `../migrations` is git-tracked SQL next to `dist/`, so a
35
+ * build that includes this scanner sees new files without bumping a constant —
36
+ * but the scanner itself must be in the running build (cli `build` compiles
37
+ * core first).
38
+ */
39
+ export function getLatestSchemaVersion() {
40
+ let latest = 0;
41
+ for (let v = 1; v <= 999; v++) {
42
+ try {
43
+ readMigrationSql(v);
44
+ }
45
+ catch {
46
+ break;
47
+ }
48
+ latest = v;
49
+ }
50
+ if (latest < 1) {
51
+ throw new Error("No migration SQL found (expected NNN_*.sql)");
52
+ }
53
+ return latest;
54
+ }
55
+ /** Non-finite / non-integer / negative meta must not be treated as "already latest". */
56
+ export function parseSchemaVersionValue(raw) {
57
+ if (raw == null)
58
+ return 0;
59
+ // Require a full integer token — parseInt("2abc")/("2.9") would wrongly yield 2.
60
+ const s = String(raw).trim();
61
+ if (!/^\d+$/.test(s))
62
+ return 0;
63
+ const n = Number.parseInt(s, 10);
64
+ if (!Number.isFinite(n))
65
+ return 0;
66
+ return n;
67
+ }
68
+ export function getCurrentSchemaVersion(db) {
69
+ db.exec(`
70
+ CREATE TABLE IF NOT EXISTS _schema_meta (
71
+ key TEXT PRIMARY KEY,
72
+ value TEXT NOT NULL
73
+ );
74
+ `);
75
+ const row = db
76
+ .prepare("SELECT value FROM _schema_meta WHERE key = 'schema_version'")
77
+ .get();
78
+ return parseSchemaVersionValue(row?.value);
79
+ }
80
+ export function migrate(db) {
81
+ const current = getCurrentSchemaVersion(db);
82
+ const latest = getLatestSchemaVersion();
83
+ if (current >= latest) {
84
+ return current;
85
+ }
86
+ for (let v = current + 1; v <= latest; v++) {
87
+ const sql = readMigrationSql(v);
88
+ db.exec("BEGIN");
89
+ try {
90
+ db.exec(sql);
91
+ db.prepare("INSERT OR REPLACE INTO _schema_meta (key, value) VALUES ('schema_version', ?)").run(String(v));
92
+ db.exec("COMMIT");
93
+ }
94
+ catch (err) {
95
+ db.exec("ROLLBACK");
96
+ throw err;
97
+ }
98
+ }
99
+ return latest;
100
+ }
101
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { isRunnableTrack, type TrackSummary } from "./list-tracks.js";
2
+ import type { SessionRow, StateStore } from "./state-store.js";
3
+ export type ConcurrencyMode = "one_executor" | "worktree_per_session";
4
+ export interface PhaseActionConfig {
5
+ concurrencyMode?: ConcurrencyMode;
6
+ plansDir?: string;
7
+ }
8
+ export type PhaseActionOk = {
9
+ ok: true;
10
+ session: SessionRow;
11
+ };
12
+ export type PhaseActionFail = {
13
+ ok: false;
14
+ userMessage: string;
15
+ needPick?: boolean;
16
+ candidates?: TrackSummary[];
17
+ };
18
+ export type PhaseActionResult = PhaseActionOk | PhaseActionFail;
19
+ export { isSafeTrackSlug } from "./track-slug.js";
20
+ /** Enter executing for a concrete track (RUN gate). */
21
+ export declare function applyRun(store: StateStore, conversationId: string, projectRoot: string, opts?: {
22
+ slug?: string;
23
+ config?: PhaseActionConfig;
24
+ }): PhaseActionResult;
25
+ /** REPLAN: back to planning; reset review chain; keep track + checklist file. */
26
+ export declare function applyReplan(store: StateStore, conversationId: string, projectRoot: string, opts?: {
27
+ slug?: string;
28
+ config?: PhaseActionConfig;
29
+ }): PhaseActionResult;
30
+ /** Resolve pending track pick (digit or slug) then apply run/replan. */
31
+ export declare function applyTrackPick(store: StateStore, conversationId: string, projectRoot: string, pick: string, opts?: {
32
+ config?: PhaseActionConfig;
33
+ }): PhaseActionResult;
34
+ export { isRunnableTrack };
35
+ //# sourceMappingURL=phase-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase-actions.d.ts","sourceRoot":"","sources":["../src/phase-actions.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,eAAe,EAEf,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAQ1B,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG/D,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,sBAAsB,CAAC;AAEtE,MAAM,WAAW,iBAAiB;IAChC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,aAAa,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAAC;AAC9D,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,KAAK,CAAC;IACV,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,eAAe,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAoOlD,uDAAuD;AACvD,wBAAgB,QAAQ,CACtB,KAAK,EAAE,UAAU,EACjB,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;IACL,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B,GACA,iBAAiB,CA6JnB;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CACzB,KAAK,EAAE,UAAU,EACjB,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAAE,GACnD,iBAAiB,CAsFnB;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAC5B,KAAK,EAAE,UAAU,EACjB,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAAE,GACpC,iBAAiB,CAqGnB;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}