agentrinse 0.0.0 → 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 (125) hide show
  1. package/README.md +128 -83
  2. package/dist/cli.js +2 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/apply.d.ts +6 -0
  5. package/dist/commands/apply.d.ts.map +1 -1
  6. package/dist/commands/apply.js +37 -13
  7. package/dist/commands/apply.js.map +1 -1
  8. package/dist/commands/audit.d.ts +7 -1
  9. package/dist/commands/audit.d.ts.map +1 -1
  10. package/dist/commands/audit.js +103 -12
  11. package/dist/commands/audit.js.map +1 -1
  12. package/dist/commands/completion.d.ts +4 -0
  13. package/dist/commands/completion.d.ts.map +1 -0
  14. package/dist/commands/completion.js +94 -0
  15. package/dist/commands/completion.js.map +1 -0
  16. package/dist/commands/config.d.ts +17 -0
  17. package/dist/commands/config.d.ts.map +1 -0
  18. package/dist/commands/config.js +41 -0
  19. package/dist/commands/config.js.map +1 -0
  20. package/dist/commands/doctor.d.ts +28 -0
  21. package/dist/commands/doctor.d.ts.map +1 -0
  22. package/dist/commands/doctor.js +582 -0
  23. package/dist/commands/doctor.js.map +1 -0
  24. package/dist/commands/history.d.ts +15 -0
  25. package/dist/commands/history.d.ts.map +1 -0
  26. package/dist/commands/history.js +30 -0
  27. package/dist/commands/history.js.map +1 -0
  28. package/dist/commands/lock.d.ts +21 -0
  29. package/dist/commands/lock.d.ts.map +1 -0
  30. package/dist/commands/lock.js +43 -0
  31. package/dist/commands/lock.js.map +1 -0
  32. package/dist/commands/plan.d.ts +2 -0
  33. package/dist/commands/plan.d.ts.map +1 -1
  34. package/dist/commands/plan.js +9 -2
  35. package/dist/commands/plan.js.map +1 -1
  36. package/dist/commands/show.d.ts +20 -0
  37. package/dist/commands/show.d.ts.map +1 -0
  38. package/dist/commands/show.js +54 -0
  39. package/dist/commands/show.js.map +1 -0
  40. package/dist/config/load.d.ts +6 -0
  41. package/dist/config/load.d.ts.map +1 -1
  42. package/dist/config/load.js +25 -0
  43. package/dist/config/load.js.map +1 -1
  44. package/dist/config/path.d.ts +5 -0
  45. package/dist/config/path.d.ts.map +1 -0
  46. package/dist/config/path.js +13 -0
  47. package/dist/config/path.js.map +1 -0
  48. package/dist/contracts/doctor.d.ts +35 -0
  49. package/dist/contracts/doctor.d.ts.map +1 -0
  50. package/dist/contracts/doctor.js +15 -0
  51. package/dist/contracts/doctor.js.map +1 -0
  52. package/dist/contracts/output.d.ts +50 -0
  53. package/dist/contracts/output.d.ts.map +1 -0
  54. package/dist/contracts/output.js +23 -0
  55. package/dist/contracts/output.js.map +1 -0
  56. package/dist/contracts/run.d.ts +2 -0
  57. package/dist/contracts/run.d.ts.map +1 -1
  58. package/dist/contracts/run.js +1 -1
  59. package/dist/contracts/run.js.map +1 -1
  60. package/dist/core/apply.d.ts +1 -0
  61. package/dist/core/apply.d.ts.map +1 -1
  62. package/dist/core/apply.js +46 -3
  63. package/dist/core/apply.js.map +1 -1
  64. package/dist/core/audit.d.ts +21 -0
  65. package/dist/core/audit.d.ts.map +1 -1
  66. package/dist/core/audit.js +31 -1
  67. package/dist/core/audit.js.map +1 -1
  68. package/dist/core/duration.d.ts +2 -0
  69. package/dist/core/duration.d.ts.map +1 -0
  70. package/dist/core/duration.js +21 -0
  71. package/dist/core/duration.js.map +1 -0
  72. package/dist/core/interruption.d.ts +5 -0
  73. package/dist/core/interruption.d.ts.map +1 -0
  74. package/dist/core/interruption.js +5 -0
  75. package/dist/core/interruption.js.map +1 -0
  76. package/dist/core/process-identity.d.ts +24 -0
  77. package/dist/core/process-identity.d.ts.map +1 -0
  78. package/dist/core/process-identity.js +104 -0
  79. package/dist/core/process-identity.js.map +1 -0
  80. package/dist/core/redaction.d.ts +4 -0
  81. package/dist/core/redaction.d.ts.map +1 -0
  82. package/dist/core/redaction.js +91 -0
  83. package/dist/core/redaction.js.map +1 -0
  84. package/dist/core/safety.d.ts +8 -0
  85. package/dist/core/safety.d.ts.map +1 -1
  86. package/dist/core/safety.js +29 -1
  87. package/dist/core/safety.js.map +1 -1
  88. package/dist/index.d.ts +3 -1
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +2 -0
  91. package/dist/index.js.map +1 -1
  92. package/dist/machine-output.d.ts +21 -0
  93. package/dist/machine-output.d.ts.map +1 -0
  94. package/dist/machine-output.js +32 -0
  95. package/dist/machine-output.js.map +1 -0
  96. package/dist/main.d.ts.map +1 -1
  97. package/dist/main.js +194 -7
  98. package/dist/main.js.map +1 -1
  99. package/dist/state/json-file.d.ts +6 -1
  100. package/dist/state/json-file.d.ts.map +1 -1
  101. package/dist/state/json-file.js +34 -3
  102. package/dist/state/json-file.js.map +1 -1
  103. package/dist/state/layout.d.ts +2 -0
  104. package/dist/state/layout.d.ts.map +1 -1
  105. package/dist/state/layout.js +2 -0
  106. package/dist/state/layout.js.map +1 -1
  107. package/dist/state/lock.d.ts +54 -1
  108. package/dist/state/lock.d.ts.map +1 -1
  109. package/dist/state/lock.js +237 -33
  110. package/dist/state/lock.js.map +1 -1
  111. package/dist/state/records.d.ts +5 -0
  112. package/dist/state/records.d.ts.map +1 -0
  113. package/dist/state/records.js +35 -0
  114. package/dist/state/records.js.map +1 -0
  115. package/dist/state/run-journal.d.ts +3 -1
  116. package/dist/state/run-journal.d.ts.map +1 -1
  117. package/dist/state/run-journal.js +15 -4
  118. package/dist/state/run-journal.js.map +1 -1
  119. package/dist/version.d.ts +1 -1
  120. package/dist/version.js +1 -1
  121. package/package.json +3 -2
  122. package/schemas/command-envelope.schema.json +78 -0
  123. package/schemas/command-event.schema.json +36 -0
  124. package/schemas/doctor.schema.json +51 -0
  125. package/schemas/run.schema.json +1 -1
