dreamcontext 0.16.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/dist/dashboard/assets/{BrainCanvas3D-Dq2AZVLs.js → BrainCanvas3D-y35c1rJf.js} +1 -1
  2. package/dist/dashboard/assets/{_baseUniq-Rjr0gzcI.js → _baseUniq-g57aeE1L.js} +1 -1
  3. package/dist/dashboard/assets/{ar-SA-G6X2FPQ2-B6xPVLtZ.js → ar-SA-G6X2FPQ2-B7ybIFFt.js} +1 -1
  4. package/dist/dashboard/assets/{arc-MywWiHZZ.js → arc-C5Y4eje1.js} +1 -1
  5. package/dist/dashboard/assets/{architectureDiagram-Q4EWVU46-DYku7HV_.js → architectureDiagram-Q4EWVU46-DnxEKMQ-.js} +1 -1
  6. package/dist/dashboard/assets/{az-AZ-76LH7QW2-DS6KjFyN.js → az-AZ-76LH7QW2-DF75BEoV.js} +1 -1
  7. package/dist/dashboard/assets/{bg-BG-XCXSNQG7-5dVZIYN7.js → bg-BG-XCXSNQG7-D_xX3Evl.js} +1 -1
  8. package/dist/dashboard/assets/{blockDiagram-DXYQGD6D-CLHIA42j.js → blockDiagram-DXYQGD6D-DsFvaLns.js} +1 -1
  9. package/dist/dashboard/assets/{bn-BD-2XOGV67Q-DPdctd0M.js → bn-BD-2XOGV67Q-DSRsGjwD.js} +1 -1
  10. package/dist/dashboard/assets/{c4Diagram-AHTNJAMY-KCxsjhZ-.js → c4Diagram-AHTNJAMY-DXmGhsoH.js} +1 -1
  11. package/dist/dashboard/assets/{ca-ES-6MX7JW3Y-BwsiffyD.js → ca-ES-6MX7JW3Y-DXLsz3CU.js} +1 -1
  12. package/dist/dashboard/assets/channel-8FAi-z4K.js +1 -0
  13. package/dist/dashboard/assets/{chunk-4BX2VUAB-CXYJqRL7.js → chunk-4BX2VUAB-B1u0KwPb.js} +1 -1
  14. package/dist/dashboard/assets/{chunk-4TB4RGXK-64IoWLUH.js → chunk-4TB4RGXK-DCMNOaAV.js} +1 -1
  15. package/dist/dashboard/assets/{chunk-55IACEB6-oeTs6Ons.js → chunk-55IACEB6-ByleWNvl.js} +1 -1
  16. package/dist/dashboard/assets/{chunk-EDXVE4YY-DnBDiozF.js → chunk-EDXVE4YY-D1uIvY6z.js} +1 -1
  17. package/dist/dashboard/assets/{chunk-FMBD7UC4-1vZj5k6I.js → chunk-FMBD7UC4-gnrb7hoq.js} +1 -1
  18. package/dist/dashboard/assets/{chunk-OYMX7WX6-ChzA2Qb2.js → chunk-OYMX7WX6-DW6-cdV3.js} +1 -1
  19. package/dist/dashboard/assets/{chunk-QZHKN3VN-DFD_tEP6.js → chunk-QZHKN3VN-CGHdGGkQ.js} +1 -1
  20. package/dist/dashboard/assets/{chunk-YZCP3GAM-BHU_oH_c.js → chunk-YZCP3GAM-DDJQ7-hq.js} +1 -1
  21. package/dist/dashboard/assets/classDiagram-6PBFFD2Q-Docm0aN-.js +1 -0
  22. package/dist/dashboard/assets/classDiagram-v2-HSJHXN6E-Docm0aN-.js +1 -0
  23. package/dist/dashboard/assets/clone-CxkSBJ3W.js +1 -0
  24. package/dist/dashboard/assets/{cose-bilkent-S5V4N54A-Bg8VEGjl.js → cose-bilkent-S5V4N54A-CTQIwiIq.js} +1 -1
  25. package/dist/dashboard/assets/{cs-CZ-2BRQDIVT-CwAnE7Z6.js → cs-CZ-2BRQDIVT-BKvVPsJS.js} +1 -1
  26. package/dist/dashboard/assets/{da-DK-5WZEPLOC-DsAINO0_.js → da-DK-5WZEPLOC-D-GZqbdX.js} +1 -1
  27. package/dist/dashboard/assets/{dagre-KV5264BT-CdNovau5.js → dagre-KV5264BT-Jz3whjk4.js} +1 -1
  28. package/dist/dashboard/assets/{de-DE-XR44H4JA-DQ5OpjQD.js → de-DE-XR44H4JA-dN8Dh2tp.js} +1 -1
  29. package/dist/dashboard/assets/{diagram-5BDNPKRD-DIm6J283.js → diagram-5BDNPKRD-DtDbd2d1.js} +1 -1
  30. package/dist/dashboard/assets/{diagram-G4DWMVQ6-CK08ITsx.js → diagram-G4DWMVQ6-DFVSpltG.js} +1 -1
  31. package/dist/dashboard/assets/{diagram-MMDJMWI5-DhJYPP7z.js → diagram-MMDJMWI5-eBAtVrcR.js} +1 -1
  32. package/dist/dashboard/assets/{diagram-TYMM5635-C_e80UTu.js → diagram-TYMM5635-BHjVr_FM.js} +1 -1
  33. package/dist/dashboard/assets/{el-GR-BZB4AONW-DclRqvkS.js → el-GR-BZB4AONW-RPZfx5-x.js} +1 -1
  34. package/dist/dashboard/assets/{erDiagram-SMLLAGMA-MyfjSgFp.js → erDiagram-SMLLAGMA-CXAkwxcx.js} +1 -1
  35. package/dist/dashboard/assets/{es-ES-U4NZUMDT-CHBzsVCs.js → es-ES-U4NZUMDT-DQv-XgP6.js} +1 -1
  36. package/dist/dashboard/assets/{eu-ES-A7QVB2H4-CVStEZVJ.js → eu-ES-A7QVB2H4-CuWBCBqu.js} +1 -1
  37. package/dist/dashboard/assets/{fa-IR-HGAKTJCU-84UjGZiC.js → fa-IR-HGAKTJCU-4FMGsomC.js} +1 -1
  38. package/dist/dashboard/assets/{fi-FI-Z5N7JZ37-B-_lgOAU.js → fi-FI-Z5N7JZ37-C_7XKQ39.js} +1 -1
  39. package/dist/dashboard/assets/{flowDiagram-DWJPFMVM-nR9IojlX.js → flowDiagram-DWJPFMVM-BFdWnw5h.js} +1 -1
  40. package/dist/dashboard/assets/{fr-FR-RHASNOE6-lXmb84Qf.js → fr-FR-RHASNOE6-pmcEtk8N.js} +1 -1
  41. package/dist/dashboard/assets/{ganttDiagram-T4ZO3ILL-CDXS_k5x.js → ganttDiagram-T4ZO3ILL-DFf9_pss.js} +1 -1
  42. package/dist/dashboard/assets/{gitGraphDiagram-UUTBAWPF-DlSCg_be.js → gitGraphDiagram-UUTBAWPF-DURiCXR8.js} +1 -1
  43. package/dist/dashboard/assets/{gl-ES-HMX3MZ6V-DsAiVwM4.js → gl-ES-HMX3MZ6V-DB4ImOy_.js} +1 -1
  44. package/dist/dashboard/assets/{graph-C23F2q3y.js → graph-DYtPayNd.js} +1 -1
  45. package/dist/dashboard/assets/{he-IL-6SHJWFNN-CNHUnglJ.js → he-IL-6SHJWFNN-CHIkZOP6.js} +1 -1
  46. package/dist/dashboard/assets/{hi-IN-IWLTKZ5I-gkocGD33.js → hi-IN-IWLTKZ5I-pVpeINen.js} +1 -1
  47. package/dist/dashboard/assets/{hu-HU-A5ZG7DT2-lq_pPFj9.js → hu-HU-A5ZG7DT2-CAUlCsMQ.js} +1 -1
  48. package/dist/dashboard/assets/{id-ID-SAP4L64H-DUKThVft.js → id-ID-SAP4L64H-BZJDBU66.js} +1 -1
  49. package/dist/dashboard/assets/{index-xYYnjbSx.js → index-B8f3KGr5.js} +155 -155
  50. package/dist/dashboard/assets/{index-CVcgkdal.css → index-BdZ3tppu.css} +2 -2
  51. package/dist/dashboard/assets/{index-DFFGxCUu.js → index-DxIybLvS.js} +1 -1
  52. package/dist/dashboard/assets/{infoDiagram-42DDH7IO-BIZDd3qg.js → infoDiagram-42DDH7IO-BPiW3Ij4.js} +1 -1
  53. package/dist/dashboard/assets/{ishikawaDiagram-UXIWVN3A-Bj5MHhfc.js → ishikawaDiagram-UXIWVN3A-Blkx8f3S.js} +1 -1
  54. package/dist/dashboard/assets/{it-IT-JPQ66NNP-DIDeuYqe.js → it-IT-JPQ66NNP-My2T4UwV.js} +1 -1
  55. package/dist/dashboard/assets/{ja-JP-DBVTYXUO-BqPEBA22.js → ja-JP-DBVTYXUO-BPD5Unyr.js} +1 -1
  56. package/dist/dashboard/assets/{journeyDiagram-VCZTEJTY-B41HNLhc.js → journeyDiagram-VCZTEJTY-BDsJYpXT.js} +1 -1
  57. package/dist/dashboard/assets/{kaa-6HZHGXH3-CCgtE0-l.js → kaa-6HZHGXH3-ByIbhvgR.js} +1 -1
  58. package/dist/dashboard/assets/{kab-KAB-ZGHBKWFO-A4y6sskJ.js → kab-KAB-ZGHBKWFO-eKUh9BOS.js} +1 -1
  59. package/dist/dashboard/assets/{kanban-definition-6JOO6SKY-DR-Zc9Wa.js → kanban-definition-6JOO6SKY-C3viwNtJ.js} +1 -1
  60. package/dist/dashboard/assets/{kk-KZ-P5N5QNE5-CaXfkWxC.js → kk-KZ-P5N5QNE5-CyZ_MOrV.js} +1 -1
  61. package/dist/dashboard/assets/{km-KH-HSX4SM5Z-DGfryG3j.js → km-KH-HSX4SM5Z-D3FZvcLx.js} +1 -1
  62. package/dist/dashboard/assets/{ko-KR-MTYHY66A-CuNG6PfQ.js → ko-KR-MTYHY66A-D8irDigM.js} +1 -1
  63. package/dist/dashboard/assets/{ku-TR-6OUDTVRD-DZNsnhP9.js → ku-TR-6OUDTVRD-B7P1RwAB.js} +1 -1
  64. package/dist/dashboard/assets/{layout-CThyY_Dn.js → layout-Bm4ekZW0.js} +1 -1
  65. package/dist/dashboard/assets/{linear-DBRj6V2K.js → linear-CuMgtZOc.js} +1 -1
  66. package/dist/dashboard/assets/{lt-LT-XHIRWOB4-B97DldtT.js → lt-LT-XHIRWOB4-Ci1UvfZQ.js} +1 -1
  67. package/dist/dashboard/assets/{lv-LV-5QDEKY6T-yrPeKaL3.js → lv-LV-5QDEKY6T-Bo3huXeU.js} +1 -1
  68. package/dist/dashboard/assets/{min-DHVsc_O1.js → min-DbOs1vEh.js} +1 -1
  69. package/dist/dashboard/assets/{mindmap-definition-QFDTVHPH-ta1H_Vv6.js → mindmap-definition-QFDTVHPH-Bqzy1-O0.js} +1 -1
  70. package/dist/dashboard/assets/{mr-IN-CRQNXWMA-b3dApjRs.js → mr-IN-CRQNXWMA-CqisPVEd.js} +1 -1
  71. package/dist/dashboard/assets/{my-MM-5M5IBNSE-BHIBHPam.js → my-MM-5M5IBNSE-BeBN5i_N.js} +1 -1
  72. package/dist/dashboard/assets/{nb-NO-T6EIAALU-MhmUUkRf.js → nb-NO-T6EIAALU-D5dV1--A.js} +1 -1
  73. package/dist/dashboard/assets/{nl-NL-IS3SIHDZ-lff3Vuu6.js → nl-NL-IS3SIHDZ-D-0yJ8XR.js} +1 -1
  74. package/dist/dashboard/assets/{nn-NO-6E72VCQL-DXvDarQa.js → nn-NO-6E72VCQL-Vo96ITcp.js} +1 -1
  75. package/dist/dashboard/assets/{oc-FR-POXYY2M6-Ckw3bKbR.js → oc-FR-POXYY2M6-nsG4ZsrH.js} +1 -1
  76. package/dist/dashboard/assets/{pa-IN-N4M65BXN-B2_S0arL.js → pa-IN-N4M65BXN-DxCDdJGd.js} +1 -1
  77. package/dist/dashboard/assets/{percentages-BXMCSKIN-B3ROetXt.js → percentages-BXMCSKIN-BjW3QiBD.js} +7 -7
  78. package/dist/dashboard/assets/{pica-g7PUwtlw.js → pica-BbAsDbLn.js} +1 -1
  79. package/dist/dashboard/assets/{pieDiagram-DEJITSTG-CjThCCvb.js → pieDiagram-DEJITSTG-CCVGHDYA.js} +1 -1
  80. package/dist/dashboard/assets/{pl-PL-T2D74RX3-DzkRcoZK.js → pl-PL-T2D74RX3-BxKUkBW3.js} +1 -1
  81. package/dist/dashboard/assets/{pt-BR-5N22H2LF-D41OxsmY.js → pt-BR-5N22H2LF-B2rKoKHu.js} +1 -1
  82. package/dist/dashboard/assets/{pt-PT-UZXXM6DQ-BuClZ87f.js → pt-PT-UZXXM6DQ-D2aDN9F3.js} +1 -1
  83. package/dist/dashboard/assets/{quadrantDiagram-34T5L4WZ-RD4818Y7.js → quadrantDiagram-34T5L4WZ-DPRv7LNW.js} +1 -1
  84. package/dist/dashboard/assets/{requirementDiagram-MS252O5E-CXJidhho.js → requirementDiagram-MS252O5E-6bTSQFfr.js} +1 -1
  85. package/dist/dashboard/assets/{ro-RO-JPDTUUEW-DqTdk1yt.js → ro-RO-JPDTUUEW-C1oY-qLb.js} +1 -1
  86. package/dist/dashboard/assets/{ru-RU-B4JR7IUQ-V4DgtGOD.js → ru-RU-B4JR7IUQ-aHhtIKSv.js} +1 -1
  87. package/dist/dashboard/assets/{sankeyDiagram-XADWPNL6-C1sycfmk.js → sankeyDiagram-XADWPNL6-BWSI8qsY.js} +1 -1
  88. package/dist/dashboard/assets/{sequenceDiagram-FGHM5R23-BsRhf00C.js → sequenceDiagram-FGHM5R23-DANhN4OD.js} +1 -1
  89. package/dist/dashboard/assets/{si-LK-N5RQ5JYF-BkjJVIKw.js → si-LK-N5RQ5JYF-D2d4DTQQ.js} +1 -1
  90. package/dist/dashboard/assets/{sk-SK-C5VTKIMK-CGyzVMuS.js → sk-SK-C5VTKIMK-Di1t95sR.js} +1 -1
  91. package/dist/dashboard/assets/{sl-SI-NN7IZMDC-B_v3LIOj.js → sl-SI-NN7IZMDC-CQXx5B1D.js} +1 -1
  92. package/dist/dashboard/assets/{stateDiagram-FHFEXIEX-AHgyeSSd.js → stateDiagram-FHFEXIEX-CpuW4o5E.js} +1 -1
  93. package/dist/dashboard/assets/stateDiagram-v2-QKLJ7IA2-hI3OGuUV.js +1 -0
  94. package/dist/dashboard/assets/{subset-shared.chunk-Ci_oaXw-.js → subset-shared.chunk-CZJii2rp.js} +1 -1
  95. package/dist/dashboard/assets/{subset-worker.chunk-CVvKFWGY.js → subset-worker.chunk-CtJccz91.js} +1 -1
  96. package/dist/dashboard/assets/{sv-SE-XGPEYMSR-D5t6-bQC.js → sv-SE-XGPEYMSR-BtJ_mbLr.js} +1 -1
  97. package/dist/dashboard/assets/{ta-IN-2NMHFXQM-DEKtK_gX.js → ta-IN-2NMHFXQM-Dq22XWgM.js} +1 -1
  98. package/dist/dashboard/assets/{th-TH-HPSO5L25-DRcU9LZ2.js → th-TH-HPSO5L25-ChfIMa5w.js} +1 -1
  99. package/dist/dashboard/assets/{timeline-definition-GMOUNBTQ-PBxzQfC2.js → timeline-definition-GMOUNBTQ-nUPbvtjj.js} +1 -1
  100. package/dist/dashboard/assets/{tr-TR-DEFEU3FU-CBguuduX.js → tr-TR-DEFEU3FU-Lon-b9uf.js} +1 -1
  101. package/dist/dashboard/assets/{uk-UA-QMV73CPH-i0PRyM7M.js → uk-UA-QMV73CPH-BmpXA4GS.js} +1 -1
  102. package/dist/dashboard/assets/{vennDiagram-DHZGUBPP-YAtaCt6v.js → vennDiagram-DHZGUBPP-Cfq6Ys0H.js} +1 -1
  103. package/dist/dashboard/assets/{vi-VN-M7AON7JQ-NwV9F7AH.js → vi-VN-M7AON7JQ-gUFADT8k.js} +1 -1
  104. package/dist/dashboard/assets/{wardley-RL74JXVD-fgxrOw2v.js → wardley-RL74JXVD-DbjyRI1F.js} +1 -1
  105. package/dist/dashboard/assets/{wardleyDiagram-NUSXRM2D-Dpq96Mxt.js → wardleyDiagram-NUSXRM2D-D7kJ-35q.js} +1 -1
  106. package/dist/dashboard/assets/{xychartDiagram-5P7HB3ND-DiPx1Q_d.js → xychartDiagram-5P7HB3ND-Bt41FbXl.js} +1 -1
  107. package/dist/dashboard/assets/{zh-CN-LNUGB5OW-DkOI6Dmv.js → zh-CN-LNUGB5OW-GEnnC6n4.js} +1 -1
  108. package/dist/dashboard/assets/{zh-HK-E62DVLB3-lIsB7f8U.js → zh-HK-E62DVLB3-bQyXnsrh.js} +1 -1
  109. package/dist/dashboard/assets/{zh-TW-RAJ6MFWO-DbxNlWLc.js → zh-TW-RAJ6MFWO-Buauia8Y.js} +1 -1
  110. package/dist/dashboard/index.html +2 -2
  111. package/dist/index.js +232 -85
  112. package/package.json +3 -3
  113. package/dist/dashboard/assets/channel-C8dyNz3Z.js +0 -1
  114. package/dist/dashboard/assets/classDiagram-6PBFFD2Q-BAOXjBRe.js +0 -1
  115. package/dist/dashboard/assets/classDiagram-v2-HSJHXN6E-BAOXjBRe.js +0 -1
  116. package/dist/dashboard/assets/clone-Cpvwh6xu.js +0 -1
  117. package/dist/dashboard/assets/stateDiagram-v2-QKLJ7IA2-XVTOYBBV.js +0 -1
