crewly 1.20.122 → 1.20.124
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.
- package/config/skills/agent/core/whatsapp-draft/SKILL.md +80 -0
- package/config/skills/agent/core/whatsapp-draft/execute.sh +84 -0
- package/config/skills/agent/core/whatsapp-draft/execute.test.sh +70 -0
- package/config/skills/agent/core/whatsapp-inbox/SKILL.md +75 -0
- package/config/skills/agent/core/whatsapp-inbox/execute.sh +87 -0
- package/config/skills/agent/core/whatsapp-inbox/execute.test.sh +68 -0
- package/config/skills/agent/core/whatsapp-read/SKILL.md +80 -0
- package/config/skills/agent/core/whatsapp-read/execute.sh +116 -0
- package/config/skills/agent/core/whatsapp-read/execute.test.sh +84 -0
- package/config/skills/agent/core/whatsapp-send/SKILL.md +70 -0
- package/config/skills/agent/core/whatsapp-send/execute.sh +84 -0
- package/config/skills/agent/core/whatsapp-send/execute.test.sh +79 -0
- package/dist/backend/backend/src/constants.d.ts +225 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +223 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/harness/harness.controller.d.ts +54 -0
- package/dist/backend/backend/src/controllers/harness/harness.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/harness/harness.controller.js +204 -0
- package/dist/backend/backend/src/controllers/harness/harness.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/harness/harness.routes.d.ts +27 -0
- package/dist/backend/backend/src/controllers/harness/harness.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/harness/harness.routes.js +43 -0
- package/dist/backend/backend/src/controllers/harness/harness.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.d.ts +73 -0
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.js +310 -0
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.js +53 -4
- package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +4 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +5 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +7 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +5 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts +2 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js +4 -3
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +43 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/claude-config.utils.d.ts +67 -0
- package/dist/backend/backend/src/services/harness/claude-config.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/claude-config.utils.js +118 -0
- package/dist/backend/backend/src/services/harness/claude-config.utils.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-api-key.service.d.ts +99 -0
- package/dist/backend/backend/src/services/harness/harness-api-key.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-api-key.service.js +157 -0
- package/dist/backend/backend/src/services/harness/harness-api-key.service.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts +135 -0
- package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-credentials.store.js +208 -0
- package/dist/backend/backend/src/services/harness/harness-credentials.store.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-exec.utils.d.ts +85 -0
- package/dist/backend/backend/src/services/harness/harness-exec.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-exec.utils.js +183 -0
- package/dist/backend/backend/src/services/harness/harness-exec.utils.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-install.service.d.ts +106 -0
- package/dist/backend/backend/src/services/harness/harness-install.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-install.service.js +205 -0
- package/dist/backend/backend/src/services/harness/harness-install.service.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-registry.d.ts +86 -0
- package/dist/backend/backend/src/services/harness/harness-registry.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-registry.js +121 -0
- package/dist/backend/backend/src/services/harness/harness-registry.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-status.service.d.ts +173 -0
- package/dist/backend/backend/src/services/harness/harness-status.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-status.service.js +324 -0
- package/dist/backend/backend/src/services/harness/harness-status.service.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness.service.d.ts +146 -0
- package/dist/backend/backend/src/services/harness/harness.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness.service.js +193 -0
- package/dist/backend/backend/src/services/harness/harness.service.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness.types.d.ts +138 -0
- package/dist/backend/backend/src/services/harness/harness.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness.types.js +51 -0
- package/dist/backend/backend/src/services/harness/harness.types.js.map +1 -0
- package/dist/backend/backend/src/services/harness/login-broker.service.d.ts +238 -0
- package/dist/backend/backend/src/services/harness/login-broker.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/login-broker.service.js +495 -0
- package/dist/backend/backend/src/services/harness/login-broker.service.js.map +1 -0
- package/dist/backend/backend/src/services/harness/login-rules.d.ts +162 -0
- package/dist/backend/backend/src/services/harness/login-rules.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/login-rules.js +344 -0
- package/dist/backend/backend/src/services/harness/login-rules.js.map +1 -0
- package/dist/backend/backend/src/services/harness/orc-harness.store.d.ts +59 -0
- package/dist/backend/backend/src/services/harness/orc-harness.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/orc-harness.store.js +108 -0
- package/dist/backend/backend/src/services/harness/orc-harness.store.js.map +1 -0
- package/dist/backend/backend/src/services/whatsapp/index.d.ts +5 -1
- package/dist/backend/backend/src/services/whatsapp/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/index.js +5 -1
- package/dist/backend/backend/src/services/whatsapp/index.js.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp-connection-config.d.ts +59 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-connection-config.d.ts.map +1 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-connection-config.js +108 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-connection-config.js.map +1 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.d.ts +74 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.d.ts.map +1 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.js +82 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.js.map +1 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox-capture.d.ts +184 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox-capture.d.ts.map +1 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox-capture.js +420 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox-capture.js.map +1 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox.store.d.ts +243 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox.store.js +538 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-inbox.store.js.map +1 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-initializer.d.ts +32 -2
- package/dist/backend/backend/src/services/whatsapp/whatsapp-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp-initializer.js +65 -9
- package/dist/backend/backend/src/services/whatsapp/whatsapp-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.js +11 -0
- package/dist/backend/backend/src/services/whatsapp/whatsapp-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp.service.d.ts +59 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/whatsapp/whatsapp.service.js +159 -9
- package/dist/backend/backend/src/services/whatsapp/whatsapp.service.js.map +1 -1
- package/dist/backend/backend/src/types/whatsapp.types.d.ts +108 -0
- package/dist/backend/backend/src/types/whatsapp.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/whatsapp.types.js +9 -0
- package/dist/backend/backend/src/types/whatsapp.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +225 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +223 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +5 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +7 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +5 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-client.service.d.ts +2 -1
- package/dist/cli/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-client.service.js +4 -3
- package/dist/cli/backend/src/services/cloud/cloud-client.service.js.map +1 -1
- package/dist/cli/backend/src/services/harness/claude-config.utils.d.ts +67 -0
- package/dist/cli/backend/src/services/harness/claude-config.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/claude-config.utils.js +118 -0
- package/dist/cli/backend/src/services/harness/claude-config.utils.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-api-key.service.d.ts +99 -0
- package/dist/cli/backend/src/services/harness/harness-api-key.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-api-key.service.js +157 -0
- package/dist/cli/backend/src/services/harness/harness-api-key.service.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts +135 -0
- package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-credentials.store.js +208 -0
- package/dist/cli/backend/src/services/harness/harness-credentials.store.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-exec.utils.d.ts +85 -0
- package/dist/cli/backend/src/services/harness/harness-exec.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-exec.utils.js +183 -0
- package/dist/cli/backend/src/services/harness/harness-exec.utils.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-install.service.d.ts +106 -0
- package/dist/cli/backend/src/services/harness/harness-install.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-install.service.js +205 -0
- package/dist/cli/backend/src/services/harness/harness-install.service.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-registry.d.ts +86 -0
- package/dist/cli/backend/src/services/harness/harness-registry.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-registry.js +121 -0
- package/dist/cli/backend/src/services/harness/harness-registry.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-status.service.d.ts +173 -0
- package/dist/cli/backend/src/services/harness/harness-status.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-status.service.js +324 -0
- package/dist/cli/backend/src/services/harness/harness-status.service.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness.service.d.ts +146 -0
- package/dist/cli/backend/src/services/harness/harness.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness.service.js +193 -0
- package/dist/cli/backend/src/services/harness/harness.service.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness.types.d.ts +138 -0
- package/dist/cli/backend/src/services/harness/harness.types.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness.types.js +51 -0
- package/dist/cli/backend/src/services/harness/harness.types.js.map +1 -0
- package/dist/cli/backend/src/services/harness/login-broker.service.d.ts +238 -0
- package/dist/cli/backend/src/services/harness/login-broker.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/login-broker.service.js +495 -0
- package/dist/cli/backend/src/services/harness/login-broker.service.js.map +1 -0
- package/dist/cli/backend/src/services/harness/login-rules.d.ts +162 -0
- package/dist/cli/backend/src/services/harness/login-rules.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/login-rules.js +344 -0
- package/dist/cli/backend/src/services/harness/login-rules.js.map +1 -0
- package/dist/cli/backend/src/services/harness/orc-harness.store.d.ts +59 -0
- package/dist/cli/backend/src/services/harness/orc-harness.store.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/orc-harness.store.js +108 -0
- package/dist/cli/backend/src/services/harness/orc-harness.store.js.map +1 -0
- package/dist/cli/cli/src/commands/harness-setup.d.ts +159 -0
- package/dist/cli/cli/src/commands/harness-setup.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/harness-setup.js +377 -0
- package/dist/cli/cli/src/commands/harness-setup.js.map +1 -0
- package/dist/cli/cli/src/commands/harness.d.ts +56 -0
- package/dist/cli/cli/src/commands/harness.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/harness.js +97 -0
- package/dist/cli/cli/src/commands/harness.js.map +1 -0
- package/dist/cli/cli/src/commands/onboard.d.ts +108 -50
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +200 -191
- package/dist/cli/cli/src/commands/onboard.js.map +1 -1
- package/dist/cli/cli/src/constants.d.ts +18 -0
- package/dist/cli/cli/src/constants.d.ts.map +1 -1
- package/dist/cli/cli/src/constants.js +18 -0
- package/dist/cli/cli/src/constants.js.map +1 -1
- package/dist/cli/cli/src/index.js +22 -3
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/utils/harness-engine.d.ts +99 -0
- package/dist/cli/cli/src/utils/harness-engine.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/harness-engine.js +143 -0
- package/dist/cli/cli/src/utils/harness-engine.js.map +1 -0
- package/dist/cli/cli/src/utils/prompt-io.d.ts +25 -0
- package/dist/cli/cli/src/utils/prompt-io.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/prompt-io.js +47 -0
- package/dist/cli/cli/src/utils/prompt-io.js.map +1 -0
- package/frontend/dist/assets/{index-8327e63e.css → index-0a2f783c.css} +1 -1
- package/frontend/dist/assets/{index-07e338a9.js → index-aaf65055.js} +309 -309
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-rules.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/login-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnE,gCAAgC;AAChC,MAAM,WAAW,gBAAgB;IAChC,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,UAAU,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,6CAA6C;AAC7C,MAAM,WAAW,YAAY;IAC5B,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,aAAa,CAAC;IACtB,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kEAAkE;IAClE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sEAAsE;IACtE,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,2FAA2F;IAC3F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0FAA0F;IAC1F,qBAAqB,EAAE,OAAO,CAAC;IAC/B,uEAAuE;IACvE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gFAAgF;IAChF,kBAAkB,EAAE,OAAO,CAAC;CAC5B;AAED,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC9B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,mDAAmD;IACnD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAcD;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAM5C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CA4BrE;AAmCD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,kBAAkB,CACjC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE;IAAE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9D,MAAM,EAAE,CA+BV;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,UAAQ,GAAG,MAAM,EAAE,CAEtF;AA+BD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,gBAAgB,EACxB,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAChE,cAAc,CAwChB;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,GAAE,SAAS,MAAM,EAAO,GAAG,MAAM,CAmBxF;AAED,6DAA6D;AAC7D,eAAO,MAAM,wBAAwB,EAAE,YAetC,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,uBAAuB,EAAE,YAiBrC,CAAC;AAKF;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEzF"}
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Login rules — per-harness patterns the login broker applies to terminal text.
|
|
3
|
+
*
|
|
4
|
+
* The broker runs a harness's own login command in a PTY and learns what is
|
|
5
|
+
* happening purely from the screen: the sign-in URL, a one-time code, a
|
|
6
|
+
* "paste the code" prompt, success and failure. Nothing here talks to a
|
|
7
|
+
* harness API.
|
|
8
|
+
*
|
|
9
|
+
* Terminal text is messy, so it is normalized first:
|
|
10
|
+
* - ANSI/OSC escapes are removed; OSC 8 hyperlink targets are kept as URL
|
|
11
|
+
* candidates; cursor-forward (`CSI n C`) and cursor-to-column (`CSI n G`)
|
|
12
|
+
* become spaces, which restores the gaps TUIs draw between words.
|
|
13
|
+
* - TUIs such as Claude Code's may render words without spaces, so prompt,
|
|
14
|
+
* success and failure patterns are matched against both the normalized text
|
|
15
|
+
* and a copy with all spaces removed (patterns use `\s*` between words).
|
|
16
|
+
* - A URL (or token) that a TUI wrapped at the terminal width continues on
|
|
17
|
+
* the next line(s); {@link extractWrappedRuns} joins those back.
|
|
18
|
+
*
|
|
19
|
+
* Values are only accepted once they are complete — followed by more output —
|
|
20
|
+
* so a URL that arrives split across two PTY chunks is never exposed half-way.
|
|
21
|
+
*
|
|
22
|
+
* Rule sets are built from real output captured on 2026-09-25 (Claude Code
|
|
23
|
+
* 2.1.282 `claude setup-token`, codex-cli 0.156.1 `codex login --device-auth`);
|
|
24
|
+
* see login-rules.test.ts.
|
|
25
|
+
*
|
|
26
|
+
* @module services/harness/login-rules
|
|
27
|
+
*/
|
|
28
|
+
/* eslint-disable no-control-regex -- terminal escape sequences (ESC, BEL, …) are control characters by definition */
|
|
29
|
+
import { HARNESS_CONSTANTS } from '../../constants.js';
|
|
30
|
+
/** Characters a URL may contain (RFC 3986 unreserved + reserved + `%`). */
|
|
31
|
+
const URL_CHAR_CLASS = "A-Za-z0-9\\-._~:/?#\\[\\]@!$&'()*+,;=%";
|
|
32
|
+
/** A line made only of URL characters (a wrapped URL continuation). */
|
|
33
|
+
const URL_CONTINUATION = new RegExp(`^[${URL_CHAR_CLASS}]+$`);
|
|
34
|
+
/** A run of URL characters starting with http(s)://. */
|
|
35
|
+
const URL_RUN = new RegExp(`https?://[${URL_CHAR_CLASS}]+`, 'g');
|
|
36
|
+
/** Characters of a token-like secret. */
|
|
37
|
+
const TOKEN_CONTINUATION = /^[A-Za-z0-9_-]+$/;
|
|
38
|
+
/**
|
|
39
|
+
* Patterns that look like credentials. Screen text exposed to front ends has
|
|
40
|
+
* every match replaced with {@link HARNESS_CONSTANTS.LOGIN.REDACTED}.
|
|
41
|
+
*/
|
|
42
|
+
export const SECRET_PATTERNS = [
|
|
43
|
+
/sk-ant-[A-Za-z0-9_-]{8,}/g,
|
|
44
|
+
/sk-(?:proj-|svcacct-)?[A-Za-z0-9_-]{20,}/g,
|
|
45
|
+
/eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}/g,
|
|
46
|
+
/\b(?:ghp|gho|ghs|ghu|github_pat|xox[abpr])[-_][A-Za-z0-9_-]{16,}/g,
|
|
47
|
+
/AIza[0-9A-Za-z_-]{30,}/g,
|
|
48
|
+
];
|
|
49
|
+
/**
|
|
50
|
+
* Normalize raw PTY output for rule matching.
|
|
51
|
+
*
|
|
52
|
+
* @param raw - Raw bytes from the PTY, as a string
|
|
53
|
+
* @returns Normalized text, a spaceless copy and OSC 8 hyperlink targets
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* normalizeTerminalOutput('\x1b[1mPaste\x1b[1Ccode\x1b[0m\r\n').text; // 'Paste code\n'
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export function normalizeTerminalOutput(raw) {
|
|
61
|
+
const hyperlinks = [];
|
|
62
|
+
let text = raw.replace(/\x1b\]8;[^;\x07\x1b]*;([^\x07\x1b]*)(?:\x07|\x1b\\)/g, (_match, uri) => {
|
|
63
|
+
if (uri && !hyperlinks.includes(uri))
|
|
64
|
+
hyperlinks.push(uri);
|
|
65
|
+
return '';
|
|
66
|
+
});
|
|
67
|
+
text = text
|
|
68
|
+
// Other OSC sequences (window title, etc.)
|
|
69
|
+
.replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g, '')
|
|
70
|
+
// `\r\r\n` (TUIs) and `\r\n` are one line break; a lone `\r` redraws a line
|
|
71
|
+
.replace(/\r+\n/g, '\n')
|
|
72
|
+
.replace(/\r/g, '\n')
|
|
73
|
+
// Cursor forward: TUIs use it instead of printing spaces
|
|
74
|
+
.replace(/\x1b\[(\d*)C/g, (_match, n) => ' '.repeat(Math.max(1, Number(n) || 1)))
|
|
75
|
+
// Remaining CSI sequences, except cursor-to-column (resolved below)
|
|
76
|
+
.replace(/\x1b\[[0-?]*[ -/]*([@-~])/g, (match, final) => (final === 'G' ? match : ''));
|
|
77
|
+
text = resolveColumnMoves(text)
|
|
78
|
+
// Charset selection and other two-character escapes
|
|
79
|
+
.replace(/\x1b[()][0-9A-Za-z]/g, '')
|
|
80
|
+
.replace(/\x1b[@-Z\\-_]/g, '')
|
|
81
|
+
// Other control characters except newline and tab
|
|
82
|
+
.replace(/[\x00-\x08\x0b-\x1f\x7f]/g, '')
|
|
83
|
+
.split('\n')
|
|
84
|
+
.map((line) => line.replace(/[ \t]+$/, ''))
|
|
85
|
+
.join('\n')
|
|
86
|
+
// Runs of blank lines (TUI frames) collapse to one
|
|
87
|
+
.replace(/\n{3,}/g, '\n\n');
|
|
88
|
+
return { text, spaceless: text.replace(/[ \t]+/g, ''), hyperlinks };
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Turn cursor-to-column moves (`CSI n G`) into spaces.
|
|
92
|
+
*
|
|
93
|
+
* TUIs such as Claude Code's place each word with `CSI n G` instead of
|
|
94
|
+
* printing the space before it (captured 2026-09-25:
|
|
95
|
+
* `\x1b[2GPaste\x1b[8Gcode\x1b[13Ghere…`). Moving right pads the line with
|
|
96
|
+
* spaces up to column n; moving left (an overwrite) becomes a single space.
|
|
97
|
+
*
|
|
98
|
+
* @param text - Text whose only remaining CSI sequences are `CSI n G`
|
|
99
|
+
* @returns Text with the moves replaced
|
|
100
|
+
*/
|
|
101
|
+
function resolveColumnMoves(text) {
|
|
102
|
+
let out = '';
|
|
103
|
+
let column = 0;
|
|
104
|
+
let last = 0;
|
|
105
|
+
const pattern = /\x1b\[(\d*)G/g;
|
|
106
|
+
const advance = (chunk) => {
|
|
107
|
+
out += chunk;
|
|
108
|
+
const newline = chunk.lastIndexOf('\n');
|
|
109
|
+
column = newline === -1 ? column + chunk.length : chunk.length - newline - 1;
|
|
110
|
+
};
|
|
111
|
+
let match;
|
|
112
|
+
while ((match = pattern.exec(text)) !== null) {
|
|
113
|
+
advance(text.slice(last, match.index));
|
|
114
|
+
const target = Math.max(1, Number(match[1]) || 1) - 1;
|
|
115
|
+
if (target > column)
|
|
116
|
+
advance(' '.repeat(target - column));
|
|
117
|
+
else if (target < column && target > 0)
|
|
118
|
+
advance(' ');
|
|
119
|
+
last = match.index + match[0].length;
|
|
120
|
+
}
|
|
121
|
+
advance(text.slice(last));
|
|
122
|
+
return out;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Find runs (URLs, tokens) and join the ones a TUI wrapped across lines.
|
|
126
|
+
*
|
|
127
|
+
* A run that reaches the end of a line at least `minWrappedLineLength` long
|
|
128
|
+
* continues on the next line when that line consists only of continuation
|
|
129
|
+
* characters. Joining stops at the first line that is shorter than the
|
|
130
|
+
* minimum (the last piece of a wrapped run) or that is not a continuation.
|
|
131
|
+
*
|
|
132
|
+
* A run is only returned when it is complete: it ends before the end of its
|
|
133
|
+
* line, or a non-empty line follows it. A run still being written at the end
|
|
134
|
+
* of the buffer (possibly continued by the next PTY chunk) is skipped — unless
|
|
135
|
+
* `final` is set because the process has exited.
|
|
136
|
+
*
|
|
137
|
+
* @param text - Normalized text
|
|
138
|
+
* @param runPattern - Pattern matching a run on one line (the `g` flag is added)
|
|
139
|
+
* @param continuation - Pattern a whole continuation line must match
|
|
140
|
+
* @param options - `minWrappedLineLength` (Infinity disables joining), `final` (no more output will come)
|
|
141
|
+
* @returns Complete runs, in order of appearance
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* ```ts
|
|
145
|
+
* extractWrappedRuns('https://x.io/' + 'a'.repeat(40) + '\nbcd\nnext line\n', /https:\/\/\S+/, /^[a-z]+$/);
|
|
146
|
+
* // ['https://x.io/aaaa…abcd']
|
|
147
|
+
* ```
|
|
148
|
+
*/
|
|
149
|
+
export function extractWrappedRuns(text, runPattern, continuation, options = {}) {
|
|
150
|
+
const minWrappedLineLength = options.minWrappedLineLength ?? HARNESS_CONSTANTS.LOGIN.WRAPPED_LINE_MIN_LENGTH;
|
|
151
|
+
const lines = text.split('\n');
|
|
152
|
+
const runs = [];
|
|
153
|
+
for (let i = 0; i < lines.length; i++) {
|
|
154
|
+
const line = lines[i];
|
|
155
|
+
const pattern = new RegExp(runPattern.source, runPattern.flags.includes('g') ? runPattern.flags : `${runPattern.flags}g`);
|
|
156
|
+
let match;
|
|
157
|
+
while ((match = pattern.exec(line)) !== null) {
|
|
158
|
+
let run = match[0];
|
|
159
|
+
const reachesEnd = match.index + run.length === line.length;
|
|
160
|
+
let lastLine = i;
|
|
161
|
+
if (reachesEnd && line.length >= minWrappedLineLength) {
|
|
162
|
+
let previousLength = line.length;
|
|
163
|
+
let j = i + 1;
|
|
164
|
+
while (j < lines.length && previousLength >= minWrappedLineLength && lines[j].length > 0 && continuation.test(lines[j])) {
|
|
165
|
+
run += lines[j];
|
|
166
|
+
previousLength = lines[j].length;
|
|
167
|
+
lastLine = j;
|
|
168
|
+
j++;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Complete when the run ends inside its line, or when output
|
|
172
|
+
// continues on a later non-empty line.
|
|
173
|
+
const complete = options.final === true || !reachesEnd || lines.slice(lastLine + 1).some((later) => later.length > 0);
|
|
174
|
+
if (complete)
|
|
175
|
+
runs.push(run);
|
|
176
|
+
if (match[0].length === 0)
|
|
177
|
+
pattern.lastIndex++;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return runs;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* All complete URLs on the screen (wrapped ones joined), plus hyperlink targets.
|
|
184
|
+
*
|
|
185
|
+
* @param screen - Normalized screen
|
|
186
|
+
* @param final - The process has exited: accept runs at the end of the buffer
|
|
187
|
+
* @returns URL candidates
|
|
188
|
+
*/
|
|
189
|
+
export function extractUrlCandidates(screen, final = false) {
|
|
190
|
+
return [...extractWrappedRuns(screen.text, URL_RUN, URL_CONTINUATION, { final }), ...screen.hyperlinks];
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Line of `text` that contains character offset `index`.
|
|
194
|
+
*
|
|
195
|
+
* @param text - Text
|
|
196
|
+
* @param index - Offset
|
|
197
|
+
* @returns The trimmed line
|
|
198
|
+
*/
|
|
199
|
+
function lineAt(text, index) {
|
|
200
|
+
const start = text.lastIndexOf('\n', index - 1) + 1;
|
|
201
|
+
const endIdx = text.indexOf('\n', index);
|
|
202
|
+
return text.slice(start, endIdx === -1 ? text.length : endIdx).trim();
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* First match of a pattern in the text or its spaceless copy.
|
|
206
|
+
*
|
|
207
|
+
* @param pattern - Pattern (flags other than `g` are kept)
|
|
208
|
+
* @param screen - Normalized screen
|
|
209
|
+
* @returns The line that matched, or null
|
|
210
|
+
*/
|
|
211
|
+
function matchLine(pattern, screen) {
|
|
212
|
+
const nonGlobal = new RegExp(pattern.source, pattern.flags.replace('g', ''));
|
|
213
|
+
for (const text of [screen.text, screen.spaceless]) {
|
|
214
|
+
const found = nonGlobal.exec(text);
|
|
215
|
+
if (found)
|
|
216
|
+
return lineAt(text, found.index);
|
|
217
|
+
}
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Apply a rule set to the screen.
|
|
222
|
+
*
|
|
223
|
+
* @param rules - Rule set for the harness login method
|
|
224
|
+
* @param screen - Whole session screen, normalized
|
|
225
|
+
* @param options - `promptScreen`: screen since the user's last input (input prompt and failures are read
|
|
226
|
+
* from it; defaults to `screen`); `final`: the process has exited
|
|
227
|
+
* @returns What was found
|
|
228
|
+
*/
|
|
229
|
+
export function evaluateLoginRules(rules, screen, options = {}) {
|
|
230
|
+
const promptScreen = options.promptScreen ?? screen;
|
|
231
|
+
const final = options.final === true;
|
|
232
|
+
const urls = extractUrlCandidates(screen, final).filter((candidate) => rules.urlPattern.test(candidate));
|
|
233
|
+
// Redraws repeat the URL; the longest candidate is the most complete one.
|
|
234
|
+
const url = urls.reduce((best, candidate) => (best === null || candidate.length > best.length ? candidate : best), null);
|
|
235
|
+
let userCode = null;
|
|
236
|
+
if (rules.userCodePattern) {
|
|
237
|
+
const found = new RegExp(rules.userCodePattern.source, rules.userCodePattern.flags.replace('g', '')).exec(screen.text);
|
|
238
|
+
userCode = found?.[1] ?? null;
|
|
239
|
+
}
|
|
240
|
+
let secret = null;
|
|
241
|
+
if (rules.secretPattern) {
|
|
242
|
+
// Tokens are far shorter than the broker's PTY width, so they are never
|
|
243
|
+
// wrapped; joining is disabled to avoid gluing a following word on.
|
|
244
|
+
const tokenRuns = extractWrappedRuns(screen.text, rules.secretPattern, TOKEN_CONTINUATION, {
|
|
245
|
+
minWrappedLineLength: Number.POSITIVE_INFINITY,
|
|
246
|
+
final,
|
|
247
|
+
});
|
|
248
|
+
secret = tokenRuns.length > 0 ? tokenRuns[tokenRuns.length - 1] : null;
|
|
249
|
+
}
|
|
250
|
+
const needsInput = rules.inputPromptPattern ? matchLine(rules.inputPromptPattern, promptScreen) !== null : false;
|
|
251
|
+
const successText = rules.successPattern ? matchLine(rules.successPattern, screen) !== null : false;
|
|
252
|
+
const succeeded = rules.successRequiresSecret ? secret !== null : successText || secret !== null;
|
|
253
|
+
// Failures are read from the output since the user's last input, so a
|
|
254
|
+
// rejected code that the user then corrects does not fail the session.
|
|
255
|
+
let failureMessage = null;
|
|
256
|
+
for (const pattern of rules.failurePatterns) {
|
|
257
|
+
const line = matchLine(pattern, promptScreen);
|
|
258
|
+
if (line) {
|
|
259
|
+
failureMessage = line;
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return { url, userCode, needsInput, succeeded, failureMessage, secret };
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Replace anything that looks like a credential with a placeholder.
|
|
267
|
+
*
|
|
268
|
+
* Besides {@link SECRET_PATTERNS}, every known secret is removed — including
|
|
269
|
+
* the pieces of one a TUI wrapped over several lines.
|
|
270
|
+
*
|
|
271
|
+
* @param text - Text to redact
|
|
272
|
+
* @param knownSecrets - Secrets captured in this session
|
|
273
|
+
* @returns Redacted text
|
|
274
|
+
*/
|
|
275
|
+
export function redactSecrets(text, knownSecrets = []) {
|
|
276
|
+
const { REDACTED, REDACT_MIN_FRAGMENT } = HARNESS_CONSTANTS.LOGIN;
|
|
277
|
+
let result = text;
|
|
278
|
+
for (const secret of knownSecrets) {
|
|
279
|
+
if (!secret)
|
|
280
|
+
continue;
|
|
281
|
+
result = result.split(secret).join(REDACTED);
|
|
282
|
+
// Wrapped pieces of the secret, one per line
|
|
283
|
+
result = result
|
|
284
|
+
.split('\n')
|
|
285
|
+
.map((line) => {
|
|
286
|
+
const trimmed = line.trim();
|
|
287
|
+
return trimmed.length >= REDACT_MIN_FRAGMENT && secret.includes(trimmed) ? line.replace(trimmed, REDACTED) : line;
|
|
288
|
+
})
|
|
289
|
+
.join('\n');
|
|
290
|
+
}
|
|
291
|
+
for (const pattern of SECRET_PATTERNS) {
|
|
292
|
+
result = result.replace(pattern, REDACTED);
|
|
293
|
+
}
|
|
294
|
+
return result;
|
|
295
|
+
}
|
|
296
|
+
/** Claude Code `claude setup-token` (subscription login). */
|
|
297
|
+
export const CLAUDE_SETUP_TOKEN_RULES = {
|
|
298
|
+
harnessId: HARNESS_CONSTANTS.IDS.CLAUDE_CODE,
|
|
299
|
+
method: 'subscription',
|
|
300
|
+
urlPattern: /^https:\/\/(?:[a-z0-9-]+\.)*(?:claude\.com|claude\.ai|anthropic\.com)\/\S*oauth\/authorize\?\S+/,
|
|
301
|
+
inputPromptPattern: /paste\s*code\s*here\s*if\s*prompted/i,
|
|
302
|
+
failurePatterns: [
|
|
303
|
+
/invalid\s*code\.?\s*please\s*make\s*sure/i,
|
|
304
|
+
/OAuth\s*error/i,
|
|
305
|
+
/login\s*failed/i,
|
|
306
|
+
/authentication\s*failed/i,
|
|
307
|
+
],
|
|
308
|
+
secretPattern: /sk-ant-oat01-[A-Za-z0-9_-]{20,}/g,
|
|
309
|
+
successRequiresSecret: true,
|
|
310
|
+
successOnExitZero: false,
|
|
311
|
+
verifyAfterSuccess: false,
|
|
312
|
+
};
|
|
313
|
+
/** Codex `codex login --device-auth` (ChatGPT device-code login). */
|
|
314
|
+
export const CODEX_DEVICE_AUTH_RULES = {
|
|
315
|
+
harnessId: HARNESS_CONSTANTS.IDS.CODEX_CLI,
|
|
316
|
+
method: 'device',
|
|
317
|
+
urlPattern: /^https:\/\/auth\.openai\.com\/codex\/device\S*$/,
|
|
318
|
+
// The code follows "Enter this one-time code ..." on the next line; the
|
|
319
|
+
// lookahead makes sure it is complete (followed by whitespace).
|
|
320
|
+
userCodePattern: /one-time\s*code[^\n]*\n\s*([A-Z0-9]{4,}-[A-Z0-9]{4,})(?=\s)/i,
|
|
321
|
+
successPattern: /successfully\s*logged\s*in/i,
|
|
322
|
+
failurePatterns: [
|
|
323
|
+
/login\s*(?:failed|error)/i,
|
|
324
|
+
/device\s*code\s*(?:has\s*)?expired/i,
|
|
325
|
+
/authorization\s*(?:was\s*)?(?:denied|declined)/i,
|
|
326
|
+
/^\s*error:/im,
|
|
327
|
+
],
|
|
328
|
+
successRequiresSecret: false,
|
|
329
|
+
successOnExitZero: true,
|
|
330
|
+
verifyAfterSuccess: true,
|
|
331
|
+
};
|
|
332
|
+
/** Every rule set, by harness and method. */
|
|
333
|
+
const RULE_SETS = [CLAUDE_SETUP_TOKEN_RULES, CODEX_DEVICE_AUTH_RULES];
|
|
334
|
+
/**
|
|
335
|
+
* The rule set for a harness login method.
|
|
336
|
+
*
|
|
337
|
+
* @param harnessId - Harness id
|
|
338
|
+
* @param method - Login method id
|
|
339
|
+
* @returns The rule set, or undefined when the method is not brokered
|
|
340
|
+
*/
|
|
341
|
+
export function getLoginRules(harnessId, method) {
|
|
342
|
+
return RULE_SETS.find((rules) => rules.harnessId === harnessId && rules.method === method);
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=login-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-rules.js","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/login-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which harness the orchestrator runs on.
|
|
3
|
+
*
|
|
4
|
+
* The orchestrator's runtime is `runtimeType` in
|
|
5
|
+
* `<crewlyHome>/teams/orchestrator/config.json` — the same field
|
|
6
|
+
* `PUT /api/orchestrator/runtime` and StorageService.updateOrchestratorRuntimeType
|
|
7
|
+
* write, and the one the orchestrator is launched with (a `DEFAULT_RUNTIME`
|
|
8
|
+
* env var still overrides it at boot). Setting the orc harness also sets
|
|
9
|
+
* `settings.general.defaultRuntime`, so new team members default to the one
|
|
10
|
+
* harness first-time setup installed.
|
|
11
|
+
*
|
|
12
|
+
* This module writes the file directly (same lock key and atomic write as
|
|
13
|
+
* StorageService) instead of instantiating StorageService, so the CLI can use
|
|
14
|
+
* it without starting the backend's logger. `get` never creates the file:
|
|
15
|
+
* a fresh machine reports null ("not chosen yet").
|
|
16
|
+
*
|
|
17
|
+
* @module services/harness/orc-harness.store
|
|
18
|
+
*/
|
|
19
|
+
import type { HarnessId } from './harness.types.js';
|
|
20
|
+
/** Updates `settings.general.defaultRuntime`. */
|
|
21
|
+
export type DefaultRuntimeUpdater = (harnessId: HarnessId) => Promise<void>;
|
|
22
|
+
/** Injectable dependencies. */
|
|
23
|
+
export interface OrcHarnessStoreDeps {
|
|
24
|
+
/** Crewly home dir (defaults to CREWLY_HOME / ~/.crewly, resolved per call) */
|
|
25
|
+
crewlyHome?: () => string;
|
|
26
|
+
/** Settings updater; defaults to the backend SettingsService singleton */
|
|
27
|
+
updateDefaultRuntime?: DefaultRuntimeUpdater;
|
|
28
|
+
}
|
|
29
|
+
/** Reads and writes the orchestrator's harness. */
|
|
30
|
+
export declare class OrcHarnessStore {
|
|
31
|
+
private readonly crewlyHome;
|
|
32
|
+
private readonly updateDefaultRuntime;
|
|
33
|
+
/**
|
|
34
|
+
* @param deps - Injectable dependencies (all optional)
|
|
35
|
+
*/
|
|
36
|
+
constructor(deps?: OrcHarnessStoreDeps);
|
|
37
|
+
/**
|
|
38
|
+
* Orchestrator config file path.
|
|
39
|
+
*
|
|
40
|
+
* @returns `<crewlyHome>/teams/orchestrator/config.json`
|
|
41
|
+
*/
|
|
42
|
+
getFilePath(): string;
|
|
43
|
+
/**
|
|
44
|
+
* The orchestrator's runtime, if one is recorded.
|
|
45
|
+
*
|
|
46
|
+
* @returns Runtime id, or null when nothing is recorded yet
|
|
47
|
+
*/
|
|
48
|
+
get(): Promise<string | null>;
|
|
49
|
+
/**
|
|
50
|
+
* Set the orchestrator's harness (and the default runtime for new members).
|
|
51
|
+
*
|
|
52
|
+
* Takes effect the next time the orchestrator starts.
|
|
53
|
+
*
|
|
54
|
+
* @param harnessId - Harness id
|
|
55
|
+
* @returns The harness id now recorded
|
|
56
|
+
*/
|
|
57
|
+
set(harnessId: HarnessId): Promise<string>;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=orc-harness.store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orc-harness.store.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/orc-harness.store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAQH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,iDAAiD;AACjD,MAAM,MAAM,qBAAqB,GAAG,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5E,+BAA+B;AAC/B,MAAM,WAAW,mBAAmB;IACnC,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;IAC1B,0EAA0E;IAC1E,oBAAoB,CAAC,EAAE,qBAAqB,CAAC;CAC7C;AAWD,mDAAmD;AACnD,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAwB;IAE7D;;OAEG;gBACS,IAAI,GAAE,mBAAwB;IAK1C;;;;OAIG;IACH,WAAW,IAAI,MAAM;IAIrB;;;;OAIG;IACG,GAAG,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IASnC;;;;;;;OAOG;IACG,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;CA+BhD"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which harness the orchestrator runs on.
|
|
3
|
+
*
|
|
4
|
+
* The orchestrator's runtime is `runtimeType` in
|
|
5
|
+
* `<crewlyHome>/teams/orchestrator/config.json` — the same field
|
|
6
|
+
* `PUT /api/orchestrator/runtime` and StorageService.updateOrchestratorRuntimeType
|
|
7
|
+
* write, and the one the orchestrator is launched with (a `DEFAULT_RUNTIME`
|
|
8
|
+
* env var still overrides it at boot). Setting the orc harness also sets
|
|
9
|
+
* `settings.general.defaultRuntime`, so new team members default to the one
|
|
10
|
+
* harness first-time setup installed.
|
|
11
|
+
*
|
|
12
|
+
* This module writes the file directly (same lock key and atomic write as
|
|
13
|
+
* StorageService) instead of instantiating StorageService, so the CLI can use
|
|
14
|
+
* it without starting the backend's logger. `get` never creates the file:
|
|
15
|
+
* a fresh machine reports null ("not chosen yet").
|
|
16
|
+
*
|
|
17
|
+
* @module services/harness/orc-harness.store
|
|
18
|
+
*/
|
|
19
|
+
import { promises as fs } from 'fs';
|
|
20
|
+
import * as path from 'path';
|
|
21
|
+
import { CREWLY_CONSTANTS, HARNESS_CONSTANTS, RUNTIME_TYPES } from '../../constants.js';
|
|
22
|
+
import { atomicWriteFile, withOperationLock } from '../../utils/file-io.utils.js';
|
|
23
|
+
import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
|
|
24
|
+
import { getSettingsService } from '../settings/settings.service.js';
|
|
25
|
+
/**
|
|
26
|
+
* Default updater: the backend's settings singleton (keeps its cache coherent).
|
|
27
|
+
*
|
|
28
|
+
* @param harnessId - Harness id
|
|
29
|
+
*/
|
|
30
|
+
const defaultUpdateDefaultRuntime = async (harnessId) => {
|
|
31
|
+
await getSettingsService().updateSettings({ general: { defaultRuntime: harnessId } });
|
|
32
|
+
};
|
|
33
|
+
/** Reads and writes the orchestrator's harness. */
|
|
34
|
+
export class OrcHarnessStore {
|
|
35
|
+
crewlyHome;
|
|
36
|
+
updateDefaultRuntime;
|
|
37
|
+
/**
|
|
38
|
+
* @param deps - Injectable dependencies (all optional)
|
|
39
|
+
*/
|
|
40
|
+
constructor(deps = {}) {
|
|
41
|
+
this.crewlyHome = deps.crewlyHome ?? getCrewlyHomePath;
|
|
42
|
+
this.updateDefaultRuntime = deps.updateDefaultRuntime ?? defaultUpdateDefaultRuntime;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Orchestrator config file path.
|
|
46
|
+
*
|
|
47
|
+
* @returns `<crewlyHome>/teams/orchestrator/config.json`
|
|
48
|
+
*/
|
|
49
|
+
getFilePath() {
|
|
50
|
+
return path.join(this.crewlyHome(), ...HARNESS_CONSTANTS.ORCHESTRATOR_CONFIG_SEGMENTS);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The orchestrator's runtime, if one is recorded.
|
|
54
|
+
*
|
|
55
|
+
* @returns Runtime id, or null when nothing is recorded yet
|
|
56
|
+
*/
|
|
57
|
+
async get() {
|
|
58
|
+
try {
|
|
59
|
+
const parsed = JSON.parse(await fs.readFile(this.getFilePath(), 'utf-8'));
|
|
60
|
+
return typeof parsed.runtimeType === 'string' && parsed.runtimeType.length > 0 ? parsed.runtimeType : null;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Set the orchestrator's harness (and the default runtime for new members).
|
|
68
|
+
*
|
|
69
|
+
* Takes effect the next time the orchestrator starts.
|
|
70
|
+
*
|
|
71
|
+
* @param harnessId - Harness id
|
|
72
|
+
* @returns The harness id now recorded
|
|
73
|
+
*/
|
|
74
|
+
async set(harnessId) {
|
|
75
|
+
const file = this.getFilePath();
|
|
76
|
+
await withOperationLock(file, async () => {
|
|
77
|
+
let orchestrator;
|
|
78
|
+
try {
|
|
79
|
+
orchestrator = JSON.parse(await fs.readFile(file, 'utf-8'));
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
const now = new Date().toISOString();
|
|
83
|
+
orchestrator = {
|
|
84
|
+
sessionName: CREWLY_CONSTANTS.SESSIONS.ORCHESTRATOR_NAME,
|
|
85
|
+
agentStatus: CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE,
|
|
86
|
+
workingStatus: CREWLY_CONSTANTS.WORKING_STATUSES.IDLE,
|
|
87
|
+
runtimeType: RUNTIME_TYPES.CLAUDE_CODE,
|
|
88
|
+
createdAt: now,
|
|
89
|
+
updatedAt: now,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
orchestrator.runtimeType = harnessId;
|
|
93
|
+
orchestrator.updatedAt = new Date().toISOString();
|
|
94
|
+
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
95
|
+
await atomicWriteFile(file, JSON.stringify(orchestrator, null, 2));
|
|
96
|
+
});
|
|
97
|
+
// The orchestrator runtime is what matters; a settings failure (e.g. an
|
|
98
|
+
// invalid settings file) must not undo or fail the orc choice.
|
|
99
|
+
try {
|
|
100
|
+
await this.updateDefaultRuntime(harnessId);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Default runtime for new members stays as it was.
|
|
104
|
+
}
|
|
105
|
+
return harnessId;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=orc-harness.store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orc-harness.store.js","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/orc-harness.store.ts"],"names":[],"mappings":"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"}
|