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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../cli/src/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAe/B;;;GAGG;AACH,eAAO,MAAM,aAAa;IACxB,gCAAgC;;IAGhC,4BAA4B;;IAG5B,gCAAgC;;;;;;;IAQhC,iBAAiB;;;;;;
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../cli/src/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAe/B;;;GAGG;AACH,eAAO,MAAM,aAAa;IACxB,gCAAgC;;IAGhC,4BAA4B;;IAG5B,gCAAgC;;;;;;;IAQhC,iBAAiB;;;;;;IAOjB,6FAA6F;;QAE3F,0CAA0C;;QAE1C,iGAAiG;;QAEjG,+EAA+E;;QAE/E,4EAA4E;;;IAI9E,sCAAsC;;QAEpC,+EAA+E;;QAE/E,iCAAiC;;;CAG3B,CAAC;AAIX;;;GAGG;AAGH,eAAO,MAAM,yBAAyB,cAA8C,CAAC;AACrF,eAAO,MAAM,yBAAyB,gBAA6C,CAAC;AACpF,eAAO,MAAM,iBAAiB,gBAAsC,CAAC;AACrE,eAAO,MAAM,wBAAwB,uBAA4C,CAAC;AAGlF,eAAO,MAAM,0BAA0B,OAA+C,CAAC;AACvF,eAAO,MAAM,4BAA4B,OAAwC,CAAC;AAClF,eAAO,MAAM,6BAA6B,OAAwC,CAAC;AACnF,eAAO,MAAM,oBAAoB,OAAwC,CAAC;AAG1E,eAAO,MAAM,eAAe,WAAqC,CAAC;AAClE,eAAO,MAAM,UAAU,UAAoC,CAAC;AAC5D,eAAO,MAAM,WAAW,WAAqC,CAAC;AAC9D,eAAO,MAAM,SAAS,SAAmC,CAAC;AAC1D,eAAO,MAAM,SAAS,SAAmC,CAAC;AAC1D,eAAO,MAAM,UAAU,UAAoC,CAAC;AAG5D,eAAO,MAAM,iBAAiB,cAAoC,CAAC;AACnE,eAAO,MAAM,oBAAoB,wBAA+C,CAAC;AACjF,eAAO,MAAM,kBAAkB,0BAA6C,CAAC;AAC7E,eAAO,MAAM,sBAAsB,qBAAiD,CAAC;AAGrF,eAAO,MAAM,gBAAgB,MAA8B,CAAC;AAG5D,eAAO,MAAM,WAAW;;;;;;;CAAyB,CAAC;AAClD,eAAO,MAAM,kBAAkB;;;;;;;CAAsC,CAAC;AAGtE,eAAO,MAAM,QAAQ;;;;;;;;;CAAgB,CAAC;AAGtC,eAAO,MAAM,YAAY;;CAAiC,CAAC;AAG3D,eAAO,MAAM,8BAA8B,OAA2D,CAAC;AACvG,eAAO,MAAM,uBAAuB,QAA4C,CAAC;AACjF,eAAO,MAAM,sBAAsB,KAA2C,CAAC;AAG/E,eAAO,MAAM,kBAAkB,MAAsC,CAAC;AACtE,eAAO,MAAM,gBAAgB,KAA4C,CAAC;AAG1E,eAAO,MAAM,aAAa;;;;;;;;;CAAkC,CAAC"}
|
|
@@ -39,6 +39,24 @@ export const CLI_CONSTANTS = {
|
|
|
39
39
|
ERROR: 1,
|
|
40
40
|
INVALID_ARGS: 2,
|
|
41
41
|
},
|
|
42
|
+
/** Harness setup in `crewly onboard` / `crewly login` (specs/onboarding-harness-login.md) */
|
|
43
|
+
HARNESS_SETUP: {
|
|
44
|
+
/** How often a login session is polled */
|
|
45
|
+
POLL_INTERVAL_MS: 1000,
|
|
46
|
+
/** Non-interactive: how long to wait for the login URL / code before giving up on printing it */
|
|
47
|
+
URL_WAIT_MS: 30_000,
|
|
48
|
+
/** Print the raw login screen when no URL / code / prompt showed up by then */
|
|
49
|
+
SCREEN_FALLBACK_MS: 20_000,
|
|
50
|
+
/** Extra time past the broker's own timeout before the CLI stops waiting */
|
|
51
|
+
WAIT_GRACE_MS: 30_000,
|
|
52
|
+
},
|
|
53
|
+
/** `crewly onboard --web` hand-off */
|
|
54
|
+
ONBOARD: {
|
|
55
|
+
/** Health checks before opening the setup page on a freshly started backend */
|
|
56
|
+
WEB_WAIT_ATTEMPTS: 60,
|
|
57
|
+
/** Delay between those checks */
|
|
58
|
+
WEB_WAIT_INTERVAL_MS: 1000,
|
|
59
|
+
},
|
|
42
60
|
};
|
|
43
61
|
// ========================= CONVENIENCE ALIASES =========================
|
|
44
62
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../cli/src/constants.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../cli/src/constants.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ import { upgradeCommand } from './commands/upgrade.js';
|
|
|
11
11
|
import { installCommand } from './commands/install.js';
|
|
12
12
|
import { searchCommand } from './commands/search.js';
|
|
13
13
|
import { onboardCommand } from './commands/onboard.js';
|
|
14
|
+
import { harnessCommand, loginCommand as harnessLoginCommand } from './commands/harness.js';
|
|
14
15
|
import { mcpServerCommand } from './commands/mcp-server.js';
|
|
15
16
|
import { publishCommand } from './commands/publish.js';
|
|
16
17
|
import { seedMarketplaceCommand } from './commands/seed-marketplace.js';
|
|
@@ -87,10 +88,28 @@ program
|
|
|
87
88
|
program
|
|
88
89
|
.command('init')
|
|
89
90
|
.alias('onboard')
|
|
90
|
-
.description('
|
|
91
|
-
.option('-y, --yes', 'Non-interactive mode: use all defaults (CI
|
|
91
|
+
.description('Setup wizard for new Crewly users (web app or terminal)')
|
|
92
|
+
.option('-y, --yes', 'Non-interactive mode: use all defaults, never prompt (CI / agents); prints the login link for your phone')
|
|
92
93
|
.option('--template <id>', 'Select a team template by ID (e.g. web-dev-team)')
|
|
93
|
-
.
|
|
94
|
+
.option('--harness <id>', 'Harness for the orchestrator: claude (default), codex or gemini')
|
|
95
|
+
.option('--web', 'Continue setup in the web app')
|
|
96
|
+
.option('--cli', 'Continue setup in this terminal')
|
|
97
|
+
.action((options) => onboardCommand(options));
|
|
98
|
+
program
|
|
99
|
+
.command('harness')
|
|
100
|
+
.description('Show the AI harnesses (Claude Code, Codex, Gemini CLI): installed version, updates, login state')
|
|
101
|
+
.action(async () => {
|
|
102
|
+
process.exitCode = await harnessCommand();
|
|
103
|
+
});
|
|
104
|
+
program
|
|
105
|
+
.command('login <harness>')
|
|
106
|
+
.description('Log a harness in: crewly login claude | codex (prints a link to open on any device)')
|
|
107
|
+
.option('--method <method>', 'subscription | device | api_key (default: the harness\'s browser login)')
|
|
108
|
+
.option('--force', 'Log in again even when already logged in')
|
|
109
|
+
.option('-y, --yes', 'Never prompt: start the login for Crewly → Setup (web / phone) to finish')
|
|
110
|
+
.action(async (harness, options) => {
|
|
111
|
+
process.exitCode = await harnessLoginCommand(harness, options);
|
|
112
|
+
});
|
|
94
113
|
program
|
|
95
114
|
.command('mcp-server')
|
|
96
115
|
.description('Start Crewly MCP server (for Claude Code, Cursor, etc. integration)')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../cli/src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../cli/src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How the CLI reaches the harness engine.
|
|
3
|
+
*
|
|
4
|
+
* The CLI imports the backend's harness service directly (like `crewly
|
|
5
|
+
* backup` and `crewly token` do), so `crewly onboard`, `crewly login` and
|
|
6
|
+
* `crewly harness` work with no backend running — detection, install and the
|
|
7
|
+
* orc choice are files and child processes, not server state.
|
|
8
|
+
*
|
|
9
|
+
* Login is the one exception. A login session is a live PTY; when the backend
|
|
10
|
+
* is running, the CLI starts it *in the backend* over its loopback REST API
|
|
11
|
+
* (`/api/harness`). The session then outlives the CLI and is the same one the
|
|
12
|
+
* web setup page and the phone / portal (through the relay) see, so the owner
|
|
13
|
+
* can finish it from wherever they are. With no backend, the broker runs
|
|
14
|
+
* in-process and lives as long as the CLI command.
|
|
15
|
+
*
|
|
16
|
+
* @module cli/utils/harness-engine
|
|
17
|
+
*/
|
|
18
|
+
import { HarnessService } from '../../../backend/src/services/harness/harness.service.js';
|
|
19
|
+
import { type HarnessId, type LoginSession } from '../../../backend/src/services/harness/harness.types.js';
|
|
20
|
+
/** Minimal JSON HTTP client (injectable for tests). */
|
|
21
|
+
export type HttpJson = (method: 'GET' | 'POST', url: string, body?: unknown) => Promise<{
|
|
22
|
+
status: number;
|
|
23
|
+
body: unknown;
|
|
24
|
+
}>;
|
|
25
|
+
/** Drives a login session wherever it lives. */
|
|
26
|
+
export interface LoginDriver {
|
|
27
|
+
/** `in-process` (dies with the CLI) or `backend` (visible to web / phone) */
|
|
28
|
+
readonly where: 'in-process' | 'backend';
|
|
29
|
+
start(harnessId: HarnessId, method: string): Promise<LoginSession>;
|
|
30
|
+
get(sessionId: string): Promise<LoginSession>;
|
|
31
|
+
input(sessionId: string, text: string): Promise<LoginSession>;
|
|
32
|
+
cancel(sessionId: string): Promise<LoginSession>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Default HTTP client (axios, never throws on HTTP status).
|
|
36
|
+
*
|
|
37
|
+
* @param method - HTTP method
|
|
38
|
+
* @param url - Absolute URL
|
|
39
|
+
* @param body - JSON body
|
|
40
|
+
* @returns Status and parsed body
|
|
41
|
+
*/
|
|
42
|
+
export declare const defaultHttpJson: HttpJson;
|
|
43
|
+
/**
|
|
44
|
+
* The local backend's port (`WEB_PORT` or the default).
|
|
45
|
+
*
|
|
46
|
+
* @param env - Environment
|
|
47
|
+
* @returns Port number
|
|
48
|
+
*/
|
|
49
|
+
export declare function getBackendPort(env?: NodeJS.ProcessEnv): number;
|
|
50
|
+
/**
|
|
51
|
+
* Loopback base URL of the local backend (no API token needed on loopback).
|
|
52
|
+
*
|
|
53
|
+
* @param port - Backend port
|
|
54
|
+
* @returns e.g. `http://localhost:8787`
|
|
55
|
+
*/
|
|
56
|
+
export declare function localBackendUrl(port?: number): string;
|
|
57
|
+
/**
|
|
58
|
+
* Whether the local backend answers `/health`.
|
|
59
|
+
*
|
|
60
|
+
* @param port - Backend port
|
|
61
|
+
* @param http - HTTP client
|
|
62
|
+
* @returns True when it is up
|
|
63
|
+
*/
|
|
64
|
+
export declare function isBackendRunning(port?: number, http?: HttpJson): Promise<boolean>;
|
|
65
|
+
/**
|
|
66
|
+
* The harness engine for this CLI process: silent logger, and settings
|
|
67
|
+
* written through a fresh SettingsService (the backend's singleton is not
|
|
68
|
+
* in this process).
|
|
69
|
+
*
|
|
70
|
+
* @returns Harness service
|
|
71
|
+
*/
|
|
72
|
+
export declare function createCliHarnessService(): HarnessService;
|
|
73
|
+
/**
|
|
74
|
+
* Login driver backed by an in-process broker.
|
|
75
|
+
*
|
|
76
|
+
* @param service - Harness service
|
|
77
|
+
* @returns Driver
|
|
78
|
+
*/
|
|
79
|
+
export declare function createInProcessLoginDriver(service: HarnessService): LoginDriver;
|
|
80
|
+
/**
|
|
81
|
+
* Login driver backed by the running backend's REST API.
|
|
82
|
+
*
|
|
83
|
+
* @param baseUrl - Backend base URL
|
|
84
|
+
* @param http - HTTP client
|
|
85
|
+
* @returns Driver
|
|
86
|
+
*/
|
|
87
|
+
export declare function createBackendLoginDriver(baseUrl?: string, http?: HttpJson): LoginDriver;
|
|
88
|
+
/**
|
|
89
|
+
* Pick the login driver: the backend's when it is running, else in-process.
|
|
90
|
+
*
|
|
91
|
+
* @param service - In-process harness service (fallback)
|
|
92
|
+
* @param options - Port and HTTP client (tests)
|
|
93
|
+
* @returns Driver
|
|
94
|
+
*/
|
|
95
|
+
export declare function pickLoginDriver(service: HarnessService, options?: {
|
|
96
|
+
port?: number;
|
|
97
|
+
http?: HttpJson;
|
|
98
|
+
}): Promise<LoginDriver>;
|
|
99
|
+
//# sourceMappingURL=harness-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness-engine.d.ts","sourceRoot":"","sources":["../../../../../cli/src/utils/harness-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,EAAE,cAAc,EAAwB,MAAM,0DAA0D,CAAC;AAChH,OAAO,EAAyB,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,wDAAwD,CAAC;AAGlI,uDAAuD;AACvD,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAE3H,gDAAgD;AAChD,MAAM,WAAW,WAAW;IAC3B,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,CAAC;IACzC,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACnE,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9C,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9D,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACjD;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,EAAE,QAG7B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAG3E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE,MAAyB,GAAG,MAAM,CAEvE;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,GAAE,MAAyB,EAAE,IAAI,GAAE,QAA0B,GAAG,OAAO,CAAC,OAAO,CAAC,CAO1H;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,IAAI,cAAc,CAOxD;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,cAAc,GAAG,WAAW,CAQ/E;AAeD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,MAA0B,EAAE,IAAI,GAAE,QAA0B,GAAG,WAAW,CAS3H;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACpC,OAAO,EAAE,cAAc,EACvB,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,QAAQ,CAAA;CAAO,GAC9C,OAAO,CAAC,WAAW,CAAC,CAItB"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How the CLI reaches the harness engine.
|
|
3
|
+
*
|
|
4
|
+
* The CLI imports the backend's harness service directly (like `crewly
|
|
5
|
+
* backup` and `crewly token` do), so `crewly onboard`, `crewly login` and
|
|
6
|
+
* `crewly harness` work with no backend running — detection, install and the
|
|
7
|
+
* orc choice are files and child processes, not server state.
|
|
8
|
+
*
|
|
9
|
+
* Login is the one exception. A login session is a live PTY; when the backend
|
|
10
|
+
* is running, the CLI starts it *in the backend* over its loopback REST API
|
|
11
|
+
* (`/api/harness`). The session then outlives the CLI and is the same one the
|
|
12
|
+
* web setup page and the phone / portal (through the relay) see, so the owner
|
|
13
|
+
* can finish it from wherever they are. With no backend, the broker runs
|
|
14
|
+
* in-process and lives as long as the CLI command.
|
|
15
|
+
*
|
|
16
|
+
* @module cli/utils/harness-engine
|
|
17
|
+
*/
|
|
18
|
+
import axios from 'axios';
|
|
19
|
+
import { HARNESS_CONSTANTS } from '../../../backend/src/constants.js';
|
|
20
|
+
import { SettingsService } from '../../../backend/src/services/settings/settings.service.js';
|
|
21
|
+
import { createHarnessService } from '../../../backend/src/services/harness/harness.service.js';
|
|
22
|
+
import { SILENT_HARNESS_LOGGER } from '../../../backend/src/services/harness/harness.types.js';
|
|
23
|
+
import { DEFAULT_WEB_PORT } from '../constants.js';
|
|
24
|
+
/**
|
|
25
|
+
* Default HTTP client (axios, never throws on HTTP status).
|
|
26
|
+
*
|
|
27
|
+
* @param method - HTTP method
|
|
28
|
+
* @param url - Absolute URL
|
|
29
|
+
* @param body - JSON body
|
|
30
|
+
* @returns Status and parsed body
|
|
31
|
+
*/
|
|
32
|
+
export const defaultHttpJson = async (method, url, body) => {
|
|
33
|
+
const response = await axios.request({ method, url, data: body, timeout: HARNESS_CONSTANTS.PROBE_TIMEOUT_MS, validateStatus: () => true });
|
|
34
|
+
return { status: response.status, body: response.data };
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* The local backend's port (`WEB_PORT` or the default).
|
|
38
|
+
*
|
|
39
|
+
* @param env - Environment
|
|
40
|
+
* @returns Port number
|
|
41
|
+
*/
|
|
42
|
+
export function getBackendPort(env = process.env) {
|
|
43
|
+
const parsed = Number.parseInt(env.WEB_PORT ?? '', 10);
|
|
44
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_WEB_PORT;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Loopback base URL of the local backend (no API token needed on loopback).
|
|
48
|
+
*
|
|
49
|
+
* @param port - Backend port
|
|
50
|
+
* @returns e.g. `http://localhost:8787`
|
|
51
|
+
*/
|
|
52
|
+
export function localBackendUrl(port = getBackendPort()) {
|
|
53
|
+
return `http://localhost:${port}`;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Whether the local backend answers `/health`.
|
|
57
|
+
*
|
|
58
|
+
* @param port - Backend port
|
|
59
|
+
* @param http - HTTP client
|
|
60
|
+
* @returns True when it is up
|
|
61
|
+
*/
|
|
62
|
+
export async function isBackendRunning(port = getBackendPort(), http = defaultHttpJson) {
|
|
63
|
+
try {
|
|
64
|
+
const { status } = await http('GET', `${localBackendUrl(port)}/health`);
|
|
65
|
+
return status === 200;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The harness engine for this CLI process: silent logger, and settings
|
|
73
|
+
* written through a fresh SettingsService (the backend's singleton is not
|
|
74
|
+
* in this process).
|
|
75
|
+
*
|
|
76
|
+
* @returns Harness service
|
|
77
|
+
*/
|
|
78
|
+
export function createCliHarnessService() {
|
|
79
|
+
return createHarnessService({
|
|
80
|
+
logger: SILENT_HARNESS_LOGGER,
|
|
81
|
+
updateDefaultRuntime: async (harnessId) => {
|
|
82
|
+
await new SettingsService().updateSettings({ general: { defaultRuntime: harnessId } });
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Login driver backed by an in-process broker.
|
|
88
|
+
*
|
|
89
|
+
* @param service - Harness service
|
|
90
|
+
* @returns Driver
|
|
91
|
+
*/
|
|
92
|
+
export function createInProcessLoginDriver(service) {
|
|
93
|
+
return {
|
|
94
|
+
where: 'in-process',
|
|
95
|
+
start: async (harnessId, method) => service.startLogin(harnessId, method),
|
|
96
|
+
get: async (sessionId) => service.broker.get(sessionId),
|
|
97
|
+
input: async (sessionId, text) => service.broker.input(sessionId, text),
|
|
98
|
+
cancel: async (sessionId) => service.broker.cancel(sessionId),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Unwrap a `{ success, data | error }` response.
|
|
103
|
+
*
|
|
104
|
+
* @param response - HTTP response
|
|
105
|
+
* @returns The data
|
|
106
|
+
* @throws Error with the API's error message
|
|
107
|
+
*/
|
|
108
|
+
function unwrap(response) {
|
|
109
|
+
const body = (response.body ?? {});
|
|
110
|
+
if (response.status >= 200 && response.status < 300 && body.success && body.data)
|
|
111
|
+
return body.data;
|
|
112
|
+
throw new Error(body.error ?? `Crewly returned HTTP ${response.status}`);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Login driver backed by the running backend's REST API.
|
|
116
|
+
*
|
|
117
|
+
* @param baseUrl - Backend base URL
|
|
118
|
+
* @param http - HTTP client
|
|
119
|
+
* @returns Driver
|
|
120
|
+
*/
|
|
121
|
+
export function createBackendLoginDriver(baseUrl = localBackendUrl(), http = defaultHttpJson) {
|
|
122
|
+
const api = `${baseUrl}/api/harness`;
|
|
123
|
+
return {
|
|
124
|
+
where: 'backend',
|
|
125
|
+
start: async (harnessId, method) => unwrap(await http('POST', `${api}/${harnessId}/login`, { method })),
|
|
126
|
+
get: async (sessionId) => unwrap(await http('GET', `${api}/login/${encodeURIComponent(sessionId)}`)),
|
|
127
|
+
input: async (sessionId, text) => unwrap(await http('POST', `${api}/login/${encodeURIComponent(sessionId)}/input`, { text })),
|
|
128
|
+
cancel: async (sessionId) => unwrap(await http('POST', `${api}/login/${encodeURIComponent(sessionId)}/cancel`)),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Pick the login driver: the backend's when it is running, else in-process.
|
|
133
|
+
*
|
|
134
|
+
* @param service - In-process harness service (fallback)
|
|
135
|
+
* @param options - Port and HTTP client (tests)
|
|
136
|
+
* @returns Driver
|
|
137
|
+
*/
|
|
138
|
+
export async function pickLoginDriver(service, options = {}) {
|
|
139
|
+
const port = options.port ?? getBackendPort();
|
|
140
|
+
const http = options.http ?? defaultHttpJson;
|
|
141
|
+
return (await isBackendRunning(port, http)) ? createBackendLoginDriver(localBackendUrl(port), http) : createInProcessLoginDriver(service);
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=harness-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness-engine.js","sourceRoot":"","sources":["../../../../../cli/src/utils/harness-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Readline-backed prompting for CLI wizards, including hidden input.
|
|
3
|
+
*
|
|
4
|
+
* @module cli/utils/prompt-io
|
|
5
|
+
*/
|
|
6
|
+
import type { Interface as ReadlineInterface } from 'readline';
|
|
7
|
+
/** Prompting and output used by the harness setup steps. */
|
|
8
|
+
export interface PromptIO {
|
|
9
|
+
ask(question: string): Promise<string>;
|
|
10
|
+
askSecret(question: string): Promise<string>;
|
|
11
|
+
log(line: string): void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Wrap a readline interface as {@link PromptIO}.
|
|
15
|
+
*
|
|
16
|
+
* A pending question rejects when the input closes (EOF), so a wizard reading
|
|
17
|
+
* from an exhausted pipe stops instead of hanging.
|
|
18
|
+
*
|
|
19
|
+
* @param rl - Readline interface
|
|
20
|
+
* @param closedError - Error to reject with when the input closes
|
|
21
|
+
* @param log - Output function (defaults to console.log)
|
|
22
|
+
* @returns Prompt IO
|
|
23
|
+
*/
|
|
24
|
+
export declare function createReadlineIO(rl: ReadlineInterface, closedError: () => Error, log?: (line: string) => void): PromptIO;
|
|
25
|
+
//# sourceMappingURL=prompt-io.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-io.d.ts","sourceRoot":"","sources":["../../../../../cli/src/utils/prompt-io.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,IAAI,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE/D,4DAA4D;AAC5D,MAAM,WAAW,QAAQ;IACxB,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAQD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC/B,EAAE,EAAE,iBAAiB,EACrB,WAAW,EAAE,MAAM,KAAK,EACxB,GAAG,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAkC,GACvD,QAAQ,CA+BV"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Readline-backed prompting for CLI wizards, including hidden input.
|
|
3
|
+
*
|
|
4
|
+
* @module cli/utils/prompt-io
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Wrap a readline interface as {@link PromptIO}.
|
|
8
|
+
*
|
|
9
|
+
* A pending question rejects when the input closes (EOF), so a wizard reading
|
|
10
|
+
* from an exhausted pipe stops instead of hanging.
|
|
11
|
+
*
|
|
12
|
+
* @param rl - Readline interface
|
|
13
|
+
* @param closedError - Error to reject with when the input closes
|
|
14
|
+
* @param log - Output function (defaults to console.log)
|
|
15
|
+
* @returns Prompt IO
|
|
16
|
+
*/
|
|
17
|
+
export function createReadlineIO(rl, closedError, log = (line) => console.log(line)) {
|
|
18
|
+
const ask = (question) => new Promise((resolve, reject) => {
|
|
19
|
+
const onClose = () => reject(closedError());
|
|
20
|
+
rl.on('close', onClose);
|
|
21
|
+
rl.question(question, (answer) => {
|
|
22
|
+
rl.removeListener('close', onClose);
|
|
23
|
+
resolve(answer.trim());
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
const askSecret = async (question) => {
|
|
27
|
+
const mutable = rl;
|
|
28
|
+
const original = mutable._writeToOutput;
|
|
29
|
+
let prompted = false;
|
|
30
|
+
// Print the question once, then swallow the echoed keystrokes.
|
|
31
|
+
mutable._writeToOutput = (text) => {
|
|
32
|
+
if (!prompted) {
|
|
33
|
+
prompted = true;
|
|
34
|
+
mutable.output?.write(text);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
try {
|
|
38
|
+
return await ask(question);
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
mutable._writeToOutput = original;
|
|
42
|
+
mutable.output?.write('\n');
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
return { ask, askSecret, log };
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=prompt-io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-io.js","sourceRoot":"","sources":["../../../../../cli/src/utils/prompt-io.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiBH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAC/B,EAAqB,EACrB,WAAwB,EACxB,MAA8B,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IAEzD,MAAM,GAAG,GAAG,CAAC,QAAgB,EAAmB,EAAE,CACjD,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC/B,MAAM,OAAO,GAAG,GAAS,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAClD,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAChC,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACpC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEJ,MAAM,SAAS,GAAG,KAAK,EAAE,QAAgB,EAAmB,EAAE;QAC7D,MAAM,OAAO,GAAG,EAAgC,CAAC;QACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC;QACxC,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,+DAA+D;QAC/D,OAAO,CAAC,cAAc,GAAG,CAAC,IAAY,EAAQ,EAAE;YAC/C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACf,QAAQ,GAAG,IAAI,CAAC;gBAChB,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;QACF,CAAC,CAAC;QACF,IAAI,CAAC;YACJ,OAAO,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;gBAAS,CAAC;YACV,OAAO,CAAC,cAAc,GAAG,QAAQ,CAAC;YAClC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACF,CAAC,CAAC;IAEF,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;AAChC,CAAC"}
|