package/dist/index.js CHANGED
@@ -38750,6 +38750,27 @@ function readGlobalGitHubLogin(home) {
38750
38750
  const v = readGlobalSecretsFile(home).github?.login;
38751
38751
  return v && v.trim() ? v.trim() : null;
38752
38752
  }
38753
+ function readGlobalGitHubNeedsReconnect(home) {
38754
+ const gh = readGlobalSecretsFile(home).github;
38755
+ return !!(gh?.token && gh.token.trim() && gh.needsReconnect === true);
38756
+ }
38757
+ function setGlobalGitHubAuthValid(valid, home) {
38758
+ const secrets = readGlobalSecretsFile(home);
38759
+ const gh = secrets.github;
38760
+ if (!gh?.token || !gh.token.trim()) return;
38761
+ const current = gh.needsReconnect === true;
38762
+ const next = !valid;
38763
+ if (current === next) return;
38764
+ if (next) gh.needsReconnect = true;
38765
+ else delete gh.needsReconnect;
38766
+ const path2 = globalSecretsPath(home);
38767
+ mkdirSync27(dirname23(path2), { recursive: true });
38768
+ writeFileSync32(path2, JSON.stringify(secrets, null, 2) + "\n", { encoding: "utf-8", mode: 384 });
38769
+ try {
38770
+ chmodSync3(path2, 384);
38771
+ } catch {
38772
+ }
38773
+ }
38753
38774
  function clearGlobalGitHubToken(home) {
38754
38775
  const path2 = globalSecretsPath(home);
38755
38776
  if (!existsSync45(path2)) return;
@@ -38757,6 +38778,7 @@ function clearGlobalGitHubToken(home) {
38757
38778
  if (secrets.github) {
38758
38779
  delete secrets.github.token;
38759
38780
  delete secrets.github.login;
38781
+ delete secrets.github.needsReconnect;
38760
38782
  }
38761
38783
  writeFileSync32(path2, JSON.stringify(secrets, null, 2) + "\n", { encoding: "utf-8", mode: 384 });
38762
38784
  try {
@@ -46682,6 +46704,10 @@ function attachProjectOrigin(opts) {
46682
46704
  setProjectOrigin(opts.projectRoot, remote, opts.gitModule);
46683
46705
  return { remote, fullName: `${slug.owner}/${slug.repo}` };
46684
46706
  }
46707
+ function detachProjectOrigin(projectRoot, gitModule = git_exports) {
46708
+ if (!gitModule.isGitRepo(projectRoot)) return;
46709
+ if (gitModule.getRemoteUrl(projectRoot, "origin")) gitModule.removeRemote(projectRoot, "origin");
46710
+ }
46685
46711
  var REPO_NAME_RE;
46686
46712
  var init_origin_setup = __esm({
46687
46713
  "src/lib/git-sync/origin-setup.ts"() {
@@ -50914,6 +50940,109 @@ var init_static = __esm({
50914
50940
  }
50915
50941
  });
50916
50942
 
50943
+ // src/server/lifecycle.ts
50944
+ function trackChild(child) {
50945
+ const kill = typeof child === "function" ? child : () => {
50946
+ try {
50947
+ child.kill();
50948
+ } catch {
50949
+ }
50950
+ };
50951
+ liveChildren.add(kill);
50952
+ return () => liveChildren.delete(kill);
50953
+ }
50954
+ function killTrackedChildren() {
50955
+ for (const kill of liveChildren) {
50956
+ try {
50957
+ kill();
50958
+ } catch {
50959
+ }
50960
+ }
50961
+ liveChildren.clear();
50962
+ }
50963
+ function startVersionDriftWatch(startupVersion, readDiskVersion, onDrift, pollMs = 3e4) {
50964
+ if (process.env.DREAMCONTEXT_DESKTOP === "1") return void 0;
50965
+ if (!startupVersion || startupVersion === "0.0.0") return void 0;
50966
+ let fired = false;
50967
+ const timer = setInterval(() => {
50968
+ let disk = "0.0.0";
50969
+ try {
50970
+ disk = readDiskVersion();
50971
+ } catch {
50972
+ return;
50973
+ }
50974
+ if (disk !== "0.0.0" && disk !== startupVersion && !fired) {
50975
+ fired = true;
50976
+ clearInterval(timer);
50977
+ onDrift(disk);
50978
+ }
50979
+ }, pollMs);
50980
+ timer.unref?.();
50981
+ return () => clearInterval(timer);
50982
+ }
50983
+ function getUpgradeReadyVersion() {
50984
+ return upgradeReadyVersion;
50985
+ }
50986
+ function startUpgradeReadyWatch(startupVersion, readDiskVersion, pollMs = 3e4) {
50987
+ if (process.env.DREAMCONTEXT_DESKTOP !== "1") return void 0;
50988
+ if (!startupVersion || startupVersion === "0.0.0") return void 0;
50989
+ upgradeReadyVersion = null;
50990
+ const timer = setInterval(() => {
50991
+ let disk = "0.0.0";
50992
+ try {
50993
+ disk = readDiskVersion();
50994
+ } catch {
50995
+ return;
50996
+ }
50997
+ if (disk !== "0.0.0" && compareVersions(disk, startupVersion) > 0) {
50998
+ upgradeReadyVersion = disk;
50999
+ clearInterval(timer);
51000
+ }
51001
+ }, pollMs);
51002
+ timer.unref?.();
51003
+ return () => clearInterval(timer);
51004
+ }
51005
+ function registerShutdownHandler(fn) {
51006
+ shutdownHandler = fn;
51007
+ }
51008
+ function requestShutdown() {
51009
+ if (!shutdownHandler) return false;
51010
+ shutdownHandler();
51011
+ return true;
51012
+ }
51013
+ function startParentDeathWatch(onParentGone) {
51014
+ if (process.env.DREAMCONTEXT_DESKTOP !== "1") return void 0;
51015
+ const envPid = Number(process.env.DREAMCONTEXT_PARENT_PID);
51016
+ const parentPid = Number.isInteger(envPid) && envPid > 1 ? envPid : process.ppid;
51017
+ if (!Number.isInteger(parentPid) || parentPid <= 1) return void 0;
51018
+ let fired = false;
51019
+ const timer = setInterval(() => {
51020
+ let gone = false;
51021
+ try {
51022
+ process.kill(parentPid, 0);
51023
+ } catch (err) {
51024
+ gone = err.code === "ESRCH";
51025
+ }
51026
+ if (gone && !fired) {
51027
+ fired = true;
51028
+ clearInterval(timer);
51029
+ onParentGone();
51030
+ }
51031
+ }, 2e3);
51032
+ timer.unref?.();
51033
+ return () => clearInterval(timer);
51034
+ }
51035
+ var liveChildren, upgradeReadyVersion, shutdownHandler;
51036
+ var init_lifecycle = __esm({
51037
+ "src/server/lifecycle.ts"() {
51038
+ "use strict";
51039
+ init_version_check();
51040
+ liveChildren = /* @__PURE__ */ new Set();
51041
+ upgradeReadyVersion = null;
51042
+ shutdownHandler = null;
51043
+ }
51044
+ });
51045
+
50917
51046
  // src/server/routes/health.ts
50918
51047
  async function handleHealthGet(_req, res, _params, contextRoot) {
50919
51048
  sendJson(res, 200, {
@@ -50922,7 +51051,11 @@ async function handleHealthGet(_req, res, _params, contextRoot) {
50922
51051
  capabilities: CAPABILITIES,
50923
51052
  // The version this PROCESS is running (not what's on disk) — the bundle
50924
51053
  // and ensure-dashboard compare it against their own to detect skew.
50925
- version: dreamcontextVersion()
51054
+ version: dreamcontextVersion(),
51055
+ // Desktop self-heal: the newer on-disk version when an upgrade landed under
51056
+ // this running server (else null). The bundle uses it to auto-relaunch the
51057
+ // app onto the new version without any manual quit/reopen.
51058
+ upgradeReady: getUpgradeReadyVersion()
50926
51059
  });
50927
51060
  }
50928
51061
  var CAPABILITIES;
@@ -50931,6 +51064,7 @@ var init_health = __esm({
50931
51064
  "use strict";
50932
51065
  init_middleware();
50933
51066
  init_manifest();
51067
+ init_lifecycle();
50934
51068
  CAPABILITIES = [
50935
51069
  "tasks.members",
50936
51070
  "tasks.delete",
@@ -60664,11 +60798,17 @@ async function handleLauncherRelaunch(_req, res, _params, _contextRoot) {
60664
60798
  sendJson(res, 200, { ok: false, reason: "app_not_installed" });
60665
60799
  return;
60666
60800
  }
60801
+ const now = Date.now();
60802
+ if (now - lastRelaunchArmedAt < RELAUNCH_ARM_TTL_MS) {
60803
+ sendJson(res, 200, { ok: true, alreadyArmed: true });
60804
+ return;
60805
+ }
60667
60806
  try {
60668
60807
  const child = spawn4("/bin/sh", ["-c", 'sleep 2; open "$0"', appPath], {
60669
60808
  detached: true,
60670
60809
  stdio: "ignore"
60671
60810
  });
60811
+ lastRelaunchArmedAt = now;
60672
60812
  child.on("error", () => {
60673
60813
  });
60674
60814
  child.unref();
@@ -60858,7 +60998,7 @@ async function handleLauncherShareable(req, res, _params, _contextRoot) {
60858
60998
  sendError(res, 500, "shareable_failed", "Failed to update sharing.");
60859
60999
  }
60860
61000
  }
60861
- var execFileAsync2, captureRuns, CAPTURE_RUN_TTL_MS, CAPTURE_RUNS_MAX, sleepJobsInFlight, ScaffoldError, defaultCliRunner, SAFE_NAME_RE, AGENT_UI_DEFAULTS, SLEEPY_MODES, upgradeRun, UPGRADE_MAX_MS, addOut, addIn, dropOut, dropIn;
61001
+ var execFileAsync2, captureRuns, CAPTURE_RUN_TTL_MS, CAPTURE_RUNS_MAX, sleepJobsInFlight, ScaffoldError, defaultCliRunner, SAFE_NAME_RE, AGENT_UI_DEFAULTS, SLEEPY_MODES, upgradeRun, UPGRADE_MAX_MS, lastRelaunchArmedAt, RELAUNCH_ARM_TTL_MS, addOut, addIn, dropOut, dropIn;
60862
61002
  var init_launcher = __esm({
60863
61003
  "src/server/routes/launcher.ts"() {
60864
61004
  "use strict";
@@ -60913,6 +61053,8 @@ var init_launcher = __esm({
60913
61053
  SLEEPY_MODES = /* @__PURE__ */ new Set(["idle", "sleepy", "sleeps"]);
60914
61054
  upgradeRun = null;
60915
61055
  UPGRADE_MAX_MS = 12 * 60 * 1e3;
61056
+ lastRelaunchArmedAt = 0;
61057
+ RELAUNCH_ARM_TTL_MS = 1e4;
60916
61058
  addOut = (d) => d === "in" || d === "both" ? "both" : "out";
60917
61059
  addIn = (d) => d === "out" || d === "both" ? "both" : "in";
60918
61060
  dropOut = (d) => d === "both" ? "in" : d === "in" ? "in" : null;
@@ -61900,85 +62042,6 @@ var init_desktop = __esm({
61900
62042
  }
61901
62043
  });
61902
62044
 
61903
- // src/server/lifecycle.ts
61904
- function trackChild(child) {
61905
- const kill = typeof child === "function" ? child : () => {
61906
- try {
61907
- child.kill();
61908
- } catch {
61909
- }
61910
- };
61911
- liveChildren.add(kill);
61912
- return () => liveChildren.delete(kill);
61913
- }
61914
- function killTrackedChildren() {
61915
- for (const kill of liveChildren) {
61916
- try {
61917
- kill();
61918
- } catch {
61919
- }
61920
- }
61921
- liveChildren.clear();
61922
- }
61923
- function startVersionDriftWatch(startupVersion, readDiskVersion, onDrift, pollMs = 3e4) {
61924
- if (process.env.DREAMCONTEXT_DESKTOP === "1") return void 0;
61925
- if (!startupVersion || startupVersion === "0.0.0") return void 0;
61926
- let fired = false;
61927
- const timer = setInterval(() => {
61928
- let disk = "0.0.0";
61929
- try {
61930
- disk = readDiskVersion();
61931
- } catch {
61932
- return;
61933
- }
61934
- if (disk !== "0.0.0" && disk !== startupVersion && !fired) {
61935
- fired = true;
61936
- clearInterval(timer);
61937
- onDrift(disk);
61938
- }
61939
- }, pollMs);
61940
- timer.unref?.();
61941
- return () => clearInterval(timer);
61942
- }
61943
- function registerShutdownHandler(fn) {
61944
- shutdownHandler = fn;
61945
- }
61946
- function requestShutdown() {
61947
- if (!shutdownHandler) return false;
61948
- shutdownHandler();
61949
- return true;
61950
- }
61951
- function startParentDeathWatch(onParentGone) {
61952
- if (process.env.DREAMCONTEXT_DESKTOP !== "1") return void 0;
61953
- const envPid = Number(process.env.DREAMCONTEXT_PARENT_PID);
61954
- const parentPid = Number.isInteger(envPid) && envPid > 1 ? envPid : process.ppid;
61955
- if (!Number.isInteger(parentPid) || parentPid <= 1) return void 0;
61956
- let fired = false;
61957
- const timer = setInterval(() => {
61958
- let gone = false;
61959
- try {
61960
- process.kill(parentPid, 0);
61961
- } catch (err) {
61962
- gone = err.code === "ESRCH";
61963
- }
61964
- if (gone && !fired) {
61965
- fired = true;
61966
- clearInterval(timer);
61967
- onParentGone();
61968
- }
61969
- }, 2e3);
61970
- timer.unref?.();
61971
- return () => clearInterval(timer);
61972
- }
61973
- var liveChildren, shutdownHandler;
61974
- var init_lifecycle = __esm({
61975
- "src/server/lifecycle.ts"() {
61976
- "use strict";
61977
- liveChildren = /* @__PURE__ */ new Set();
61978
- shutdownHandler = null;
61979
- }
61980
- });
61981
-
61982
62045
  // node_modules/ws/lib/constants.js
61983
62046
  var require_constants5 = __commonJS({
61984
62047
  "node_modules/ws/lib/constants.js"(exports2, module2) {
@@ -67026,7 +67089,8 @@ async function handleVersionCheckGet(_req, res, _params, contextRoot) {
67026
67089
  const projectRoot = dirname61(contextRoot);
67027
67090
  const cache = readVersionCache(projectRoot);
67028
67091
  const fresh = isCacheFresh(cache);
67029
- const installedCli = dreamcontextVersion();
67092
+ const freshCli = readDreamcontextVersionFromDisk();
67093
+ const installedCli = freshCli === "0.0.0" ? dreamcontextVersion() : freshCli;
67030
67094
  const catalogPackNames = cache?.availablePacks ?? [];
67031
67095
  const installedPacks = catalogPackNames.filter((name) => isSkillInstalled(projectRoot, name));
67032
67096
  const newPacks = fresh ? catalogPackNames.filter((name) => !installedPacks.includes(name)) : [];
@@ -67344,6 +67408,7 @@ async function handleBrainAuthDevicePoll(req, res) {
67344
67408
  login = null;
67345
67409
  }
67346
67410
  if (login) setGlobalGitHubLogin(login, authHome);
67411
+ setGlobalGitHubAuthValid(true, authHome);
67347
67412
  deviceSessions.delete(sessionId);
67348
67413
  sendJson(res, 200, { status: "authorized", login });
67349
67414
  return;
@@ -67380,6 +67445,9 @@ async function handleBrainAuthStatus(req, res) {
67380
67445
  connected: true,
67381
67446
  login: readGlobalGitHubLogin(authHome) ?? void 0,
67382
67447
  source: "global",
67448
+ // Read straight off the shared truth the sync path writes — so this chip
67449
+ // and the sidebar sync surface can never disagree about the session.
67450
+ needsReconnect: readGlobalGitHubNeedsReconnect(authHome),
67383
67451
  oauthConfigured
67384
67452
  });
67385
67453
  return;
@@ -67414,7 +67482,8 @@ async function handleBrainAuthToken(req, res) {
67414
67482
  }
67415
67483
  writeGlobalGitHubToken(token, authHome);
67416
67484
  setGlobalGitHubLogin(login, authHome);
67417
- sendJson(res, 200, { connected: true, login, source: "global" });
67485
+ setGlobalGitHubAuthValid(true, authHome);
67486
+ sendJson(res, 200, { connected: true, login, source: "global", needsReconnect: false });
67418
67487
  }
67419
67488
  async function handleBrainAuthLogout(req, res) {
67420
67489
  if (!gate(res)) return;
@@ -67516,7 +67585,15 @@ function classifySyncError(rawMessage, repoHint) {
67516
67585
  message: `Your GitHub token can't write to${named || " this repo"}. Give it Contents (read & write) access${repo ? ` on ${repo}` : ""}, then retry.`
67517
67586
  };
67518
67587
  }
67519
- if (/authentication failed|could not read Username|bad credentials|invalid credentials|401\b|terminal prompts disabled|Support for password authentication|no github token found/i.test(m)) {
67588
+ if (/no github token found|no token found for the brain/i.test(m)) {
67589
+ return {
67590
+ kind: "no-token",
67591
+ recovery: "reconnect-github",
67592
+ repo,
67593
+ message: "Cloud sync needs a GitHub account. Connect GitHub to start syncing."
67594
+ };
67595
+ }
67596
+ if (/authentication failed|could not read Username|bad credentials|invalid credentials|401\b|terminal prompts disabled|Support for password authentication/i.test(m)) {
67520
67597
  return {
67521
67598
  kind: "auth",
67522
67599
  recovery: "reconnect-github",
@@ -67634,6 +67711,7 @@ async function handleBrainSync(req, res, _params, contextRoot) {
67634
67711
  async function runSyncPayload(projectRoot, contextRoot, opts) {
67635
67712
  try {
67636
67713
  const result = await runBrainSync({ cwd: contextRoot, mode: opts.mode, foreground: opts.foreground, noCheckpoint: opts.noCheckpoint });
67714
+ if (AUTH_OK_ACTIONS.has(result.action)) setGlobalGitHubAuthValid(true);
67637
67715
  let failure;
67638
67716
  if (result.action === "no-remote" && /token/i.test(result.note ?? "")) {
67639
67717
  failure = classifySyncError(result.note ?? "no github token found", syncRepoHint(projectRoot));
@@ -67650,6 +67728,8 @@ async function runSyncPayload(projectRoot, contextRoot, opts) {
67650
67728
  };
67651
67729
  } catch (err) {
67652
67730
  const failure = classifySyncError(err.message, syncRepoHint(projectRoot));
67731
+ if (failure.kind === "auth") setGlobalGitHubAuthValid(false);
67732
+ else if (failure.kind === "permission") setGlobalGitHubAuthValid(true);
67653
67733
  return {
67654
67734
  action: "error",
67655
67735
  pulledUpdates: 0,
@@ -67729,6 +67809,12 @@ function enableFullRepo(projectRoot) {
67729
67809
  });
67730
67810
  ensureFullRepoGitignore(projectRoot, config?.taskBackend);
67731
67811
  }
67812
+ function disableFullRepo(projectRoot) {
67813
+ const config = readSetupConfig(projectRoot);
67814
+ updateSetupConfig(projectRoot, {
67815
+ brainRepo: { ...config?.brainRepo ?? {}, mode: "in-tree", enabled: false }
67816
+ });
67817
+ }
67732
67818
  function currentOrigin(projectRoot) {
67733
67819
  try {
67734
67820
  return isGitRepo(projectRoot) ? getRemoteUrl(projectRoot, "origin") : null;
@@ -67803,6 +67889,62 @@ async function handleBrainOriginAttach(req, res, _params, contextRoot) {
67803
67889
  sendError(res, 400, "attach_failed", err.message);
67804
67890
  }
67805
67891
  }
67892
+ async function handleBrainOriginUpdate(req, res, _params, contextRoot) {
67893
+ if (!gate2(res)) return;
67894
+ const projectRoot = dirname62(contextRoot);
67895
+ const body = await parseJsonBody(req);
67896
+ const url = typeof body?.url === "string" ? body.url.trim() : "";
67897
+ if (!url) {
67898
+ sendError(res, 400, "invalid_body", "url is required.");
67899
+ return;
67900
+ }
67901
+ if (!resolveBrainSyncToken(projectRoot)) {
67902
+ sendError(res, 401, "no_token", "Sign in with GitHub before changing the repo.");
67903
+ return;
67904
+ }
67905
+ if (!currentOrigin(projectRoot)) {
67906
+ sendError(res, 409, "no_origin", "This project has no git origin yet \u2014 use Connect to set one.");
67907
+ return;
67908
+ }
67909
+ const preview = await previewOrigin({ projectRoot, url });
67910
+ if (!preview.reachable) {
67911
+ sendError(res, 400, "unreachable", preview.reason ?? "That repo could not be reached with your GitHub account.");
67912
+ return;
67913
+ }
67914
+ const canonical = canonicalRemote(url);
67915
+ if (!canonical) {
67916
+ sendError(res, 400, "invalid_body", "That does not look like a GitHub repo URL.");
67917
+ return;
67918
+ }
67919
+ try {
67920
+ setProjectOrigin(projectRoot, canonical);
67921
+ disableFullRepo(projectRoot);
67922
+ sendJson(res, 200, { ok: true, remote: canonical, fullName: preview.fullName, private: preview.private, syncDisabled: true });
67923
+ } catch (err) {
67924
+ sendError(res, 400, "update_failed", err.message);
67925
+ }
67926
+ }
67927
+ async function handleBrainOriginDetach(_req, res, _params, contextRoot) {
67928
+ if (!gate2(res)) return;
67929
+ const projectRoot = dirname62(contextRoot);
67930
+ let mergeInProgress = false;
67931
+ try {
67932
+ mergeInProgress = isGitRepo(projectRoot) && hasMergeHead(projectRoot);
67933
+ } catch {
67934
+ mergeInProgress = false;
67935
+ }
67936
+ if (mergeInProgress) {
67937
+ sendError(res, 409, "merge_in_progress", "Finish or resolve the in-progress merge before disconnecting the origin.");
67938
+ return;
67939
+ }
67940
+ try {
67941
+ detachProjectOrigin(projectRoot);
67942
+ disableFullRepo(projectRoot);
67943
+ sendJson(res, 200, { ok: true, remote: null });
67944
+ } catch (err) {
67945
+ sendError(res, 400, "detach_failed", err.message);
67946
+ }
67947
+ }
67806
67948
  function isSafeToGitignore(relPath) {
67807
67949
  const p = relPath.replace(/\\/g, "/").trim();
67808
67950
  if (!p) return false;
@@ -67865,7 +68007,7 @@ async function handleBrainTeamFetch(req, res) {
67865
68007
  sendError(res, 502, "team_fetch_failed", err.message);
67866
68008
  }
67867
68009
  }
67868
- var SAFE_TO_GITIGNORE;
68010
+ var AUTH_OK_ACTIONS, SAFE_TO_GITIGNORE;
67869
68011
  var init_brain2 = __esm({
67870
68012
  "src/server/routes/brain.ts"() {
67871
68013
  "use strict";
@@ -67879,8 +68021,10 @@ var init_brain2 = __esm({
67879
68021
  init_team_fetch();
67880
68022
  init_conflict_report();
67881
68023
  init_failure();
68024
+ init_auth_store();
67882
68025
  init_gitignore();
67883
68026
  init_vaults();
68027
+ AUTH_OK_ACTIONS = /* @__PURE__ */ new Set(["pulled", "pushed", "noop", "merged", "blocked-scrub", "awaiting-agent", "code-conflict"]);
67884
68028
  SAFE_TO_GITIGNORE = /(^|\/)([^/]*\.env(\.[^/]+)?|[^/]*\.local\.[^/]+|[^/]*secrets?[^/]*\.(json|ya?ml|toml|env)|credentials?[^/]*\.(json|ya?ml|toml|env)|[^/]*\.(pem|key|p12|pfx|keystore|jks)|id_rsa[^/]*|id_ed25519[^/]*)$/i;
67885
68029
  }
67886
68030
  });
@@ -68048,6 +68192,8 @@ function buildRouter() {
68048
68192
  router.post("/api/brain/origin/create", handleBrainOriginCreate);
68049
68193
  router.post("/api/brain/origin/preview", handleBrainOriginPreview);
68050
68194
  router.post("/api/brain/origin/attach", handleBrainOriginAttach);
68195
+ router.post("/api/brain/origin/update", handleBrainOriginUpdate);
68196
+ router.post("/api/brain/origin/detach", handleBrainOriginDetach);
68051
68197
  router.post("/api/brain/scrub/ignore", handleBrainScrubIgnore);
68052
68198
  router.get("/api/linked-repos", handleLinkedReposList);
68053
68199
  router.post("/api/linked-repos/link", handleLinkedReposLink);
@@ -68247,6 +68393,7 @@ function startDashboardServer(options2) {
68247
68393
  dreamcontext was updated to v${diskVersion} \u2014 restarting the dashboard server is required. Exiting; the next session (or \`dreamcontext dashboard\`) starts the new version.`);
68248
68394
  shutdown();
68249
68395
  });
68396
+ startUpgradeReadyWatch(dreamcontextVersion(), readDreamcontextVersionFromDisk);
68250
68397
  });
68251
68398
  });
68252
68399
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dreamcontext",
3
- "version": "0.16.0",
3
+ "version": "0.17.0",
4
4
  "description": "dreamcontext — the persistent brain for your AI agents. Remembers what you built, knows how your project works.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -66,7 +66,7 @@
66
66
  "vitest": "^3.0.6"
67
67
  },
68
68
  "optionalDependencies": {
69
- "node-pty": "^1.1.0",
70
- "@huggingface/transformers": "^4.2.0"
69
+ "@huggingface/transformers": "^4.2.0",
70
+ "node-pty": "^1.1.0"
71
71
  }
72
72
  }
@@ -1 +0,0 @@
1
- import{aq as o,ar as n}from"./index-xYYnjbSx.js";const t=(r,a)=>o.lang.round(n.parse(r)[a]);export{t as c};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-4TB4RGXK-64IoWLUH.js";import{_ as i}from"./index-xYYnjbSx.js";import"./chunk-FMBD7UC4-1vZj5k6I.js";import"./chunk-YZCP3GAM-BHU_oH_c.js";import"./chunk-55IACEB6-oeTs6Ons.js";import"./chunk-EDXVE4YY-DnBDiozF.js";var u={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{u as diagram};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-4TB4RGXK-64IoWLUH.js";import{_ as i}from"./index-xYYnjbSx.js";import"./chunk-FMBD7UC4-1vZj5k6I.js";import"./chunk-YZCP3GAM-BHU_oH_c.js";import"./chunk-55IACEB6-oeTs6Ons.js";import"./chunk-EDXVE4YY-DnBDiozF.js";var u={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{u as diagram};
@@ -1 +0,0 @@
1
- import{b as r}from"./graph-C23F2q3y.js";var e=4;function a(o){return r(o,e)}export{a as c};
@@ -1 +0,0 @@
1
- import{s as t,b as r,a,S as s}from"./chunk-OYMX7WX6-ChzA2Qb2.js";import{_ as i}from"./index-xYYnjbSx.js";import"./chunk-55IACEB6-oeTs6Ons.js";import"./chunk-EDXVE4YY-DnBDiozF.js";var l={parser:a,get db(){return new s(2)},renderer:r,styles:t,init:i(e=>{e.state||(e.state={}),e.state.arrowMarkerAbsolute=e.arrowMarkerAbsolute},"init")};export{l as diagram};