youmd 0.10.0 → 0.10.2

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 (130) hide show
  1. package/dist/commands/brain.d.ts +25 -0
  2. package/dist/commands/brain.d.ts.map +1 -0
  3. package/dist/commands/brain.js +683 -0
  4. package/dist/commands/brain.js.map +1 -0
  5. package/dist/commands/doctor.d.ts.map +1 -1
  6. package/dist/commands/doctor.js +4 -0
  7. package/dist/commands/doctor.js.map +1 -1
  8. package/dist/commands/machine.d.ts +3 -0
  9. package/dist/commands/machine.d.ts.map +1 -1
  10. package/dist/commands/machine.js +73 -4
  11. package/dist/commands/machine.js.map +1 -1
  12. package/dist/commands/orchestrate.d.ts.map +1 -1
  13. package/dist/commands/orchestrate.js +4 -3
  14. package/dist/commands/orchestrate.js.map +1 -1
  15. package/dist/commands/project.d.ts.map +1 -1
  16. package/dist/commands/project.js +24 -0
  17. package/dist/commands/project.js.map +1 -1
  18. package/dist/commands/remote.d.ts.map +1 -1
  19. package/dist/commands/remote.js +42 -13
  20. package/dist/commands/remote.js.map +1 -1
  21. package/dist/commands/skill.d.ts.map +1 -1
  22. package/dist/commands/skill.js +2 -0
  23. package/dist/commands/skill.js.map +1 -1
  24. package/dist/commands/tasks.d.ts +23 -3
  25. package/dist/commands/tasks.d.ts.map +1 -1
  26. package/dist/commands/tasks.js +179 -49
  27. package/dist/commands/tasks.js.map +1 -1
  28. package/dist/generated/capability-registry.d.ts +1096 -0
  29. package/dist/generated/capability-registry.d.ts.map +1 -0
  30. package/dist/generated/capability-registry.js +1204 -0
  31. package/dist/generated/capability-registry.js.map +1 -0
  32. package/dist/index.js +42 -1
  33. package/dist/index.js.map +1 -1
  34. package/dist/lib/api.d.ts +84 -0
  35. package/dist/lib/api.d.ts.map +1 -1
  36. package/dist/lib/api.js +26 -0
  37. package/dist/lib/api.js.map +1 -1
  38. package/dist/lib/brain/adapters.d.ts +34 -0
  39. package/dist/lib/brain/adapters.d.ts.map +1 -0
  40. package/dist/lib/brain/adapters.js +362 -0
  41. package/dist/lib/brain/adapters.js.map +1 -0
  42. package/dist/lib/brain/apply-control-plane.d.ts +17 -0
  43. package/dist/lib/brain/apply-control-plane.d.ts.map +1 -0
  44. package/dist/lib/brain/apply-control-plane.js +117 -0
  45. package/dist/lib/brain/apply-control-plane.js.map +1 -0
  46. package/dist/lib/brain/cache.d.ts +25 -0
  47. package/dist/lib/brain/cache.d.ts.map +1 -0
  48. package/dist/lib/brain/cache.js +99 -0
  49. package/dist/lib/brain/cache.js.map +1 -0
  50. package/dist/lib/brain/canonical.d.ts +5 -0
  51. package/dist/lib/brain/canonical.d.ts.map +1 -0
  52. package/dist/lib/brain/canonical.js +38 -0
  53. package/dist/lib/brain/canonical.js.map +1 -0
  54. package/dist/lib/brain/discovery.d.ts +9 -0
  55. package/dist/lib/brain/discovery.d.ts.map +1 -0
  56. package/dist/lib/brain/discovery.js +560 -0
  57. package/dist/lib/brain/discovery.js.map +1 -0
  58. package/dist/lib/brain/index.d.ts +55 -0
  59. package/dist/lib/brain/index.d.ts.map +1 -0
  60. package/dist/lib/brain/index.js +384 -0
  61. package/dist/lib/brain/index.js.map +1 -0
  62. package/dist/lib/brain/proposal.d.ts +179 -0
  63. package/dist/lib/brain/proposal.d.ts.map +1 -0
  64. package/dist/lib/brain/proposal.js +694 -0
  65. package/dist/lib/brain/proposal.js.map +1 -0
  66. package/dist/lib/brain/render.d.ts +33 -0
  67. package/dist/lib/brain/render.d.ts.map +1 -0
  68. package/dist/lib/brain/render.js +515 -0
  69. package/dist/lib/brain/render.js.map +1 -0
  70. package/dist/lib/brain/safe-file.d.ts +110 -0
  71. package/dist/lib/brain/safe-file.d.ts.map +1 -0
  72. package/dist/lib/brain/safe-file.js +564 -0
  73. package/dist/lib/brain/safe-file.js.map +1 -0
  74. package/dist/lib/brain/safety.d.ts +8 -0
  75. package/dist/lib/brain/safety.d.ts.map +1 -0
  76. package/dist/lib/brain/safety.js +42 -0
  77. package/dist/lib/brain/safety.js.map +1 -0
  78. package/dist/lib/brain/staged-apply.d.ts +57 -0
  79. package/dist/lib/brain/staged-apply.d.ts.map +1 -0
  80. package/dist/lib/brain/staged-apply.js +336 -0
  81. package/dist/lib/brain/staged-apply.js.map +1 -0
  82. package/dist/lib/brain/store.d.ts +26 -0
  83. package/dist/lib/brain/store.d.ts.map +1 -0
  84. package/dist/lib/brain/store.js +504 -0
  85. package/dist/lib/brain/store.js.map +1 -0
  86. package/dist/lib/brain/types.d.ts +160 -0
  87. package/dist/lib/brain/types.d.ts.map +1 -0
  88. package/dist/lib/brain/types.js +24 -0
  89. package/dist/lib/brain/types.js.map +1 -0
  90. package/dist/lib/config.d.ts +22 -1
  91. package/dist/lib/config.d.ts.map +1 -1
  92. package/dist/lib/config.js +70 -14
  93. package/dist/lib/config.js.map +1 -1
  94. package/dist/lib/daemon.d.ts +27 -0
  95. package/dist/lib/daemon.d.ts.map +1 -1
  96. package/dist/lib/daemon.js +57 -0
  97. package/dist/lib/daemon.js.map +1 -1
  98. package/dist/lib/machine-identity.d.ts +16 -0
  99. package/dist/lib/machine-identity.d.ts.map +1 -0
  100. package/dist/lib/machine-identity.js +101 -0
  101. package/dist/lib/machine-identity.js.map +1 -0
  102. package/dist/lib/orchestrator/loop.d.ts +1 -0
  103. package/dist/lib/orchestrator/loop.d.ts.map +1 -1
  104. package/dist/lib/orchestrator/loop.js +16 -0
  105. package/dist/lib/orchestrator/loop.js.map +1 -1
  106. package/dist/lib/orchestrator/tools.d.ts +11 -0
  107. package/dist/lib/orchestrator/tools.d.ts.map +1 -1
  108. package/dist/lib/orchestrator/tools.js +143 -0
  109. package/dist/lib/orchestrator/tools.js.map +1 -1
  110. package/dist/lib/project-strategy.d.ts +38 -0
  111. package/dist/lib/project-strategy.d.ts.map +1 -1
  112. package/dist/lib/project-strategy.js +91 -0
  113. package/dist/lib/project-strategy.js.map +1 -1
  114. package/dist/lib/projectContext.d.ts +6 -4
  115. package/dist/lib/projectContext.d.ts.map +1 -1
  116. package/dist/lib/projectContext.js +19 -17
  117. package/dist/lib/projectContext.js.map +1 -1
  118. package/dist/lib/tasksFile.d.ts +27 -32
  119. package/dist/lib/tasksFile.d.ts.map +1 -1
  120. package/dist/lib/tasksFile.js +359 -163
  121. package/dist/lib/tasksFile.js.map +1 -1
  122. package/dist/mcp/registry.d.ts +8 -2
  123. package/dist/mcp/registry.d.ts.map +1 -1
  124. package/dist/mcp/registry.js +189 -2
  125. package/dist/mcp/registry.js.map +1 -1
  126. package/dist/mcp/server.d.ts +1 -0
  127. package/dist/mcp/server.d.ts.map +1 -1
  128. package/dist/mcp/server.js +3 -2
  129. package/dist/mcp/server.js.map +1 -1
  130. package/package.json +1 -1
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BrainSafetyError = void 0;
4
+ exports.assertBrainPayloadSafe = assertBrainPayloadSafe;
5
+ const redact_1 = require("../redact");
6
+ class BrainSafetyError extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.code = "brain_safety_gate_failed";
10
+ this.name = "BrainSafetyError";
11
+ }
12
+ }
13
+ exports.BrainSafetyError = BrainSafetyError;
14
+ function safetyStrings(value) {
15
+ if (typeof value === "string") {
16
+ // Cryptographic digests are opaque evidence, not user content. Running PII
17
+ // regexes over random hex creates false phone-number matches.
18
+ if (/^(?:scan:|workspace:|sha256:|(?:machine|repository|worktree|branch):sha256:)[a-f0-9]{64}$/.test(value))
19
+ return [];
20
+ if (/^(?:sha256|heuristic):[a-f0-9]{64}$/.test(value))
21
+ return [];
22
+ return [value];
23
+ }
24
+ if (Array.isArray(value))
25
+ return value.flatMap(safetyStrings);
26
+ if (value && typeof value === "object")
27
+ return Object.values(value).flatMap(safetyStrings);
28
+ return [];
29
+ }
30
+ /** Must run over the complete payload before any persistent path is created. */
31
+ function assertBrainPayloadSafe(scan, canaries = []) {
32
+ const payload = JSON.stringify(scan);
33
+ const hits = safetyStrings(scan).reduce((count, value) => count + (0, redact_1.redactText)(value).hits, 0);
34
+ if (hits > 0)
35
+ throw new BrainSafetyError(`brain snapshot contains ${hits} secret or PII pattern(s)`);
36
+ for (const canary of canaries) {
37
+ if (canary && payload.includes(canary))
38
+ throw new BrainSafetyError("brain snapshot contains a persistence canary");
39
+ }
40
+ return payload;
41
+ }
42
+ //# sourceMappingURL=safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.js","sourceRoot":"","sources":["../../../src/lib/brain/safety.ts"],"names":[],"mappings":";;;AAsBA,wDAQC;AA9BD,sCAAuC;AAGvC,MAAa,gBAAiB,SAAQ,KAAK;IAEzC,YAAY,OAAe;QAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QADrC,SAAI,GAAG,0BAA0B,CAAC;QACI,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IAAC,CAAC;CACjF;AAHD,4CAGC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,2EAA2E;QAC3E,8DAA8D;QAC9D,IAAI,2FAA2F,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACvH,IAAI,qCAAqC,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9D,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,KAAgC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACtH,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,gFAAgF;AAChF,SAAgB,sBAAsB,CAAC,IAAsB,EAAE,WAAqB,EAAE;IACpF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,IAAA,mBAAU,EAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7F,IAAI,IAAI,GAAG,CAAC;QAAE,MAAM,IAAI,gBAAgB,CAAC,2BAA2B,IAAI,2BAA2B,CAAC,CAAC;IACrG,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,gBAAgB,CAAC,8CAA8C,CAAC,CAAC;IACrH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,57 @@
1
+ import type { ProjectBrainApplyApproval } from "./safe-file";
2
+ import type { ProjectBrainProposal } from "./proposal";
3
+ export declare const PROJECT_BRAIN_STAGED_APPLY_VERSION: "you-md/project-brain-staged-apply/v1";
4
+ export interface ProjectBrainStagedApplyEnvelope {
5
+ schemaVersion: typeof PROJECT_BRAIN_STAGED_APPLY_VERSION;
6
+ kind: "project-brain-staged-apply";
7
+ state: "staged" | "consumed";
8
+ proposalId: string;
9
+ applyId: string;
10
+ proposalRef: string;
11
+ rootPath: string;
12
+ rootPathHash: string;
13
+ proposalPath: string;
14
+ proposalContentHash: string;
15
+ approvalPath: string;
16
+ approvalContentHash: string;
17
+ createdAt: string;
18
+ expiresAt: string;
19
+ consumedAt?: string;
20
+ }
21
+ export interface StageProjectBrainApplyOptions {
22
+ brainRoot?: string;
23
+ proposalId: string;
24
+ applyId: string;
25
+ root: string;
26
+ proposalPath: string;
27
+ proposalContent: string;
28
+ proposal: ProjectBrainProposal;
29
+ approvalPath: string;
30
+ approvalContent: string;
31
+ approval: ProjectBrainApplyApproval;
32
+ now?: Date;
33
+ }
34
+ export interface ConsumeProjectBrainStagedApplyOptions {
35
+ brainRoot?: string;
36
+ proposalId: string;
37
+ applyId: string;
38
+ now?: Date;
39
+ }
40
+ export interface ProjectBrainStagedApplyResolution {
41
+ proposalId: string;
42
+ applyId: string;
43
+ proposalRef: string;
44
+ root: string;
45
+ proposalPath: string;
46
+ proposalContentHash: string;
47
+ approvalPath: string;
48
+ approvalContentHash: string;
49
+ state: "consumed";
50
+ }
51
+ export declare class BrainStagedApplyError extends Error {
52
+ readonly code: string;
53
+ constructor(code: string, message: string);
54
+ }
55
+ export declare function stageProjectBrainApply(options: StageProjectBrainApplyOptions): ProjectBrainStagedApplyEnvelope;
56
+ export declare function consumeProjectBrainStagedApply(options: ConsumeProjectBrainStagedApplyOptions): ProjectBrainStagedApplyResolution;
57
+ //# sourceMappingURL=staged-apply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staged-apply.d.ts","sourceRoot":"","sources":["../../../src/lib/brain/staged-apply.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,eAAO,MAAM,kCAAkC,EAAG,sCAA+C,CAAC;AAMlG,MAAM,WAAW,+BAA+B;IAC9C,aAAa,EAAE,OAAO,kCAAkC,CAAC;IACzD,IAAI,EAAE,4BAA4B,CAAC;IACnC,KAAK,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,6BAA6B;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,yBAAyB,CAAC;IACpC,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,qCAAqC;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,iCAAiC;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,KAAK,EAAE,UAAU,CAAC;CACnB;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAInD;AA0ID,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,6BAA6B,GAAG,+BAA+B,CAkC9G;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,qCAAqC,GAC7C,iCAAiC,CA0DnC"}
@@ -0,0 +1,336 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.BrainStagedApplyError = exports.PROJECT_BRAIN_STAGED_APPLY_VERSION = void 0;
37
+ exports.stageProjectBrainApply = stageProjectBrainApply;
38
+ exports.consumeProjectBrainStagedApply = consumeProjectBrainStagedApply;
39
+ const crypto = __importStar(require("crypto"));
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const config_1 = require("../config");
43
+ exports.PROJECT_BRAIN_STAGED_APPLY_VERSION = "you-md/project-brain-staged-apply/v1";
44
+ const OPAQUE_ID = /^[A-Za-z0-9_-]{10,128}$/;
45
+ const SHA256_REF = /^sha256:[a-f0-9]{64}$/;
46
+ const MAX_STAGE_BYTES = 32 * 1024;
47
+ const MAX_STAGE_AGE_MS = 15 * 60000;
48
+ class BrainStagedApplyError extends Error {
49
+ constructor(code, message) {
50
+ super(message);
51
+ this.code = code;
52
+ this.name = "BrainStagedApplyError";
53
+ }
54
+ }
55
+ exports.BrainStagedApplyError = BrainStagedApplyError;
56
+ function hash(value) {
57
+ return `sha256:${crypto.createHash("sha256").update(value).digest("hex")}`;
58
+ }
59
+ function assertOpaqueId(value, label) {
60
+ if (!OPAQUE_ID.test(value))
61
+ throw new BrainStagedApplyError("PROJECT_BRAIN_STAGE_INVALID_ID", `${label} is invalid`);
62
+ }
63
+ function canonicalExisting(value, kind) {
64
+ const absolute = path.resolve(value);
65
+ try {
66
+ if (fs.lstatSync(absolute).isSymbolicLink()) {
67
+ throw new BrainStagedApplyError("PROJECT_BRAIN_STAGE_UNSAFE_PATH", `${kind} binding is a symlink`);
68
+ }
69
+ }
70
+ catch (error) {
71
+ if (error instanceof BrainStagedApplyError)
72
+ throw error;
73
+ throw new BrainStagedApplyError("PROJECT_BRAIN_STAGE_UNSAFE_PATH", `${kind} is unavailable`);
74
+ }
75
+ let canonical;
76
+ try {
77
+ canonical = fs.realpathSync(absolute);
78
+ }
79
+ catch {
80
+ throw new BrainStagedApplyError("PROJECT_BRAIN_STAGE_UNSAFE_PATH", `${kind} is unavailable`);
81
+ }
82
+ const stat = fs.lstatSync(canonical);
83
+ if (stat.isSymbolicLink() || (kind === "file" ? !stat.isFile() : !stat.isDirectory())) {
84
+ throw new BrainStagedApplyError("PROJECT_BRAIN_STAGE_UNSAFE_PATH", `${kind} binding is unsafe`);
85
+ }
86
+ return canonical;
87
+ }
88
+ function stageRoot(value) {
89
+ const requested = path.resolve(value || path.join((0, config_1.getWritableHomeBundleDir)(), "brain"));
90
+ fs.mkdirSync(requested, { recursive: true, mode: 0o700 });
91
+ const canonical = fs.realpathSync(requested);
92
+ const stat = fs.lstatSync(canonical);
93
+ if (!stat.isDirectory() || stat.isSymbolicLink()) {
94
+ throw new BrainStagedApplyError("PROJECT_BRAIN_STAGE_UNSAFE_PATH", "brain root is unsafe");
95
+ }
96
+ try {
97
+ fs.chmodSync(canonical, 0o700);
98
+ }
99
+ catch { /* non-POSIX */ }
100
+ return canonical;
101
+ }
102
+ function stagePaths(root, applyId) {
103
+ assertOpaqueId(applyId, "apply id");
104
+ const digest = crypto.createHash("sha256").update(applyId, "utf8").digest("hex");
105
+ const directory = path.join(root, "audit", "apply-staging");
106
+ fs.mkdirSync(directory, { recursive: true, mode: 0o700 });
107
+ const canonicalDirectory = fs.realpathSync(directory);
108
+ const stat = fs.lstatSync(canonicalDirectory);
109
+ if (!stat.isDirectory() || stat.isSymbolicLink()) {
110
+ throw new BrainStagedApplyError("PROJECT_BRAIN_STAGE_UNSAFE_PATH", "staging directory is unsafe");
111
+ }
112
+ try {
113
+ fs.chmodSync(canonicalDirectory, 0o700);
114
+ }
115
+ catch { /* non-POSIX */ }
116
+ return {
117
+ file: path.join(canonicalDirectory, `${digest}.json`),
118
+ lock: path.join(canonicalDirectory, `${digest}.lock`),
119
+ };
120
+ }
121
+ function fsyncDirectory(directory) {
122
+ let fd;
123
+ try {
124
+ fd = fs.openSync(directory, fs.constants.O_RDONLY);
125
+ fs.fsyncSync(fd);
126
+ }
127
+ finally {
128
+ if (fd !== undefined)
129
+ fs.closeSync(fd);
130
+ }
131
+ }
132
+ function atomicCreate(file, content) {
133
+ const temporary = `${file}.${process.pid}.${crypto.randomBytes(8).toString("hex")}.tmp`;
134
+ let fd;
135
+ try {
136
+ fd = fs.openSync(temporary, fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL, 0o600);
137
+ fs.writeFileSync(fd, content, "utf8");
138
+ fs.fsyncSync(fd);
139
+ fs.closeSync(fd);
140
+ fd = undefined;
141
+ try {
142
+ fs.linkSync(temporary, file);
143
+ }
144
+ catch {
145
+ throw new BrainStagedApplyError("PROJECT_BRAIN_STAGE_REPLAY", "apply id is already staged or consumed");
146
+ }
147
+ fs.unlinkSync(temporary);
148
+ try {
149
+ fs.chmodSync(file, 0o600);
150
+ }
151
+ catch { /* non-POSIX */ }
152
+ fsyncDirectory(path.dirname(file));
153
+ }
154
+ finally {
155
+ if (fd !== undefined)
156
+ try {
157
+ fs.closeSync(fd);
158
+ }
159
+ catch { /* closed */ }
160
+ try {
161
+ fs.unlinkSync(temporary);
162
+ }
163
+ catch { /* absent */ }
164
+ }
165
+ }
166
+ function atomicReplace(file, content) {
167
+ const temporary = `${file}.${process.pid}.${crypto.randomBytes(8).toString("hex")}.tmp`;
168
+ let fd;
169
+ try {
170
+ fd = fs.openSync(temporary, fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL, 0o600);
171
+ fs.writeFileSync(fd, content, "utf8");
172
+ fs.fsyncSync(fd);
173
+ fs.closeSync(fd);
174
+ fd = undefined;
175
+ fs.renameSync(temporary, file);
176
+ try {
177
+ fs.chmodSync(file, 0o600);
178
+ }
179
+ catch { /* non-POSIX */ }
180
+ fsyncDirectory(path.dirname(file));
181
+ }
182
+ finally {
183
+ if (fd !== undefined)
184
+ try {
185
+ fs.closeSync(fd);
186
+ }
187
+ catch { /* closed */ }
188
+ try {
189
+ fs.unlinkSync(temporary);
190
+ }
191
+ catch { /* absent */ }
192
+ }
193
+ }
194
+ function assertApprovalBinding(proposal, approval, now) {
195
+ const approvedAt = Date.parse(approval?.approvedAt || "");
196
+ const expiresAt = Date.parse(approval?.expiresAt || "");
197
+ const valid = approval?.schemaVersion === "you-md/project-brain-approval/v1"
198
+ && approval.kind === "project-brain-approval" && approval.decision === "approved" && approval.revoked === false
199
+ && approval.proposalRef === proposal.proposalRef
200
+ && approval.bindings?.projectRef === proposal.projectRef
201
+ && approval.bindings.machineRef === proposal.machineRef
202
+ && approval.bindings.workspaceRef === proposal.workspaceRef
203
+ && approval.bindings.baseRevision === proposal.baseRevision
204
+ && approval.bindings.baseContentHash === proposal.target.baseContentHash
205
+ && approval.bindings.sourceRevision === proposal.source.sourceRevision
206
+ && approval.bindings.patchFormat === proposal.patchFormat
207
+ && approval.bindings.patchDigest === proposal.patchDigest
208
+ && Number.isFinite(approvedAt) && Number.isFinite(expiresAt)
209
+ && approvedAt <= now.getTime() && expiresAt >= now.getTime();
210
+ if (!valid)
211
+ throw new BrainStagedApplyError("PROJECT_BRAIN_STAGE_APPROVAL_INVALID", "approval is stale or mismatched");
212
+ }
213
+ function parseEnvelope(file) {
214
+ const stat = fs.lstatSync(file);
215
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.size > MAX_STAGE_BYTES
216
+ || (process.platform !== "win32" && (stat.mode & 0o077) !== 0)) {
217
+ throw new BrainStagedApplyError("PROJECT_BRAIN_STAGE_UNSAFE_PATH", "staged envelope is unsafe");
218
+ }
219
+ let envelope;
220
+ try {
221
+ envelope = JSON.parse(fs.readFileSync(file, "utf8"));
222
+ }
223
+ catch {
224
+ throw new BrainStagedApplyError("PROJECT_BRAIN_STAGE_INVALID", "staged envelope is invalid");
225
+ }
226
+ return envelope;
227
+ }
228
+ function stageProjectBrainApply(options) {
229
+ assertOpaqueId(options.proposalId, "proposal id");
230
+ assertOpaqueId(options.applyId, "apply id");
231
+ const now = options.now || new Date();
232
+ assertApprovalBinding(options.proposal, options.approval, now);
233
+ const rootPath = canonicalExisting(options.root, "directory");
234
+ const proposalPath = canonicalExisting(options.proposalPath, "file");
235
+ const approvalPath = canonicalExisting(options.approvalPath, "file");
236
+ if (proposalPath === approvalPath)
237
+ throw new BrainStagedApplyError("PROJECT_BRAIN_STAGE_UNSAFE_PATH", "proposal and approval paths must differ");
238
+ if (fs.readFileSync(proposalPath, "utf8") !== options.proposalContent
239
+ || fs.readFileSync(approvalPath, "utf8") !== options.approvalContent) {
240
+ throw new BrainStagedApplyError("PROJECT_BRAIN_STAGE_STALE_HASH", "staged inputs changed during validation");
241
+ }
242
+ const approvalExpiry = Date.parse(options.approval.expiresAt);
243
+ const expiresAt = new Date(Math.min(approvalExpiry, now.getTime() + MAX_STAGE_AGE_MS));
244
+ const envelope = {
245
+ schemaVersion: exports.PROJECT_BRAIN_STAGED_APPLY_VERSION,
246
+ kind: "project-brain-staged-apply",
247
+ state: "staged",
248
+ proposalId: options.proposalId,
249
+ applyId: options.applyId,
250
+ proposalRef: options.proposal.proposalRef,
251
+ rootPath,
252
+ rootPathHash: hash(rootPath),
253
+ proposalPath,
254
+ proposalContentHash: hash(options.proposalContent),
255
+ approvalPath,
256
+ approvalContentHash: hash(options.approvalContent),
257
+ createdAt: now.toISOString(),
258
+ expiresAt: expiresAt.toISOString(),
259
+ };
260
+ const paths = stagePaths(stageRoot(options.brainRoot), options.applyId);
261
+ atomicCreate(paths.file, `${JSON.stringify(envelope, null, 2)}\n`);
262
+ return envelope;
263
+ }
264
+ function consumeProjectBrainStagedApply(options) {
265
+ assertOpaqueId(options.proposalId, "proposal id");
266
+ assertOpaqueId(options.applyId, "apply id");
267
+ const paths = stagePaths(stageRoot(options.brainRoot), options.applyId);
268
+ let lockFd;
269
+ try {
270
+ lockFd = fs.openSync(paths.lock, fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL, 0o600);
271
+ }
272
+ catch {
273
+ throw new BrainStagedApplyError("PROJECT_BRAIN_STAGE_REPLAY", "staged apply is already being consumed");
274
+ }
275
+ try {
276
+ let envelope;
277
+ try {
278
+ envelope = parseEnvelope(paths.file);
279
+ }
280
+ catch (error) {
281
+ if (error instanceof BrainStagedApplyError)
282
+ throw error;
283
+ throw new BrainStagedApplyError("PROJECT_BRAIN_STAGE_NOT_FOUND", "staged apply is unavailable");
284
+ }
285
+ const now = options.now || new Date();
286
+ if (envelope.schemaVersion !== exports.PROJECT_BRAIN_STAGED_APPLY_VERSION || envelope.kind !== "project-brain-staged-apply"
287
+ || envelope.proposalId !== options.proposalId || envelope.applyId !== options.applyId
288
+ || !SHA256_REF.test(envelope.rootPathHash) || !SHA256_REF.test(envelope.proposalContentHash)
289
+ || !SHA256_REF.test(envelope.approvalContentHash)) {
290
+ throw new BrainStagedApplyError("PROJECT_BRAIN_STAGE_INVALID", "staged apply binding is invalid");
291
+ }
292
+ if (envelope.state !== "staged")
293
+ throw new BrainStagedApplyError("PROJECT_BRAIN_STAGE_REPLAY", "staged apply was already consumed");
294
+ if (!Number.isFinite(Date.parse(envelope.expiresAt)) || Date.parse(envelope.expiresAt) < now.getTime()) {
295
+ throw new BrainStagedApplyError("PROJECT_BRAIN_STAGE_EXPIRED", "staged apply expired");
296
+ }
297
+ const root = canonicalExisting(envelope.rootPath, "directory");
298
+ const proposalPath = canonicalExisting(envelope.proposalPath, "file");
299
+ const approvalPath = canonicalExisting(envelope.approvalPath, "file");
300
+ if (root !== envelope.rootPath || hash(root) !== envelope.rootPathHash
301
+ || proposalPath !== envelope.proposalPath || approvalPath !== envelope.approvalPath
302
+ || hash(fs.readFileSync(proposalPath)) !== envelope.proposalContentHash
303
+ || hash(fs.readFileSync(approvalPath)) !== envelope.approvalContentHash) {
304
+ throw new BrainStagedApplyError("PROJECT_BRAIN_STAGE_STALE_HASH", "staged apply inputs changed after staging");
305
+ }
306
+ const consumed = {
307
+ ...envelope,
308
+ state: "consumed",
309
+ consumedAt: now.toISOString(),
310
+ };
311
+ atomicReplace(paths.file, `${JSON.stringify(consumed, null, 2)}\n`);
312
+ return {
313
+ proposalId: consumed.proposalId,
314
+ applyId: consumed.applyId,
315
+ proposalRef: consumed.proposalRef,
316
+ root,
317
+ proposalPath,
318
+ proposalContentHash: consumed.proposalContentHash,
319
+ approvalPath,
320
+ approvalContentHash: consumed.approvalContentHash,
321
+ state: "consumed",
322
+ };
323
+ }
324
+ finally {
325
+ if (lockFd !== undefined)
326
+ try {
327
+ fs.closeSync(lockFd);
328
+ }
329
+ catch { /* closed */ }
330
+ try {
331
+ fs.unlinkSync(paths.lock);
332
+ }
333
+ catch { /* absent */ }
334
+ }
335
+ }
336
+ //# sourceMappingURL=staged-apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staged-apply.js","sourceRoot":"","sources":["../../../src/lib/brain/staged-apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { BrainContentCache } from "./cache";
2
+ import { BrainPersistenceFault, BrainPersistenceResult, ProjectBrainScan } from "./types";
3
+ export declare function defaultBrainRoot(): string;
4
+ export declare class BrainPersistenceInterruptedError extends Error {
5
+ readonly phase: string;
6
+ readonly code = "brain_persistence_interrupted";
7
+ constructor(phase: string);
8
+ }
9
+ export interface BrainPersistOptions {
10
+ signal?: AbortSignal;
11
+ cache?: BrainContentCache;
12
+ faultInjection?: BrainPersistenceFault;
13
+ lockTimeoutMs?: number;
14
+ lockStaleMs?: number;
15
+ }
16
+ export declare function brainWorkspaceLockPath(brainRoot: string, workspace: string): string;
17
+ export declare function acquireBrainWorkspaceLock(brainRoot: string, workspace: string, options?: Pick<BrainPersistOptions, "signal" | "lockTimeoutMs" | "lockStaleMs">): () => void;
18
+ export declare function persistBrainScan(scan: ProjectBrainScan, brainRoot?: string, canaries?: string[], options?: BrainPersistOptions): BrainPersistenceResult;
19
+ export declare function listBrainWorkspaceRefs(brainRoot?: string, project?: string): string[];
20
+ export declare function readBrainSnapshot(options: {
21
+ brainRoot?: string;
22
+ project?: string;
23
+ workspace?: string;
24
+ revision?: string;
25
+ }): ProjectBrainScan | null;
26
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/lib/brain/store.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE1F,wBAAgB,gBAAgB,IAAI,MAAM,CAAqD;AAE/F,qBAAa,gCAAiC,SAAQ,KAAK;IAE7C,QAAQ,CAAC,KAAK,EAAE,MAAM;IADlC,QAAQ,CAAC,IAAI,mCAAmC;gBAC3B,KAAK,EAAE,MAAM;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAyCD,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGnF;AA+CD,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,IAAI,CAAC,mBAAmB,EAAE,QAAQ,GAAG,eAAe,GAAG,aAAa,CAAM,GAAG,MAAM,IAAI,CAG/K;AAiJD,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,gBAAgB,EACtB,SAAS,SAAqB,EAC9B,QAAQ,GAAE,MAAM,EAAO,EACvB,OAAO,GAAE,mBAAwB,GAChC,sBAAsB,CAgExB;AA8BD,wBAAgB,sBAAsB,CAAC,SAAS,SAAqB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAKjG;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,GAAG,IAAI,CA8BnJ"}