@sift-wiki/conductor 0.1.0 → 0.2.0-beta.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 (132) hide show
  1. package/README.md +28 -58
  2. package/dist/adapters/claudeAgent.js +1 -0
  3. package/dist/adapters/claudeAgent.js.map +1 -1
  4. package/dist/adapters/codexAgent.js +1 -0
  5. package/dist/adapters/codexAgent.js.map +1 -1
  6. package/dist/adapters/fakeAgent.js +1 -0
  7. package/dist/adapters/fakeAgent.js.map +1 -1
  8. package/dist/adapters/httpAgent.js +1 -0
  9. package/dist/adapters/httpAgent.js.map +1 -1
  10. package/dist/adapters/processAgent.js +4 -0
  11. package/dist/adapters/processAgent.js.map +1 -1
  12. package/dist/adapters/provider/runProvider.js +4 -0
  13. package/dist/adapters/provider/runProvider.js.map +1 -1
  14. package/dist/adapters/provider/store.js +3 -4
  15. package/dist/adapters/provider/store.js.map +1 -1
  16. package/dist/adapters/types.d.ts +9 -0
  17. package/dist/cli.d.ts +12 -0
  18. package/dist/cli.js +44 -3
  19. package/dist/cli.js.map +1 -1
  20. package/dist/conductorClient.d.ts +245 -17
  21. package/dist/conductorClient.js +147 -38
  22. package/dist/conductorClient.js.map +1 -1
  23. package/dist/config.js +4 -5
  24. package/dist/config.js.map +1 -1
  25. package/dist/daemon.d.ts +23 -6
  26. package/dist/daemon.js +173 -95
  27. package/dist/daemon.js.map +1 -1
  28. package/dist/desktop/app/contracts.d.ts +71 -0
  29. package/dist/desktop/app/contracts.js +19 -0
  30. package/dist/desktop/app/contracts.js.map +1 -0
  31. package/dist/desktop/app/controller.d.ts +58 -0
  32. package/dist/desktop/app/controller.js +161 -0
  33. package/dist/desktop/app/controller.js.map +1 -0
  34. package/dist/desktop/app/runtimeController.d.ts +29 -0
  35. package/dist/desktop/app/runtimeController.js +55 -0
  36. package/dist/desktop/app/runtimeController.js.map +1 -0
  37. package/dist/localApi/authorizedPairing.d.ts +12 -0
  38. package/dist/localApi/authorizedPairing.js +18 -0
  39. package/dist/localApi/authorizedPairing.js.map +1 -0
  40. package/dist/localApi/contracts.d.ts +264 -0
  41. package/dist/localApi/contracts.js +191 -0
  42. package/dist/localApi/contracts.js.map +1 -0
  43. package/dist/localApi/recovery.d.ts +66 -0
  44. package/dist/localApi/recovery.js +115 -0
  45. package/dist/localApi/recovery.js.map +1 -0
  46. package/dist/localApi/server.d.ts +20 -0
  47. package/dist/localApi/server.js +414 -0
  48. package/dist/localApi/server.js.map +1 -0
  49. package/dist/localApi/workConsole.d.ts +74 -0
  50. package/dist/localApi/workConsole.js +342 -0
  51. package/dist/localApi/workConsole.js.map +1 -0
  52. package/dist/localApi/workContracts.d.ts +213 -0
  53. package/dist/localApi/workContracts.js +130 -0
  54. package/dist/localApi/workContracts.js.map +1 -0
  55. package/dist/localApp/platform.d.ts +2 -0
  56. package/dist/localApp/platform.js +57 -0
  57. package/dist/localApp/platform.js.map +1 -0
  58. package/dist/localApp/service.d.ts +25 -0
  59. package/dist/localApp/service.js +126 -0
  60. package/dist/localApp/service.js.map +1 -0
  61. package/dist/protocol/fenced.d.ts +135 -0
  62. package/dist/protocol/fenced.js +142 -0
  63. package/dist/protocol/fenced.js.map +1 -0
  64. package/dist/redaction.js +2 -0
  65. package/dist/redaction.js.map +1 -1
  66. package/dist/runtime/atomicFile.d.ts +6 -0
  67. package/dist/runtime/atomicFile.js +78 -0
  68. package/dist/runtime/atomicFile.js.map +1 -0
  69. package/dist/runtime/daemonCapabilities.d.ts +7 -0
  70. package/dist/runtime/daemonCapabilities.js +24 -0
  71. package/dist/runtime/daemonCapabilities.js.map +1 -0
  72. package/dist/runtime/eventOutbox.d.ts +100 -0
  73. package/dist/runtime/eventOutbox.js +206 -0
  74. package/dist/runtime/eventOutbox.js.map +1 -0
  75. package/dist/runtime/executionJournal.d.ts +102 -0
  76. package/dist/runtime/executionJournal.js +209 -0
  77. package/dist/runtime/executionJournal.js.map +1 -0
  78. package/dist/runtime/executionSafety.d.ts +76 -0
  79. package/dist/runtime/executionSafety.js +207 -0
  80. package/dist/runtime/executionSafety.js.map +1 -0
  81. package/dist/runtime/fencedExecutionState.d.ts +43 -0
  82. package/dist/runtime/fencedExecutionState.js +158 -0
  83. package/dist/runtime/fencedExecutionState.js.map +1 -0
  84. package/dist/runtime/leaseManager.d.ts +38 -0
  85. package/dist/runtime/leaseManager.js +102 -0
  86. package/dist/runtime/leaseManager.js.map +1 -0
  87. package/dist/runtime/localLogSpool.d.ts +1 -0
  88. package/dist/runtime/localLogSpool.js +4 -0
  89. package/dist/runtime/localLogSpool.js.map +1 -1
  90. package/dist/runtime/localRunQueue.d.ts +1 -1
  91. package/dist/runtime/localRunQueue.js +8 -0
  92. package/dist/runtime/localRunQueue.js.map +1 -1
  93. package/dist/runtime/localSessionCache.d.ts +1 -1
  94. package/dist/runtime/localSessionCache.js.map +1 -1
  95. package/dist/runtime/process.d.ts +13 -1
  96. package/dist/runtime/process.js +39 -9
  97. package/dist/runtime/process.js.map +1 -1
  98. package/dist/runtime/recoveryCoordinator.d.ts +19 -0
  99. package/dist/runtime/recoveryCoordinator.js +183 -0
  100. package/dist/runtime/recoveryCoordinator.js.map +1 -0
  101. package/dist/runtime/runtimeLock.d.ts +33 -0
  102. package/dist/runtime/runtimeLock.js +140 -0
  103. package/dist/runtime/runtimeLock.js.map +1 -0
  104. package/dist/runtime/runtimeService.d.ts +6 -1
  105. package/dist/runtime/runtimeService.js +54 -20
  106. package/dist/runtime/runtimeService.js.map +1 -1
  107. package/dist/runtime/taskExecution.d.ts +2 -0
  108. package/dist/runtime/taskExecution.js +18 -12
  109. package/dist/runtime/taskExecution.js.map +1 -1
  110. package/dist/types.d.ts +28 -13
  111. package/dist/userAuth/service.d.ts +26 -0
  112. package/dist/userAuth/service.js +170 -0
  113. package/dist/userAuth/service.js.map +1 -0
  114. package/dist/userAuth/store.d.ts +42 -0
  115. package/dist/userAuth/store.js +160 -0
  116. package/dist/userAuth/store.js.map +1 -0
  117. package/dist/userAuth/types.d.ts +63 -0
  118. package/dist/userAuth/types.js +29 -0
  119. package/dist/userAuth/types.js.map +1 -0
  120. package/dist/version.d.ts +1 -1
  121. package/dist/version.js +1 -1
  122. package/dist/version.js.map +1 -1
  123. package/dist/workTypes.d.ts +162 -31
  124. package/dist/workTypes.js +31 -0
  125. package/dist/workTypes.js.map +1 -1
  126. package/dist-web/assets/index-CWAdDb9V.js +72 -0
  127. package/dist-web/assets/index-CWfnzdLn.css +1 -0
  128. package/dist-web/index.html +15 -0
  129. package/docs/provider-setup.md +81 -0
  130. package/docs/quickstart.md +62 -0
  131. package/docs/troubleshooting.md +63 -0
  132. package/package.json +13 -3