package/dist/index.d.ts CHANGED
@@ -1,9 +1,11 @@
1
1
  export { agentRinseConfigSchema, adapterIdSchema, type AdapterId, type AgentRinseConfig, } from "./config/schema.js";
2
2
  export { artifactNameSchema, artifactRemoveActionSchema, pathIdentitySchema, plannedActionSchema, type ArtifactName, type ArtifactRemoveAction, type PathIdentity, type PlannedAction, } from "./contracts/action.js";
3
+ export { doctorCheckSchema, doctorReportSchema, type DoctorCheck, type DoctorReport, } from "./contracts/doctor.js";
4
+ export { commandEnvelopeSchema, commandEnvelopeStatusSchema, commandEventSchema, type CommandEnvelope, type CommandEnvelopeStatus, type CommandEvent, } from "./contracts/output.js";
3
5
  export { cleanupPlanSchema, type CleanupPlan } from "./contracts/plan.js";
4
6
  export { auditReportSchema, type AdapterProbe, type AuditReport } from "./contracts/report.js";
5
7
  export { actionExecutionSchema, cleanupRunSchema, type ActionExecution, type CleanupRun, } from "./contracts/run.js";
6
- export { runAudit, type RunAuditOptions } from "./core/audit.js";
8
+ export { runAudit, type AuditProgressEvent, type RunAuditOptions } from "./core/audit.js";
7
9
  export { applyCleanupPlan, type ApplyCleanupPlanOptions, type ApplyResult } from "./core/apply.js";