@@ -0,0 +1 @@
1
+ :root{color:#191a1c;font-synthesis:none;text-rendering:optimizelegibility;letter-spacing:0;--surface:#fff;--background:#f7f7f5;--muted:#6f7378;--border:#dedfdb;--border-strong:#c9cbc6;--ink:#191a1c;--accent:#2958d3;--accent-hover:#2149b1;--green:#25805c;--amber:#a86b18;--red:#b4433d;--sidebar:#202225;background:#f7f7f5;font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}*{box-sizing:border-box}body{background:var(--background);min-width:320px;min-height:100vh;margin:0}button,input,select,textarea{font:inherit;letter-spacing:0}button{cursor:pointer}button:disabled{cursor:not-allowed;opacity:.52}h1,h2,h3,p{margin:0}.app-shell{grid-template-columns:220px minmax(0,1fr);min-height:100vh;display:grid}.sidebar{color:#e8e9e7;background:var(--sidebar);flex-direction:column;height:100vh;padding:18px 12px 14px;display:flex;position:sticky;top:0}.sidebar-brand{width:100%;color:inherit;text-align:left;background:0 0;border:0;align-items:center;gap:10px;padding:0 9px 20px;font-size:14px;display:flex}.sidebar-brand>span{color:#fff;border:1px solid #4b4e52;border-radius:6px;place-items:center;width:28px;height:28px;display:grid}.sidebar nav{gap:3px;display:grid}.nav-item{color:#b7babd;text-align:left;background:0 0;border:0;border-radius:5px;align-items:center;gap:10px;width:100%;height:36px;padding:0 10px;font-size:13px;display:flex}.nav-item:hover{color:#fff;background:#2b2e32}.nav-item.active{color:#fff;background:#34373b}.sidebar-bottom{gap:3px;margin-top:auto;display:grid}.machine-row{border-top:1px solid #393b3e;align-items:center;gap:9px;min-width:0;margin-top:10px;padding:11px 10px 2px;display:flex}.machine-row>span:last-child{min-width:0;display:grid}.machine-row strong{text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:600;overflow:hidden}.machine-row small{color:#8f9397;margin-top:2px;font-size:11px}.machine-dot{background:#6f7378;border-radius:50%;flex:none;width:7px;height:7px}.machine-dot.online{background:#47b483;box-shadow:0 0 0 3px #47b4831f}.main-content{min-width:0;padding:34px clamp(28px,5vw,68px)}.content-header{justify-content:space-between;align-items:flex-start;gap:24px;max-width:1080px;margin:0 auto;display:flex}.content-header h1{font-size:25px;font-weight:650;line-height:1.2}.content-header p{color:var(--muted);margin-top:6px;font-size:13px;line-height:1.5}.header-actions{align-items:center;gap:8px;display:flex}.primary-button,.secondary-button,.text-button{border-radius:5px;justify-content:center;align-items:center;gap:7px;min-height:34px;padding:0 13px;font-size:12px;font-weight:600;display:inline-flex}.primary-button{border:1px solid var(--accent);color:#fff;background:var(--accent)}.primary-button:hover:not(:disabled){border-color:var(--accent-hover);background:var(--accent-hover)}.secondary-button{border:1px solid var(--border-strong);color:#3f4246;background:#fff}.secondary-button:hover:not(:disabled){background:#f2f3f0}.text-button{min-height:28px;color:var(--accent);background:0 0;border:0;padding:0}.full-width{width:100%}.icon-button{color:#676b70;background:0 0;border:1px solid #0000;border-radius:5px;place-items:center;width:30px;height:30px;padding:0;display:inline-grid}.icon-button:hover:not(:disabled){border-color:var(--border);color:var(--ink);background:#f2f3f0}.summary-strip{border:1px solid var(--border);background:var(--surface);border-radius:6px;max-width:1080px;margin:26px auto 16px;display:flex}.summary-strip>div{border-right:1px solid var(--border);align-items:center;gap:10px;min-width:135px;padding:13px 16px;display:flex}.summary-strip>div:last-child{border-right:0}.summary-strip>div>span:last-child{align-items:baseline;gap:6px;display:flex}.summary-strip strong{font-size:14px}.summary-strip small{color:var(--muted);font-size:11px}.summary-dot{border-radius:50%;width:7px;height:7px}.summary-dot.green{background:var(--green)}.summary-dot.amber{background:var(--amber)}.summary-dot.red{background:var(--red)}.agent-list{border:1px solid var(--border);background:var(--surface);border-radius:6px;max-width:1080px;margin:0 auto;overflow:visible}.agent-list-header,.agent-row{grid-template-columns:minmax(230px,1.6fr) minmax(120px,1fr) 100px 126px 104px;align-items:center;column-gap:16px;display:grid}.agent-list-header{border-bottom:1px solid var(--border);color:#85898e;text-transform:uppercase;background:#fafaf8;min-height:36px;padding:0 14px;font-size:10px;font-weight:650}.agent-row{border-bottom:1px solid #e8e9e5;min-height:68px;padding:8px 14px}.agent-row:last-child{border-bottom:0}.agent-row:hover{background:#fbfbf9}.agent-identity{align-items:center;gap:11px;min-width:0;display:flex}.agent-identity>span:last-child{min-width:0;display:grid}.agent-identity strong{text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.agent-identity small{color:var(--muted);margin-top:3px;font-size:11px}.agent-avatar{border-radius:6px;flex:none;place-items:center;width:34px;height:34px;font-size:10px;font-weight:750;display:grid}.agent-avatar.codex{color:#1e5c43;background:#e0f1e9}.agent-avatar.claude{color:#7d4e15;background:#f4e8d7}.row-value{color:#4e5256;text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.status{border-radius:4px;align-items:center;gap:6px;width:fit-content;min-height:24px;padding:0 8px;font-size:10.5px;font-weight:600;display:inline-flex}.status i{border-radius:50%;width:6px;height:6px}.status.ready{color:#1e684a;background:#e6f2ec}.status.ready i{background:#2a8a62}.status.paused{color:#6c7074;background:#edeeeb}.status.paused i{background:#85898d}.status.error{color:#963d37;background:#f7e8e6}.status.error i{background:#bd4e47}.row-actions{justify-content:flex-end;align-items:center;gap:2px;display:flex}.action-menu{position:relative}.action-menu summary{color:#676b70;cursor:pointer;border-radius:5px;place-items:center;width:30px;height:30px;list-style:none;display:grid}.action-menu summary::-webkit-details-marker{display:none}.action-menu[open] summary{color:var(--ink);background:#f2f3f0}.action-menu>div{z-index:5;border:1px solid var(--border);background:#fff;border-radius:5px;width:150px;padding:4px;position:absolute;top:34px;right:0;box-shadow:0 8px 20px #2223251f}.action-menu button{color:#3f4246;background:#fff;border:0;border-radius:4px;align-items:center;gap:7px;width:100%;min-height:32px;padding:0 8px;font-size:11px;display:flex}.action-menu button:hover{background:#f3f4f1}.action-menu button.danger{color:var(--red)}.empty-state{border:1px solid var(--border);max-width:1080px;color:var(--muted);background:var(--surface);text-align:center;border-radius:6px;justify-items:center;margin:0 auto;padding:72px 24px;display:grid}.empty-state h3{color:var(--ink);margin-top:14px;font-size:14px}.empty-state p{max-width:340px;margin-top:6px;font-size:12px;line-height:1.5}.page-error,.inline-error{color:var(--red);font-size:12px;line-height:1.45}.page-error{background:#fff0ee;border:1px solid #e5b7b2;border-radius:5px;max-width:1080px;margin:0 auto 12px;padding:9px 11px}.modal-backdrop{z-index:20;background:#18191b6b;place-items:center;padding:30px;display:grid;position:fixed;inset:0}.wizard{background:#fff;border:1px solid #cfd0cc;border-radius:7px;grid-template-rows:auto auto minmax(330px,1fr) auto;width:min(680px,100%);max-height:calc(100vh - 60px);display:grid;overflow:hidden;box-shadow:0 24px 70px #191a1c3b}.wizard-header{justify-content:space-between;align-items:flex-start;gap:20px;padding:20px 22px 16px;display:flex}.wizard-header h2{font-size:18px;font-weight:650}.wizard-header p{color:var(--muted);margin-top:4px;font-size:12px}.step-rail{border-top:1px solid var(--border);border-bottom:1px solid var(--border);background:#fafaf8;grid-template-columns:repeat(3,1fr);display:grid}.step{border-right:1px solid var(--border);color:#83878b;justify-content:center;align-items:center;gap:7px;height:42px;font-size:11px;font-weight:600;display:flex}.step:last-child{border-right:0}.step span{border:1px solid #c9cbc6;border-radius:50%;place-items:center;width:18px;height:18px;font-size:9px;display:grid}.step.active{color:var(--accent);background:#f3f6ff}.step.active span{border-color:var(--accent);color:#fff;background:var(--accent)}.wizard-body{padding:26px 28px;overflow:auto}.wizard-section{gap:22px;display:grid}.wizard-section h3{font-size:15px;font-weight:650}.wizard-section>div:first-child>p{max-width:520px;color:var(--muted);margin-top:5px;font-size:12px;line-height:1.5}.provider-options{grid-template-columns:1fr 1fr;gap:10px;display:grid}.provider-option{border:1px solid var(--border);min-height:72px;color:var(--ink);text-align:left;background:#fff;border-radius:6px;grid-template-columns:38px 1fr auto;align-items:center;gap:11px;padding:12px;display:grid}.provider-option:hover{background:#fafbff;border-color:#aeb7ce}.provider-option.selected{background:#f6f8ff;border-color:#7e99df;box-shadow:inset 0 0 0 1px #7e99df}.provider-option>span:nth-child(2){display:grid}.provider-option strong{font-size:12px}.provider-option small{color:var(--muted);margin-top:3px;font-size:11px}.provider-option>svg{color:var(--accent)}.provider-icon{color:#3c465b;background:#eceef2;border-radius:6px;place-items:center;width:36px;height:36px;display:grid}.selection-row{border:1px solid var(--border);min-height:58px;color:var(--ink);text-align:left;background:#fff;border-radius:6px;grid-template-columns:auto 1fr auto;align-items:center;gap:12px;padding:10px 12px;display:grid}.selection-row:hover{border-color:var(--border-strong);background:#fafaf8}.selection-row>span{display:grid}.selection-row strong{font-size:12px}.selection-row small{color:var(--muted);margin-top:3px;font-size:11px}.selection-row>svg:first-child{color:var(--accent)}.access-fieldset{border:0;gap:8px;margin:0;padding:0;display:grid}.access-fieldset legend{color:#4a4e52;margin-bottom:8px;font-size:11px;font-weight:650}.access-option{border:1px solid var(--border);cursor:pointer;border-radius:6px;grid-template-columns:16px 22px 1fr;align-items:start;gap:8px;padding:11px 12px;display:grid}.access-option.selected{background:#f7f9ff;border-color:#96a8d9}.access-option input{margin:3px 0 0}.access-option>svg{color:#69707b;margin-top:1px}.access-option>span{display:grid}.access-option strong{font-size:12px}.access-option small{color:var(--muted);margin-top:3px;font-size:11px;line-height:1.4}.diagnostic{border:1px solid var(--border);border-radius:5px;gap:4px;padding:11px 12px;font-size:11px;display:grid}.diagnostic.error{color:#843934;background:#fff2f0;border-color:#e1b1ac}.field-label{color:#4a4e52;gap:7px;font-size:11px;font-weight:650;display:grid}.field-label input,.form-stack input{border:1px solid var(--border-strong);width:100%;height:38px;color:var(--ink);background:#fff;border-radius:5px;outline:none;padding:0 10px}.field-label input:focus,.form-stack input:focus{border-color:#7e99df;box-shadow:0 0 0 3px #4367c41a}.verification-summary{color:#225c44;background:#f0f8f4;border:1px solid #b8d7c8;border-radius:6px;align-items:center;gap:11px;padding:13px;display:flex}.verification-summary>span{display:grid}.verification-summary strong{font-size:12px}.verification-summary small{color:#4d7563;margin-top:3px;font-size:11px}.wizard-footer{border-top:1px solid var(--border);background:#fafaf8;justify-content:space-between;align-items:center;gap:10px;padding:13px 18px;display:flex}.editor-dialog{background:#fff;border:1px solid #cfd0cc;border-radius:7px;width:min(520px,100%);overflow:hidden;box-shadow:0 24px 70px #191a1c3b}.editor-body{border-top:1px solid var(--border);gap:18px;padding:22px;display:grid}.quota-note{color:var(--muted);font-size:11px;line-height:1.45}.pairing-shell{background:#f3f4f1;place-items:center;min-height:100vh;padding:30px;display:grid}.pairing-panel{border:1px solid var(--border);background:#fff;border-radius:7px;width:min(430px,100%);padding:30px;box-shadow:0 16px 45px #20222517}.pairing-divider{color:var(--muted);text-transform:uppercase;align-items:center;gap:10px;margin:16px 0;font-size:10px;display:flex}.pairing-divider:before,.pairing-divider:after{content:"";background:var(--border);flex:1;height:1px}.brand-mark{color:#fff;background:#272a2e;border-radius:7px;place-items:center;width:38px;height:38px;margin-bottom:18px;display:grid}.pairing-panel h1{font-size:21px}.pairing-panel>p{color:var(--muted);margin-top:7px;font-size:12px;line-height:1.55}.form-stack{gap:14px;margin:24px 0 18px;display:grid}.form-stack label{color:#4a4e52;gap:6px;font-size:11px;font-weight:650;display:grid}.loading-screen{min-height:100vh;color:var(--muted);place-items:center;font-size:13px;display:grid}.page-loading{min-height:50vh;color:var(--muted);place-items:center;font-size:13px;display:grid}.danger-text{color:var(--red)}.state-notice{border-top:1px solid var(--border);border-bottom:1px solid var(--border);max-width:720px;color:var(--muted);text-align:center;justify-items:center;margin:48px auto 0;padding:54px 24px;display:grid}.state-notice svg{color:#777c83}.state-notice h2{color:var(--ink);margin-top:14px;font-size:16px}.state-notice p{max-width:460px;margin:7px 0 18px;font-size:12px;line-height:1.6}.work-header{max-width:1280px}.work-console{border:1px solid var(--border);background:var(--surface);border-radius:6px;grid-template-columns:minmax(290px,360px) minmax(0,1fr);max-width:1280px;min-height:650px;margin:24px auto 0;display:grid;overflow:hidden}.work-queue-pane{border-right:1px solid var(--border);background:#fafaf8;min-width:0}.work-toolbar{border-bottom:1px solid var(--border);justify-content:space-between;align-items:end;gap:12px;min-height:60px;padding:10px 12px;display:flex}.work-toolbar label{color:var(--muted);text-transform:uppercase;gap:4px;font-size:10px;font-weight:650;display:grid}.work-toolbar select{border:1px solid var(--border-strong);width:min(220px,100%);height:30px;color:var(--ink);background:#fff;border-radius:4px;padding:0 28px 0 8px;font-size:12px}.work-toolbar>span{color:var(--muted);white-space:nowrap;font-size:10px}.work-queue{max-height:calc(100vh - 180px);overflow:auto}.work-row{width:100%;min-height:74px;color:var(--ink);text-align:left;background:0 0;border:0;border-bottom:1px solid #e7e8e4;grid-template-columns:8px minmax(0,1fr) auto 15px;align-items:center;gap:9px;padding:10px 10px 10px 12px;display:grid}.work-row:hover{background:#f3f4f0}.work-row.selected{box-shadow:inset 3px 0 0 var(--accent);background:#eef2fb}.work-row>svg{color:#9a9ea2}.work-state-dot{background:#8a8f94;border-radius:50%;width:7px;height:7px}.work-state-dot.needs_review{background:#9b651d}.work-state-dot.blocked,.work-state-dot.needs_attention{background:var(--red)}.work-state-dot.running{background:var(--green);box-shadow:0 0 0 3px #25805c1f}.work-state-dot.finished{background:#7d8287}.work-row-copy{min-width:0;display:grid}.work-row-copy strong{text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;overflow:hidden}.work-row-copy small{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;margin-top:5px;font-size:10.5px;overflow:hidden}.state-chip{color:#5e6267;white-space:nowrap;background:#e9eae7;border-radius:4px;align-items:center;min-height:22px;padding:0 7px;font-size:9.5px;font-weight:700;display:inline-flex}.state-chip.needs_review{color:#845317;background:#f4e9d7}.state-chip.blocked,.state-chip.needs_attention{color:#903c37;background:#f5e5e3}.state-chip.running{color:#1f684a;background:#e2f0e8}.state-chip.ready{color:#35518f;background:#e8edf8}.queue-empty{color:var(--muted);text-align:center;justify-items:center;padding:54px 18px;display:grid}.queue-empty strong{color:var(--ink);margin-top:10px;font-size:12px}.queue-empty span{max-width:220px;margin-top:5px;font-size:10.5px;line-height:1.5}.work-detail-pane{background:#fff;min-width:0}.mobile-work-back{display:none}.work-detail{min-width:0}.detail-header{border-bottom:1px solid var(--border);justify-content:space-between;align-items:flex-start;gap:18px;padding:24px 28px 20px;display:flex}.detail-header>div{justify-items:start;gap:10px;min-width:0;display:grid}.detail-header h2{overflow-wrap:anywhere;font-size:19px;font-weight:650}.detail-header small{color:var(--muted);font-size:10px}.detail-header>.detail-heading-actions{align-items:center;justify-items:initial;flex:none;gap:8px;display:flex}.priority-label{color:var(--muted);text-transform:capitalize;border-left:2px solid #9ca0a5;padding-left:7px;font-size:10px;font-weight:650}.priority-label.critical{border-color:var(--red);color:var(--red)}.priority-label.high{border-color:var(--amber)}.task-body{border-bottom:1px solid var(--border);color:#45494e;white-space:pre-wrap;overflow-wrap:anywhere;padding:20px 28px;font-size:12.5px;line-height:1.65}.run-panel{border-bottom:1px solid var(--border);background:#fbfcfa;padding:20px 28px}.run-heading{justify-content:space-between;align-items:center;gap:16px;display:flex}.run-heading>span{align-items:center;gap:8px;display:flex}.run-heading strong{font-size:12px}.run-heading small{color:var(--muted);font-size:10px}.pulse-dot{background:var(--green);border-radius:50%;width:7px;height:7px}.run-panel>p{color:#3f4448;margin-top:10px;font-size:13px;line-height:1.5}.progress-list{gap:9px;margin:16px 0 0;padding:0;list-style:none;display:grid}.progress-list li{grid-template-columns:8px 1fr;align-items:start;gap:9px;display:grid}.progress-list li>span{background:#fff;border:1px solid #8f969c;border-radius:50%;width:6px;height:6px;margin-top:4px}.progress-list li>div{display:grid}.progress-list strong{color:#565a5f;font-size:10.5px;font-weight:550}.progress-list small{color:#979b9f;margin-top:2px;font-size:9.5px}.trace{border-top:1px solid var(--border);margin-top:14px;padding-top:10px}.trace summary{color:#70757a;cursor:pointer;font-size:10.5px;font-weight:650}.trace p,.trace pre{color:#777c81;white-space:pre-wrap;overflow-wrap:anywhere;margin:8px 0 0;font:10px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace}.detail-band{border-bottom:1px solid var(--border);padding:20px 28px}.detail-band h3,.review-panel h3{color:#4e5358;text-transform:uppercase;margin-bottom:11px;font-size:10px;font-weight:750}.detail-band.warning{color:#7d3b36;background:#fff8f6}.detail-band.warning p{font-size:12px}.detail-band.warning span{color:var(--muted);margin-left:6px;font-size:10px}.artifact-list{gap:7px;display:grid}.artifact-row{border:1px solid var(--border);min-height:50px;color:var(--ink);border-radius:5px;grid-template-columns:20px minmax(0,1fr) auto;align-items:center;gap:9px;padding:8px 10px;text-decoration:none;display:grid}.artifact-row:hover{border-color:var(--border-strong);background:#fafaf8}.artifact-row>svg{color:#5f6d86}.artifact-row>span{display:grid}.artifact-row strong{font-size:11.5px}.artifact-row small{color:var(--muted);margin-top:3px;font-size:10px}.artifact-row em{color:var(--amber);text-transform:uppercase;font-size:9px;font-style:normal;font-weight:650}.review-panel{background:#fffaf1;border-bottom:1px solid #e2cda9;gap:12px;padding:20px 28px;display:grid}.review-panel h3{color:#765021;margin:0}.review-panel p{color:#8a6c45;margin-top:4px;font-size:11px}.review-panel textarea,.comment-composer textarea,.task-dialog textarea{resize:vertical;border:1px solid var(--border-strong);width:100%;min-height:72px;color:var(--ink);background:#fff;border-radius:5px;padding:9px 10px;font-size:12px;line-height:1.5}.review-actions,.detail-actions{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:7px;display:flex}.comment-list{gap:10px;display:grid}.comment-list>div{color:#666b70;grid-template-columns:18px 1fr;gap:8px;display:grid}.comment-list p{color:#454a4f;font-size:11.5px;line-height:1.5}.comment-list small{color:#969a9e;margin-top:3px;font-size:9.5px;display:block}.comment-composer{grid-template-columns:1fr auto;align-items:end;gap:8px;margin-top:14px;display:grid}.comment-composer textarea{min-height:58px}.detail-actions{min-height:62px;padding:12px 28px}.detail-actions select{border:1px solid var(--border-strong);background:#fff;border-radius:5px;min-width:170px;height:34px;padding:0 8px;font-size:11px}.task-dialog{border:1px solid var(--border-strong);background:#fff;border-radius:7px;gap:16px;width:min(520px,100%);padding:20px;display:grid;box-shadow:0 24px 70px #191a1c3b}.task-dialog header,.task-dialog footer{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.task-dialog header p{color:var(--muted);margin-top:4px;font-size:11px}.task-dialog label{color:#555a5f;gap:6px;font-size:11px;font-weight:650;display:grid}.task-dialog input,.task-dialog select{border:1px solid var(--border-strong);background:#fff;border-radius:5px;width:100%;height:36px;padding:0 9px}.task-dialog footer{justify-content:flex-end;padding-top:4px}.activity-filters{border-top:1px solid var(--border);border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;gap:14px;max-width:900px;margin:24px auto 0;padding:10px 12px;display:flex}.activity-filters>label:first-child{min-width:240px;color:var(--muted);flex:1;align-items:center;gap:8px;display:flex}.activity-filters input[type=text],.activity-filters input:not([type]){background:0 0;border:0;outline:0;width:100%;height:32px;font-size:12px}.check-label{color:#555a5f;white-space:nowrap;align-items:center;gap:6px;font-size:11px;display:flex}.activity-feed{max-width:900px;margin:0 auto}.activity-entry{border-bottom:1px solid var(--border);grid-template-columns:10px 1fr auto;align-items:center;gap:10px;min-height:60px;display:grid}.timeline-dot{background:#fff;border:1px solid #8b9095;border-radius:50%;width:7px;height:7px}.activity-entry>div{display:grid}.activity-entry strong{font-size:12px;font-weight:600}.activity-entry small{color:var(--muted);margin-top:4px;font-size:10px}.activity-entry button{color:var(--accent);background:0 0;border:0;font-size:10.5px}.empty-copy{color:var(--muted);text-align:center;padding:46px 0;font-size:12px}.settings-sections{max-width:900px;margin:24px auto 0}.settings-section{border-top:1px solid var(--border);grid-template-columns:minmax(180px,.8fr) minmax(260px,1.2fr);gap:28px;padding:24px 0;display:grid}.settings-section:last-child{border-bottom:1px solid var(--border)}.settings-section h2,.help-section h2{font-size:14px}.settings-section>div:first-child p,.help-section>div p{color:var(--muted);margin-top:5px;font-size:11px;line-height:1.5}.definition-rows{margin:0}.definition-rows>div{border-bottom:1px solid #ecece9;grid-template-columns:110px 1fr;gap:12px;min-height:34px;padding:8px 0;display:grid}.definition-rows dt{color:var(--muted);font-size:10px}.definition-rows dd{color:#44494e;overflow-wrap:anywhere;min-width:0;margin:0;font-size:11px}.settings-actions{grid-column:2;justify-content:flex-end;display:flex}.help-grid{border-top:1px solid var(--border);border-bottom:1px solid var(--border);grid-template-columns:repeat(3,minmax(0,1fr));gap:0;max-width:1040px;margin:26px auto 0;display:grid}.help-section{border-right:1px solid var(--border);flex-direction:column;align-items:flex-start;gap:14px;min-height:300px;padding:26px 22px;display:flex}.help-section:last-child{border-right:0}.help-section>svg{color:#606a77}.help-section>a{color:#3e4d6b;border-bottom:1px solid #ecece9;justify-content:space-between;align-items:center;gap:12px;width:100%;min-height:34px;font-size:11px;text-decoration:none;display:flex}.help-section>p{color:#555b60;font-size:11px;line-height:1.6}.help-section code{color:#3f4a5a;font:10px ui-monospace,SFMono-Regular,Menlo,monospace}.help-section>small{color:var(--muted);margin-top:auto;font-size:9.5px}@media (width<=960px){.app-shell{grid-template-columns:190px minmax(0,1fr)}.main-content{padding-inline:24px}.agent-list-header,.agent-row{grid-template-columns:minmax(210px,1.5fr) minmax(100px,1fr) 110px 94px}.agent-list-header span:nth-child(3),.agent-row>.row-value:nth-child(3){display:none}.work-console{grid-template-columns:minmax(270px,320px) minmax(0,1fr)}.help-grid{grid-template-columns:1fr}.help-section{border-right:0;border-bottom:1px solid var(--border);min-height:auto}}@media (width<=720px){.app-shell{display:block}.sidebar{grid-template-columns:auto 1fr;gap:8px;width:100%;height:auto;padding:9px 10px;display:grid;position:static}.sidebar-brand{width:auto;padding:0}.sidebar-brand strong{display:none}.sidebar nav{justify-content:flex-end;display:flex;overflow-x:auto}.sidebar nav .nav-item{flex:none;width:auto}.sidebar-bottom{border-top:1px solid #393b3e;grid-column:1/-1;padding-top:6px;display:flex}.sidebar-bottom .nav-item{width:auto}.machine-row{display:none}.main-content{padding:24px 16px}.content-header{display:grid}.header-actions{flex-wrap:wrap}.summary-strip{overflow-x:auto}.agent-list-header{display:none}.agent-row{grid-template-columns:1fr auto;gap:8px;padding:13px}.agent-row>.row-value,.agent-row>.status{display:none}.modal-backdrop{padding:0}.wizard{border:0;border-radius:0;width:100%;height:100vh;max-height:none}.provider-options{grid-template-columns:1fr}.work-console{min-height:0;display:block}.work-queue-pane{border-right:0;border-bottom:1px solid var(--border)}.work-queue{max-height:360px}.work-console:not(.mobile-detail-open) .work-detail-pane,.work-console.mobile-detail-open .work-queue-pane{display:none}.mobile-work-back{border:0;border-bottom:1px solid var(--border);color:#4c5662;background:#f8f8f6;align-items:center;gap:7px;width:100%;min-height:42px;padding:0 18px;font-size:11px;font-weight:650;display:flex}.detail-header,.task-body,.run-panel,.detail-band,.review-panel,.detail-actions{padding-inline:18px}.comment-composer{grid-template-columns:1fr}.settings-section{grid-template-columns:1fr;gap:14px}.settings-actions{grid-column:1}.activity-filters{flex-direction:column;align-items:stretch}.task-dialog{border:0;border-radius:0;align-content:start;width:100%;height:100vh}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition:none!important;animation:none!important}}
@@ -0,0 +1,15 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <meta name="color-scheme" content="light" />
7
+ <title>Sift Conductor</title>
8
+ <meta name="sift-conductor-version" content="0.2.0-beta.2">
9
+ <script type="module" crossorigin src="/assets/index-CWAdDb9V.js"></script>
10
+ <link rel="stylesheet" crossorigin href="/assets/index-CWfnzdLn.css">
11
+ </head>
12
+ <body>
13
+ <div id="root"></div>
14
+ </body>
15
+ </html>
@@ -0,0 +1,81 @@
1
+ # Codex And Claude Code Setup
2
+
3
+ ## Local App Flow
4
+
5
+ 1. Run `npx @sift-wiki/conductor@latest start` and open Sift Conductor.
6
+ 2. Pair the computer with a short-lived code from Sift.
7
+ 3. Open **Agents** and choose **Add agent**.
8
+ 4. Choose Codex CLI or Claude Code.
9
+ 5. If the runtime is missing, follow the official provider setup link and
10
+ return to recheck it.
11
+ 6. Complete the provider-owned login flow. Conductor observes only whether the
12
+ provider reports a valid session.
13
+ 7. Choose a local folder with the native folder picker.
14
+ 8. Choose `workspace` to update files or `inspect` for read-only work.
15
+ 9. Run the structured smoke test. It may use provider quota.
16
+ 10. Name the agent and add it. Conductor advertises it only after every check
17
+ passes.
18
+
19
+ Sift Web then lists the advertised agent for assignment and monitoring. Local
20
+ runtime creation stays in Conductor because the browser cannot inspect local
21
+ executables, launch provider login, choose folders, or supervise processes.
22
+
23
+ ## Provider Authentication
24
+
25
+ Codex uses its own `codex login` and `codex login status` commands. Claude Code
26
+ uses its own `claude auth login` and `claude auth status --json` commands.
27
+ Conductor does not request or persist provider API keys, OAuth tokens, or auth
28
+ files.
29
+
30
+ ## Access Profiles
31
+
32
+ `inspect` maps Codex to its read-only sandbox and Claude Code to plan/read-only
33
+ tools.
34
+
35
+ `workspace` maps Codex to workspace-write and Claude Code to file read/edit/write
36
+ tools with dangerous bypass, shell, and web tools excluded from the initial
37
+ preset.
38
+
39
+ The selected workspace path is stored in the owner-restricted local agent file.
40
+ The browser receives only an opaque folder token and basename. Sift receives
41
+ only provider type, version, status, access profile, and non-sensitive
42
+ capabilities.
43
+
44
+ ## Supported Baseline
45
+
46
+ | Provider | Minimum | Fixture baseline | Authentication probe |
47
+ | --- | --- | --- | --- |
48
+ | Codex CLI | `0.100.0` | `0.140.0` on macOS | `codex login status` |
49
+ | Claude Code | `2.1.0` | `2.1.81` on macOS | `claude auth status --json` |
50
+
51
+ Provider versions below the minimum or versions that no longer support the
52
+ required structured output and access flags are blocked by readiness checks.
53
+ GitHub Actions run `29098610087` passed the full automated matrix on macOS and
54
+ Windows with Node.js 20, 22, and 24. That matrix covers provider fixtures,
55
+ paths with spaces, executable overrides, process-tree cancellation, packaged
56
+ CLI installation, renderer redaction, and an actual Electron load.
57
+
58
+ Authenticated local Codex `gpt-5.4` verification completed at both boundaries:
59
+ the provider smoke returned a valid structured result, and a task dispatched
60
+ through an isolated local Sift API was claimed by Conductor and settled as
61
+ `done`. Sift received one health event, two bounded progress events, provider
62
+ usage, and the terminal result; the largest event payload was 307 bytes. The
63
+ deterministic Sift suite also passed completion, review/approval, artifact,
64
+ blocked, policy hard-stop, cancellation, and routine cases through the same
65
+ bridge and settlement contracts.
66
+
67
+ Authenticated Claude Code remains a release gate. Automated Claude fixtures do
68
+ not replace that provider-owned login and live-run check.
69
+
70
+ ## Headless Configuration
71
+
72
+ Headless users can pass a JSON adapter file through `--adapters`. Codex uses
73
+ `type: "codex"`; Claude Code uses `type: "claude-code"`. Paperclip-compatible
74
+ `codex_local` and `claude_local` type aliases are accepted during migration.
75
+
76
+ The CLI doctor performs local executable, version, workspace, and authentication
77
+ checks without pairing or contacting Sift:
78
+
79
+ ```bash
80
+ sift-conductor doctor --adapters ./agents.json
81
+ ```
@@ -0,0 +1,62 @@
1
+ # Sift Conductor Quickstart
2
+
3
+ Sift Conductor connects Codex CLI and Claude Code agents on this computer to a Sift workspace.
4
+
5
+ ## Requirements
6
+
7
+ - Node.js 20 or newer.
8
+ - A Sift account with access to a workspace. A short-lived pairing code remains
9
+ available as a fallback.
10
+ - Codex CLI or Claude Code installed and signed in before adding that provider.
11
+
12
+ ## Start The Local App
13
+
14
+ Start the local service and browser app:
15
+
16
+ ```bash
17
+ npx @sift-wiki/conductor@latest start
18
+ ```
19
+
20
+ Then:
21
+
22
+ 1. Name this computer and choose **Sign in to Sift**.
23
+ 2. Approve the computer and select the workspace in the Sift window. Conductor
24
+ polls for approval and connects the computer without a localhost callback or
25
+ a copied pairing code.
26
+ 3. Open **Agents**, choose **Add agent**, and follow the Codex CLI or Claude Code setup checks.
27
+ 4. Select the local workspace folder and an `inspect` or `workspace` access profile.
28
+ 5. Run the provider smoke test and add the agent.
29
+ 6. Choose **Start runtime**. Work can now be assigned from Sift or the local **Work** view.
30
+
31
+ If account authorization is unavailable, enter a short-lived pairing code in
32
+ the fallback form on the same screen.
33
+
34
+ Conductor binds only to this computer. Keep the terminal process running while local agents are available. Closing the browser does not stop active work; stop the terminal process with `Ctrl+C` when finished.
35
+
36
+ To start without opening the browser automatically:
37
+
38
+ ```bash
39
+ npx @sift-wiki/conductor start --no-open
40
+ ```
41
+
42
+ Open the one-time local URL printed in the terminal.
43
+
44
+ The URL contains a short-lived fragment used once to create a local browser session. Do not reuse an old startup URL after restarting Conductor.
45
+
46
+ ## Headless Operation
47
+
48
+ The existing daemon remains available without the local interface:
49
+
50
+ ```bash
51
+ npx @sift-wiki/conductor run
52
+ ```
53
+
54
+ Headless pairing is also available:
55
+
56
+ ```bash
57
+ npx @sift-wiki/conductor pair --api https://sift-wiki-api.fly.dev --code SC-... --display-name "My computer"
58
+ ```
59
+
60
+ Use `status`, `doctor`, and `logout` to inspect pairing, verify providers, or remove the local machine credential.
61
+
62
+ See [Provider setup](provider-setup.md) and [Troubleshooting](troubleshooting.md) for the supported Codex CLI and Claude Code flows.
@@ -0,0 +1,63 @@
1
+ # Troubleshooting
2
+
3
+ ## Runtime Not Found
4
+
5
+ The local app may not inherit the same `PATH` as an interactive shell. Conductor checks
6
+ `PATH`, common user install locations, and an explicit executable path. Use the
7
+ official provider setup link, install or update the runtime, then select
8
+ **Retest agent**.
9
+
10
+ ## Login Required
11
+
12
+ Use the local app **Sign in** action. Authentication is performed by Codex or
13
+ Claude Code, not by Sift. If login completes but readiness remains red, run the
14
+ provider's status command directly and update the provider before retesting.
15
+
16
+ ## Sift Connection Approval
17
+
18
+ Use **Sign in to Sift** on Conductor's connection screen, approve the computer,
19
+ and select the intended workspace in the hosted Sift window. Conductor uses a
20
+ device flow and polls for approval; it does not require Chrome to open a
21
+ temporary `127.0.0.1` callback.
22
+
23
+ If a blocked localhost callback appears after running the separate `sift login`
24
+ CLI command, close that tab and use Conductor's own sign-in action. The CLI
25
+ callback is not required for Conductor account-led pairing.
26
+
27
+ ## Folder Is Invalid
28
+
29
+ Choose an existing folder. `inspect` requires read access; `workspace` requires
30
+ read and write access. Paths containing spaces are supported because Conductor
31
+ uses argument arrays and stdin rather than shell interpolation.
32
+
33
+ ## Smoke Test Failed
34
+
35
+ The smoke test requires a valid structured result. Common causes are expired
36
+ provider login, unsupported CLI versions, provider quota, malformed provider
37
+ output, or a permission profile the detected version cannot enforce. The agent
38
+ is not advertised until the test passes.
39
+
40
+ ## Agent Is Offline In Sift
41
+
42
+ Check that:
43
+
44
+ 1. the computer is still paired;
45
+ 2. the local runtime is running;
46
+ 3. the agent is enabled and ready;
47
+ 4. the Sift API is reachable;
48
+ 5. the provider is still authenticated.
49
+
50
+ Pausing or removing a local agent marks it inactive but does not delete Sift
51
+ task or run history.
52
+
53
+ ## Cancellation Takes Time
54
+
55
+ Conductor first asks the provider process tree to stop and then force-terminates
56
+ it after the configured grace period. A late provider success is ignored after
57
+ cancellation has been accepted.
58
+
59
+ ## Safe Diagnostics
60
+
61
+ Conductor redacts Sift credentials, pairing codes, home-directory usernames,
62
+ and bounded provider errors. Do not attach raw provider auth files or full
63
+ environment dumps to support requests.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sift-wiki/conductor",
3
- "version": "0.1.0",
3
+ "version": "0.2.0-beta.2",
4
4
  "description": "Local Sift Conductor tracer-bullet CLI daemon.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -25,6 +25,10 @@
25
25
  },
26
26
  "files": [
27
27
  "dist",
28
+ "dist-web",
29
+ "docs/quickstart.md",
30
+ "docs/provider-setup.md",
31
+ "docs/troubleshooting.md",
28
32
  "README.md",
29
33
  "LICENSE",
30
34
  "THIRD_PARTY_NOTICES.md"
@@ -33,15 +37,20 @@
33
37
  "access": "public"
34
38
  },
35
39
  "scripts": {
36
- "build": "tsc -p tsconfig.build.json",
40
+ "build": "pnpm build:server && pnpm build:web",
41
+ "build:server": "tsc -p tsconfig.build.json",
42
+ "build:web": "vite build --config vite.web.config.ts",
37
43
  "clean": "node scripts/clean.mjs",
38
44
  "desktop:renderer": "vite --config vite.desktop.config.ts",
39
- "desktop:build": "pnpm build && tsc -p tsconfig.desktop.json && vite build --config vite.desktop.config.ts",
45
+ "desktop:build": "pnpm build:server && tsc -p tsconfig.desktop.json && vite build --config vite.desktop.config.ts",
40
46
  "desktop:smoke": "pnpm desktop:build && node scripts/smoke-desktop.mjs",
41
47
  "desktop:start": "electron dist-desktop/main/desktop/app/main.js",
42
48
  "desktop:dev": "pnpm desktop:build && pnpm desktop:start",
43
49
  "dev": "tsx src/cli.ts",
44
50
  "lint": "eslint . --max-warnings=0",
51
+ "qa:sandbox:start": "pnpm build && tsx qa/local-web-sandbox/start.ts",
52
+ "qa:sandbox:test": "pnpm build && playwright test --config playwright.config.ts",
53
+ "qa:sandbox:install-browser": "playwright install chromium",
45
54
  "prepack": "pnpm clean && pnpm build && pnpm validate:release && node scripts/validate-package.mjs",
46
55
  "test:package": "pnpm clean && pnpm build && node scripts/test-packed-package.mjs",
47
56
  "test": "vitest run",
@@ -58,6 +67,7 @@
58
67
  "devDependencies": {
59
68
  "@eslint/js": "^9.39.2",
60
69
  "@fission-ai/openspec": "1.4.1",
70
+ "@playwright/test": "^1.61.1",
61
71
  "@testing-library/react": "^16.3.2",
62
72
  "@testing-library/user-event": "^14.6.1",
63
73
  "@types/node": "^24.10.1",