8
10
  export { createCleanupPlan } from "./core/plan.js";
9
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,KAAK,SAAS,EACd,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC/F,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,UAAU,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,KAAK,SAAS,EACd,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,WAAW,EAChB,KAAK,YAAY,GAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,qBAAqB,EACrB,2BAA2B,EAC3B,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,YAAY,GAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC/F,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,UAAU,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,KAAK,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export { agentRinseConfigSchema, adapterIdSchema, } from "./config/schema.js";
2
2
  export { artifactNameSchema, artifactRemoveActionSchema, pathIdentitySchema, plannedActionSchema, } from "./contracts/action.js";
3
+ export { doctorCheckSchema, doctorReportSchema, } from "./contracts/doctor.js";
4
+ export { commandEnvelopeSchema, commandEnvelopeStatusSchema, commandEventSchema, } from "./contracts/output.js";
3
5
  export { cleanupPlanSchema } from "./contracts/plan.js";
4
6
  export { auditReportSchema } from "./contracts/report.js";
5
7
  export { actionExecutionSchema, cleanupRunSchema, } from "./contracts/run.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,eAAe,GAGhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,kBAAkB,EAClB,mBAAmB,GAKpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAoB,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAuC,MAAM,uBAAuB,CAAC;AAC/F,OAAO,EACL,qBAAqB,EACrB,gBAAgB,GAGjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAwB,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAkD,MAAM,iBAAiB,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,eAAe,GAGhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,kBAAkB,EAClB,mBAAmB,GAKpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,EACjB,kBAAkB,GAGnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,qBAAqB,EACrB,2BAA2B,EAC3B,kBAAkB,GAInB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAoB,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAuC,MAAM,uBAAuB,CAAC;AAC/F,OAAO,EACL,qBAAqB,EACrB,gBAAgB,GAGjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAiD,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAAE,gBAAgB,EAAkD,MAAM,iBAAiB,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type CommandEnvelope, type CommandEnvelopeStatus, type CommandEvent } from "./contracts/output.js";
2
+ import type { Diagnostic } from "./contracts/diagnostic.js";
3
+ export declare function createCommandEnvelope<T>(options: {
4
+ command: string;
5
+ startedAt: string;
6
+ completedAt: string;
7
+ status: CommandEnvelopeStatus;
8
+ data: T;
9
+ diagnostics?: Diagnostic[];
10
+ }): CommandEnvelope<T>;
11
+ export declare function createCommandEvent<T>(options: {
12
+ event: string;
13
+ timestamp: string;
14
+ command: string;
15
+ commandId: string;
16
+ sequence: number;
17
+ data?: T;
18
+ }): CommandEvent<T>;
19
+ export declare function jsonDocument(value: unknown): string;
20
+ export declare function ndjsonRecord(value: unknown): string;
21
+ //# sourceMappingURL=machine-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machine-output.d.ts","sourceRoot":"","sources":["../src/machine-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAG5D,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,OAAO,EAAE;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,EAAE,CAAC,CAAC;IACR,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5B,GAAG,eAAe,CAAC,CAAC,CAAC,CAWrB;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,EAAE;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;CACV,GAAG,YAAY,CAAC,CAAC,CAAC,CAUlB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEnD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEnD"}
@@ -0,0 +1,32 @@
1
+ import { commandEnvelopeSchema, commandEventSchema, } from "./contracts/output.js";
2
+ import { VERSION } from "./version.js";
3
+ export function createCommandEnvelope(options) {
4
+ return commandEnvelopeSchema.parse({
5
+ schemaVersion: 1,
6
+ command: options.command,
7
+ agentrinseVersion: VERSION,
8
+ startedAt: options.startedAt,
9
+ completedAt: options.completedAt,
10
+ status: options.status,
11
+ data: options.data,
12
+ diagnostics: options.diagnostics ?? [],
13
+ });
14
+ }
15
+ export function createCommandEvent(options) {
16
+ return commandEventSchema.parse({
17
+ schemaVersion: 1,
18
+ event: options.event,
19
+ timestamp: options.timestamp,
20
+ command: options.command,
21
+ commandId: options.commandId,
22
+ sequence: options.sequence,
23
+ ...(options.data === undefined ? {} : { data: options.data }),
24
+ });
25
+ }
26
+ export function jsonDocument(value) {
27
+ return `${JSON.stringify(value, null, 2)}\n`;
28
+ }
29
+ export function ndjsonRecord(value) {
30
+ return `${JSON.stringify(value)}\n`;
31
+ }
32
+ //# sourceMappingURL=machine-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machine-output.js","sourceRoot":"","sources":["../src/machine-output.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,kBAAkB,GAInB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,UAAU,qBAAqB,CAAI,OAOxC;IACC,OAAO,qBAAqB,CAAC,KAAK,CAAC;QACjC,aAAa,EAAE,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,iBAAiB,EAAE,OAAO;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;KACvC,CAAuB,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAI,OAOrC;IACC,OAAO,kBAAkB,CAAC,KAAK,CAAC;QAC9B,aAAa,EAAE,CAAC;QAChB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;KAC9D,CAAoB,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;AACtC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,YAAY,IAAI,OAAO,CA6DtC;AAED,wBAAsB,IAAI,CAAC,IAAI,WAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7D"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBpC,wBAAgB,YAAY,IAAI,OAAO,CAqRtC;AAED,wBAAsB,IAAI,CAAC,IAAI,WAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7D"}
package/dist/main.js CHANGED
@@ -1,8 +1,16 @@
1
1
  import { Command } from "commander";
2
+ import { homedir } from "node:os";
2
3
  import { executeAuditCommand } from "./commands/audit.js";
3
4
  import { renderAdapters } from "./commands/adapters.js";
4
5
  import { executeApplyCommand } from "./commands/apply.js";
6
+ import { executeConfigInitCommand, executeConfigPathCommand, executeConfigShowCommand, executeConfigValidateCommand, } from "./commands/config.js";
7
+ import { renderCompletion } from "./commands/completion.js";
8
+ import { executeDoctorCommand } from "./commands/doctor.js";
9
+ import { executeHistoryCommand } from "./commands/history.js";
10
+ import { executeLockRecoverCommand, executeLockStatusCommand } from "./commands/lock.js";
5
11
  import { executePlanCommand } from "./commands/plan.js";
12
+ import { executeShowPlanCommand, executeShowResourceCommand, executeShowRunCommand, } from "./commands/show.js";
13
+ import { CommandInterruptedError } from "./core/interruption.js";
6
14
  import { VERSION } from "./version.js";
7
15
  export function buildProgram() {
8
16
  const program = new Command()
@@ -12,13 +20,22 @@ export function buildProgram() {
12
20
  program
13
21
  .command("audit")
14
22
  .description("Inventory a home without mutating it.")
15
- .requiredOption("--home <path>", "home directory to audit")
23
+ .option("--home <path>", "home directory to audit")
16
24
  .option("--config <path>", "explicit JSON config")
17
25
  .option("--json", "emit the versioned JSON report", false)
26
+ .option("--ndjson", "stream versioned NDJSON events", false)
27
+ .option("--redact", "redact paths and identifiers in machine output", false)
18
28
  .option("--output <path>", "write the JSON report atomically")
29
+ .option("--state-dir <path>", "override the AgentRinse state directory")
19
30
  .action(async (options) => {
20
- const result = await executeAuditCommand(options);
21
- process.stdout.write(result.output);
31
+ const result = await executeAuditCommand({
32
+ ...options,
33
+ home: options.home ?? homedir(),
34
+ ...(options.ndjson ? { emit: (output) => process.stdout.write(output) } : {}),
35
+ });
36
+ if (result.output !== "") {
37
+ process.stdout.write(result.output);
38
+ }
22
39
  });
23
40
  program
24
41
  .command("plan")
@@ -26,6 +43,7 @@ export function buildProgram() {
26
43
  .requiredOption("--audit <path>", "saved audit JSON")
27
44
  .option("--config <path>", "explicit JSON config")
28
45
  .option("--output <path>", "write the plan atomically")
46
+ .option("--state-dir <path>", "override the AgentRinse state directory")
29
47
  .action(async (options) => {
30
48
  const result = await executePlanCommand(options);
31
49
  process.stdout.write(result.output);
@@ -39,10 +57,26 @@ export function buildProgram() {
39
57
  .option("--yes", "authorize non-interactive apply", false)
40
58
  .option("--json", "emit the versioned run journal", false)
41
59
  .action(async (options) => {
42
- const result = await executeApplyCommand(options);
43
- process.stdout.write(result.output);
44
- if (["failed", "partial"].includes(result.run.status)) {
45
- process.exitCode = 2;
60
+ const controller = new AbortController();
61
+ const interrupt = () => {
62
+ controller.abort(new CommandInterruptedError("interrupted by SIGINT"));
63
+ };
64
+ process.on("SIGINT", interrupt);
65
+ try {
66
+ const result = await executeApplyCommand({
67
+ ...options,
68
+ signal: controller.signal,
69
+ });
70
+ process.stdout.write(result.output);
71
+ if (result.run.status === "interrupted") {
72
+ process.exitCode = 130;
73
+ }
74
+ else if (["failed", "partial"].includes(result.run.status)) {
75
+ process.exitCode = 2;
76
+ }
77
+ }
78
+ finally {
79
+ process.removeListener("SIGINT", interrupt);
46
80
  }
47
81
  });
48
82
  program
@@ -51,6 +85,159 @@ export function buildProgram() {
51
85
  .action(() => {
52
86
  process.stdout.write(renderAdapters());
53
87
  });
88
+ program
89
+ .command("doctor")
90
+ .description("Diagnose platform, configuration, state, and optional integrations.")
91
+ .option("--home <path>", "home directory used for diagnostics")
92
+ .option("--config <path>", "explicit JSON config")
93
+ .option("--state-dir <path>", "override the AgentRinse state directory")
94
+ .option("--json", "emit the versioned JSON report", false)
95
+ .action(async (options) => {
96
+ const result = await executeDoctorCommand({
97
+ ...options,
98
+ home: options.home ?? homedir(),
99
+ });
100
+ process.stdout.write(result.output);
101
+ if (result.report.status === "error") {
102
+ process.exitCode = 1;
103
+ }
104
+ });
105
+ program
106
+ .command("completion <shell>")
107
+ .description("Generate shell completion for bash, zsh, or fish.")
108
+ .action((shell) => {
109
+ process.stdout.write(renderCompletion(shell));
110
+ });
111
+ const config = program.command("config").description("Inspect and initialize configuration.");
112
+ config
113
+ .command("path")
114
+ .description("Print the resolved configuration path.")
115
+ .option("--home <path>", "home directory used for default resolution")
116
+ .option("--config <path>", "explicit JSON config")
117
+ .action((options) => {
118
+ process.stdout.write(executeConfigPathCommand({
119
+ home: options.home ?? homedir(),
120
+ config: options.config,
121
+ }).output);
122
+ });
123
+ config
124
+ .command("init")
125
+ .description("Create a default configuration without overwriting.")
126
+ .option("--home <path>", "home directory used for default resolution")
127
+ .option("--config <path>", "explicit JSON config")
128
+ .action(async (options) => {
129
+ const result = await executeConfigInitCommand({
130
+ home: options.home ?? homedir(),
131
+ config: options.config,
132
+ });
133
+ process.stdout.write(result.output);
134
+ });
135
+ config
136
+ .command("show")
137
+ .description("Print the effective configuration.")
138
+ .option("--home <path>", "home directory used for default resolution")
139
+ .option("--config <path>", "explicit JSON config")
140
+ .action(async (options) => {
141
+ const result = await executeConfigShowCommand({
142
+ home: options.home ?? homedir(),
143
+ config: options.config,
144
+ });
145
+ process.stdout.write(result.output);
146
+ });
147
+ config
148
+ .command("validate")
149
+ .description("Validate an existing configuration file.")
150
+ .option("--home <path>", "home directory used for default resolution")
151
+ .option("--config <path>", "explicit JSON config")
152
+ .action(async (options) => {
153
+ const result = await executeConfigValidateCommand({
154
+ home: options.home ?? homedir(),
155
+ config: options.config,
156
+ });
157
+ process.stdout.write(result.output);
158
+ });
159
+ program
160
+ .command("history")
161
+ .description("List persisted cleanup runs.")
162
+ .option("--home <path>", "home directory used for state resolution")
163
+ .option("--state-dir <path>", "override the AgentRinse state directory")
164
+ .option("--since <duration>", "include runs newer than a duration such as 30d")
165
+ .option("--json", "emit JSON", false)
166
+ .action(async (options) => {
167
+ const result = await executeHistoryCommand({
168
+ ...options,
169
+ home: options.home ?? homedir(),
170
+ });
171
+ process.stdout.write(result.output);
172
+ });
173
+ const show = program.command("show").description("Inspect persisted AgentRinse records.");
174
+ show
175
+ .command("run <run-id-or-path>")
176
+ .description("Show one cleanup run.")
177
+ .option("--home <path>", "home directory used for state resolution")
178
+ .option("--state-dir <path>", "override the AgentRinse state directory")
179
+ .option("--json", "emit JSON", false)
180
+ .action(async (idOrPath, options) => {
181
+ const result = await executeShowRunCommand(idOrPath, {
182
+ ...options,
183
+ home: options.home ?? homedir(),
184
+ });
185
+ process.stdout.write(result.output);
186
+ });
187
+ show
188
+ .command("plan <plan-id-or-path>")
189
+ .description("Show one cleanup plan.")
190
+ .option("--home <path>", "home directory used for state resolution")
191
+ .option("--state-dir <path>", "override the AgentRinse state directory")
192
+ .option("--json", "emit JSON", false)
193
+ .action(async (idOrPath, options) => {
194
+ const result = await executeShowPlanCommand(idOrPath, {
195
+ ...options,
196
+ home: options.home ?? homedir(),
197
+ });
198
+ process.stdout.write(result.output);
199
+ });
200
+ show
201
+ .command("resource <resource-id>")
202
+ .description("Show the latest persisted resource finding.")
203
+ .option("--home <path>", "home directory used for state resolution")
204
+ .option("--state-dir <path>", "override the AgentRinse state directory")
205
+ .option("--json", "emit JSON", false)
206
+ .action(async (resourceId, options) => {
207
+ const result = await executeShowResourceCommand(resourceId, {
208
+ ...options,
209
+ home: options.home ?? homedir(),
210
+ });
211
+ process.stdout.write(result.output);
212
+ });
213
+ const lock = program.command("lock").description("Inspect and recover the apply lock.");
214
+ lock
215
+ .command("status")
216
+ .description("Inspect the apply lock and its recorded process identity.")
217
+ .option("--home <path>", "home directory used for state resolution")
218
+ .option("--state-dir <path>", "override the AgentRinse state directory")
219
+ .option("--json", "emit JSON", false)
220
+ .action(async (options) => {
221
+ const result = await executeLockStatusCommand({
222
+ ...options,
223
+ home: options.home ?? homedir(),
224
+ });
225
+ process.stdout.write(result.output);
226
+ });
227
+ lock
228
+ .command("recover")
229
+ .description("Remove a local lock only after proving its process identity is gone.")
230
+ .option("--home <path>", "home directory used for state resolution")
231
+ .option("--state-dir <path>", "override the AgentRinse state directory")
232
+ .option("--yes", "authorize recovery after inspecting the lock", false)
233
+ .option("--json", "emit JSON", false)
234
+ .action(async (options) => {
235
+ const result = await executeLockRecoverCommand({
236
+ ...options,
237
+ home: options.home ?? homedir(),
238
+ });
239
+ process.stdout.write(result.output);
240
+ });
54
241
  return program;
55
242
  }
56
243
  export async function main(argv = process.argv) {
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,9 @@
1
1
  export declare function readJsonFile(path: string): Promise<unknown>;
2
2
  export declare function syncDirectory(path: string): Promise<void>;
3
- export declare function writeJsonAtomic(path: string, value: unknown): Promise<void>;
3
+ export type JsonWriteOptions = {
4
+ privateDirectories?: string[];
5
+ };
6
+ export declare function ensurePrivateDirectory(directory: string): Promise<void>;
7
+ export declare function writeJsonAtomic(path: string, value: unknown, options?: JsonWriteOptions): Promise<void>;
8
+ export declare function writeJsonExclusive(path: string, value: unknown): Promise<void>;
4
9
  //# sourceMappingURL=json-file.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-file.d.ts","sourceRoot":"","sources":["../../src/state/json-file.ts"],"names":[],"mappings":"AAIA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEjE;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO/D;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBjF"}
1
+ {"version":3,"file":"json-file.d.ts","sourceRoot":"","sources":["../../src/state/json-file.ts"],"names":[],"mappings":"AAIA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEjE;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO/D;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B,CAAC;AAEF,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW7E;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBpF"}
@@ -1,4 +1,4 @@
1
- import { chmod, mkdir, open, readFile, rename, rm } from "node:fs/promises";
1
+ import { chmod, lstat, mkdir, open, readFile, rename, rm } from "node:fs/promises";
2
2
  import { dirname, join } from "node:path";
3
3
  import { randomUUID } from "node:crypto";
4
4
  export async function readJsonFile(path) {
@@ -13,10 +13,24 @@ export async function syncDirectory(path) {
13
13
  await handle.close();
14
14
  }
15
15
  }
16
- export async function writeJsonAtomic(path, value) {
17
- const directory = dirname(path);
16
+ export async function ensurePrivateDirectory(directory) {
18
17
  await mkdir(directory, { recursive: true, mode: 0o700 });
18
+ const stats = await lstat(directory);
19
+ if (!stats.isDirectory() || stats.isSymbolicLink()) {
20
+ throw new Error(`private state path is not a real directory: ${directory}`);
21
+ }
22
+ const uid = process.getuid?.();
23
+ if (uid !== undefined && stats.uid !== uid) {
24
+ throw new Error(`private state directory is not owned by the current user: ${directory}`);
25
+ }
19
26
  await chmod(directory, 0o700);
27
+ }
28
+ export async function writeJsonAtomic(path, value, options = {}) {
29
+ const directory = dirname(path);
30
+ for (const privateDirectory of new Set(options.privateDirectories ?? [])) {
31
+ await ensurePrivateDirectory(privateDirectory);
32
+ }
33
+ await mkdir(directory, { recursive: true, mode: 0o700 });
20
34
  const temporary = join(directory, `.${randomUUID()}.tmp`);
21
35
  const handle = await open(temporary, "wx", 0o600);
22
36
  try {
@@ -33,4 +47,21 @@ export async function writeJsonAtomic(path, value) {
33
47
  throw error;
34
48
  }
35
49
  }
50
+ export async function writeJsonExclusive(path, value) {
51
+ const directory = dirname(path);
52
+ await mkdir(directory, { recursive: true, mode: 0o700 });
53
+ const handle = await open(path, "wx", 0o600);
54
+ try {
55
+ await handle.writeFile(`${JSON.stringify(value, null, 2)}\n`, "utf8");
56
+ await handle.sync();
57
+ await handle.close();
58
+ await chmod(path, 0o600);
59
+ await syncDirectory(directory);
60
+ }
61
+ catch (error) {
62
+ await handle.close().catch(() => undefined);
63
+ await rm(path, { force: true }).catch(() => undefined);
64
+ throw error;
65
+ }
66
+ }
36
67
  //# sourceMappingURL=json-file.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-file.js","sourceRoot":"","sources":["../../src/state/json-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAY,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY;IAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,KAAc;IAChE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzD,MAAM,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAE9B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,UAAU,EAAE,MAAM,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAElD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtE,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC9B,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzB,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"json-file.js","sourceRoot":"","sources":["../../src/state/json-file.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,8 @@ export type StateEnvironment = {
3
3
  };
4
4
  export type StateLayout = {
5
5
  root: string;
6
+ audits: string;
7
+ plans: string;
6
8
  locks: string;
7
9
  runs: string;
8
10
  tombstones: string;
@@ -1 +1 @@
1
- {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/state/layout.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,EACjB,WAAW,GAAE,gBAA8B,GAC1C,MAAM,CAQR;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAQrD"}
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/state/layout.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,EACjB,WAAW,GAAE,gBAA8B,GAC1C,MAAM,CAQR;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAUrD"}
@@ -12,6 +12,8 @@ export function stateLayout(root) {
12
12
  const resolved = resolve(root);
13
13
  return {
14
14
  root: resolved,
15
+ audits: join(resolved, "audits"),
16
+ plans: join(resolved, "plans"),
15
17
  locks: join(resolved, "locks"),
16
18
  runs: join(resolved, "runs"),
17
19
  tombstones: join(resolved, "tombstones"),
@@ -1 +1 @@
1
- {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/state/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAa1C,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,QAAiB,EACjB,WAAW,GAAqB,OAAO,CAAC,GAAG;IAE3C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,WAAW,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QAC7C,OAAO,OAAO,CAAC,WAAW,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC9B,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC5B,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;KACzC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/state/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAe1C,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,QAAiB,EACjB,WAAW,GAAqB,OAAO,CAAC,GAAG;IAE3C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,WAAW,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QAC7C,OAAO,OAAO,CAAC,WAAW,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAChC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC9B,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC9B,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC5B,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;KACzC,CAAC;AACJ,CAAC"}
@@ -1,9 +1,62 @@
1
+ import { type ProcessIdentityInspection } from "../core/process-identity.js";
1
2
  export declare class LockHeldError extends Error {
2
3
  readonly name = "LockHeldError";
3
4
  }
5
+ export declare class LockRecoveryError extends Error {
6
+ readonly name = "LockRecoveryError";
7
+ }
4
8
  export type StateLock = {
5
9
  path: string;
6
10
  release(): Promise<void>;
7
11
  };
8
- export declare function acquireApplyLock(locksDirectory: string, planId: string): Promise<StateLock>;
12
+ export type ApplyLockOwner = {
13
+ token: string;
14
+ pid: number;
15
+ processStartIdentity?: string;
16
+ hostname: string;
17
+ command: string;
18
+ planId: string;
19
+ runId: string;
20
+ createdAt: string;
21
+ };
22
+ export type ApplyLockStatus = {
23
+ status: "absent";
24
+ path: string;
25
+ } | {
26
+ status: "malformed";
27
+ path: string;
28
+ reason: string;
29
+ } | {
30
+ status: "active";
31
+ path: string;
32
+ owner: ApplyLockOwner;
33
+ } | {
34
+ status: "stale";
35
+ path: string;
36
+ owner: ApplyLockOwner;
37
+ reason: string;
38
+ } | {
39
+ status: "remote";
40
+ path: string;
41
+ owner: ApplyLockOwner;
42
+ reason: string;
43
+ } | {
44
+ status: "unknown";
45
+ path: string;
46
+ owner: ApplyLockOwner;
47
+ reason: string;
48
+ };
49
+ export type AcquireApplyLockOptions = {
50
+ planId: string;
51
+ runId: string;
52
+ command: string;
53
+ };
54
+ export type LockInspectionDependencies = {
55
+ currentHostname?: () => string;
56
+ inspectProcess?: (pid: number) => Promise<ProcessIdentityInspection>;
57
+ beforeRecoveryRemove?: () => Promise<void>;
58
+ };
59
+ export declare function inspectApplyLock(locksDirectory: string, dependencies?: LockInspectionDependencies): Promise<ApplyLockStatus>;
60
+ export declare function recoverStaleApplyLock(locksDirectory: string, dependencies?: LockInspectionDependencies): Promise<ApplyLockOwner>;
61
+ export declare function acquireApplyLock(locksDirectory: string, options: AcquireApplyLockOptions): Promise<StateLock>;
9
62
  //# sourceMappingURL=lock.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/state/lock.ts"],"names":[],"mappings":"AAOA,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAkB,IAAI,mBAAmB;CAC1C;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B,CAAC;AAmCF,wBAAsB,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CA0EjG"}
1
+ {"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/state/lock.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,6BAA6B,CAAC;AAGrC,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAkB,IAAI,mBAAmB;CAC1C;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,SAAkB,IAAI,uBAAuB;CAC9C;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,eAAe,GACvB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;CAAE,GACzD;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxE;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzE;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/E,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACrE,oBAAoB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C,CAAC;AA0OF,wBAAsB,gBAAgB,CACpC,cAAc,EAAE,MAAM,EACtB,YAAY,GAAE,0BAA+B,GAC5C,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED,wBAAsB,qBAAqB,CACzC,cAAc,EAAE,MAAM,EACtB,YAAY,GAAE,0BAA+B,GAC5C,OAAO,CAAC,cAAc,CAAC,CAmCzB;AAED,wBAAsB,gBAAgB,CACpC,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,SAAS,CAAC,CAoEpB"}