@resolveio/server-lib 22.3.106 → 22.3.108

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/http/auth.js CHANGED
@@ -79,6 +79,13 @@ function reportHttpValidationError(route, body, errors) {
79
79
  });
80
80
  });
81
81
  }
82
+ function isEnrollmentPhoneVerificationRequired(body) {
83
+ var value = body === null || body === void 0 ? void 0 : body.requireEnrollmentPhoneVerification;
84
+ return value === true || String(value || '').toLowerCase() === 'true';
85
+ }
86
+ function normalizePhoneNumberDigits(value) {
87
+ return String(value || '').replace(/\D/g, '');
88
+ }
82
89
  function setupAuthRoutes(mainServer, app, serverConfig) {
83
90
  var _this = this;
84
91
  app.post('/login365', express.json(), function (request, response) { return __awaiter(_this, void 0, void 0, function () {
@@ -559,6 +566,14 @@ function setupAuthRoutes(mainServer, app, serverConfig) {
559
566
  },
560
567
  password: {
561
568
  type: String
569
+ },
570
+ phonenumber: {
571
+ type: String,
572
+ optional: true
573
+ },
574
+ requireEnrollmentPhoneVerification: {
575
+ type: Boolean,
576
+ optional: true
562
577
  }
563
578
  });
564
579
  _a.label = 2;
@@ -581,7 +596,7 @@ function setupAuthRoutes(mainServer, app, serverConfig) {
581
596
  case 5: return [3 /*break*/, 6];
582
597
  case 6:
583
598
  jwt.verify(body_2.enrollmentToken, serverConfig['JWT_SECRET'], function (err, decoded) { return __awaiter(_this, void 0, void 0, function () {
584
- var user, _a;
599
+ var user, submittedPhone, userPhone, _a;
585
600
  return __generator(this, function (_b) {
586
601
  switch (_b.label) {
587
602
  case 0:
@@ -603,6 +618,17 @@ function setupAuthRoutes(mainServer, app, serverConfig) {
603
618
  user = _b.sent();
604
619
  if (!user) return [3 /*break*/, 6];
605
620
  if (!user.active) return [3 /*break*/, 4];
621
+ if (isEnrollmentPhoneVerificationRequired(body_2)) {
622
+ submittedPhone = normalizePhoneNumberDigits(body_2.phonenumber);
623
+ userPhone = normalizePhoneNumberDigits(user.phonenumber);
624
+ if (!submittedPhone || !userPhone || submittedPhone !== userPhone) {
625
+ response.send(JSON.stringify({
626
+ error: true,
627
+ result: 'Invalid Phone Number'
628
+ }));
629
+ return [2 /*return*/];
630
+ }
631
+ }
606
632
  return [4 /*yield*/, user_collection_1.Users.setPassword(user, body_2.password)];
607
633
  case 3:
608
634
  _b.sent();
package/http/auth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/http/auth.ts"],"names":[],"mappings":"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","file":"auth.js","sourcesContent":["import * as express from 'express';\nimport * as handlebars from 'handlebars';\nimport * as jwt from 'jsonwebtoken';\nimport { jwtDecode } from 'jwt-decode';\nimport SimpleSchema from 'simpl-schema';\nimport { Users } from '../collections/user.collection';\nimport { ResolveIOServer } from '../resolveio-server-app';\nimport { ResolveIOMainServer } from '../server-app';\nimport { isAllowedOrigin, objectIdHexString } from '../util/common';\nimport { ErrorReporter } from '../util/error-reporter';\n\nasync function reportHttpValidationError(route: string, body: any, errors: any) {\n\tconst correlationId = objectIdHexString();\n\tconst config = ResolveIOServer.getServerConfig();\n\tawait ErrorReporter.report({\n\t\tsourceApp: 'http-auth',\n\t\tmessage: 'HTTP Validation Error - ' + route,\n\t\tenvironment: config?.ROOT_URL,\n\t\tclientSlug: ResolveIOServer.getClientName(),\n\t\tclientName: config?.CLIENT_NAME,\n\t\tcontext: {\n\t\t\troute,\n\t\t\tbody,\n\t\t\terrors\n\t\t},\n\t\tmetadata: {\n\t\t\tcontext: 'http-validation',\n\t\t\troute,\n\t\t\tcorrelationId\n\t\t},\n\t\tcorrelationId\n\t});\n}\n\nexport function setupAuthRoutes(mainServer: ResolveIOMainServer, app, serverConfig) {\n\tapp.post('/login365', express.json(), async (request, response) => {\n\t\tif (!isAllowedOrigin(request.headers.origin, serverConfig)) {\n\t\t\tresponse.send(JSON.stringify({\n\t\t\t\terror: true,\n\t\t\t\tresult: 'Invalid header'\n\t\t\t}));\n\t\t}\n\t\telse {\n\t\t\tlet body = request.body;\n\n\t\t\tlet schema = new SimpleSchema({\n\t\t\t\tid_token: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\ttry {\n\t\t\t\tschema.validate(body);\n\t\t\t}\n\t\t\tcatch (errors) {\n\t\t\t\tif (errors) {\n\t\t\t\t\tconsole.error(new Date(), 'Error in HTTP Check (/login)', errors);\n\n\t\t\t\t\tawait reportHttpValidationError('/login365', body, errors);\n\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Parameters'\n\t\t\t\t\t}));\n\t\t\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet tokenData = body.id_token.split('&');\n\t\t\tlet token = tokenData[0].split('=')[1];\n\t\t\tlet decodedJWT = jwtDecode(token);\n\n\t\t\tif (decodedJWT && decodedJWT['name'] && decodedJWT['preferred_username'] && decodedJWT['oid']) {\n\t\t\t\tlet user = await Users.findOne({'other.ms_oid': decodedJWT['oid']});\n\n\t\t\t\tif (!user) {\n\t\t\t\t\tuser = await Users.findOne({email: decodedJWT['preferred_username'].toLowerCase()});\n\n\t\t\t\t\tif (user) {\n\t\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {'other.ms_oid': decodedJWT['oid']}});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!user) {\n\t\t\t\t\tuser = {\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\troles: {\n\t\t\t\t\t\t\tsuper_admin: false,\n\t\t\t\t\t\t\tapprovals: [],\n\t\t\t\t\t\t\tgroups: [],\n\t\t\t\t\t\t\tnotifications: [],\n\t\t\t\t\t\t\tmiscs: []\n\t\t\t\t\t\t},\n\t\t\t\t\t\tusername: decodedJWT['preferred_username'].toLowerCase(),\n\t\t\t\t\t\temail: decodedJWT['preferred_username'].toLowerCase(),\n\t\t\t\t\t\tfullname: decodedJWT['name'],\n\t\t\t\t\t\tactive: true,\n\t\t\t\t\t\tphonenumber: '',\n\t\t\t\t\t\treadonly: false,\n\t\t\t\t\t\tother: {\n\t\t\t\t\t\t\tms_oid: decodedJWT['oid']\n\t\t\t\t\t\t},\n\t\t\t\t\t\tattempts: 0,\n\t\t\t\t\t\tsalt: jwt.sign({now: (Date.now() - 1000).toString()}, serverConfig['JWT_SECRET'], {\n\t\t\t\t\t\t\texpiresIn : 90 * 24 * 60 * 60 * 1000 // 90 days\n\t\t\t\t\t\t}),\n\t\t\t\t\t\thash: jwt.sign({now: (Date.now() + 1000).toString()}, serverConfig['JWT_SECRET'], {\n\t\t\t\t\t\t\texpiresIn : 90 * 24 * 60 * 60 * 1000 // 90 days\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tlast: new Date(),\n\t\t\t\t\t\tsettings: null,\n\t\t\t\t\t\tservices: null,\n\t\t\t\t\t\tis_customer: false\n\t\t\t\t\t};\n\t\t\t\t\t\n\t\t\t\t\tawait Users.create(user);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet update = false;\n\n\t\t\t\t\tif (user.email !== decodedJWT['preferred_username'].toLowerCase()) {\n\t\t\t\t\t\tuser.email = decodedJWT['preferred_username'].toLowerCase();\n\t\t\t\t\t\tupdate = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (user.fullname !== decodedJWT['name']) {\n\t\t\t\t\t\tuser.fullname = decodedJWT['name'];\n\t\t\t\t\t\tupdate = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (update) {\n\t\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {email: user.email, fullname: user.fullname}});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\terror: false,\n\t\t\t\t\tresult: {\n\t\t\t\t\t\ttoken: jwt.sign({id_user: user._id}, serverConfig['JWT_SECRET'], {\n\t\t\t\t\t\t\texpiresIn : 90 * 24 * 60 * 60 * 1000 // 90 days\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.log('ERROR - 1', tokenData, token, decodedJWT);\n\n\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\terror: true,\n\t\t\t\t\tresult: 'Invalid Azure Token'\n\t\t\t\t}));\n\t\t\t}\n\t\t}\n\t});\n\n\t// Login via HTTP, return refresh token if authenticated\n\tapp.post('/login', express.json(), async (request, response) => {\n\t\tif (!isAllowedOrigin(request.headers.origin, serverConfig)) {\n\t\t\tresponse.send(JSON.stringify({\n\t\t\t\terror: true,\n\t\t\t\tresult: 'Invalid header'\n\t\t\t}));\n\t\t}\n\t\telse {\n\n\t\t\tlet body = request.body;\n\n\t\t\tlet schema = new SimpleSchema({\n\t\t\t\tusername: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tpassword: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\ttry {\n\t\t\t\tschema.validate(body);\n\t\t\t}\n\t\t\tcatch (errors) {\n\t\t\t\tif (errors) {\n\t\t\t\t\tconsole.error(new Date(), 'Error in HTTP Check (/login)', errors);\n\n\t\t\t\t\tawait reportHttpValidationError('/login', body, errors);\n\t\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Parameters'\n\t\t\t\t\t}));\n\t\t\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet user = await Users.findOne({active: true, username: body.username});\n\n\t\t\tif (!user) {\n\t\t\t\tuser = await Users.findOne({active: true, email: body.username});\n\t\t\t}\n\t\t\t\n\t\t\tif (!user) {\n\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\terror: true,\n\t\t\t\t\tresult: 'Invalid Username And Password'\n\t\t\t\t}));\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet resAuth = await Users.authenticate(user, body.password);\n\n\t\t\tif (resAuth['error']) {\n\t\t\t\tif (resAuth['error'] === 'Too Many Attempts') {\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: resAuth['error'] + '. A password reset link has been sent to your email, please reset your password.'\n\t\t\t\t\t}));\n\n\t\t\t\t\tif (!user.services) {\n\t\t\t\t\t\tuser.services = {};\n\t\t\t\t\t}\n\n\t\t\t\t\tuser.services['forgot_password'] = jwt.sign({id_user: user._id}, serverConfig['JWT_SECRET']);\n\n\t\t\t\t\tlet emailData = {\n\t\t\t\t\t\tuserToChangePassword: user.fullname,\n\t\t\t\t\t\tuserWhoResetPassword: ResolveIOServer.getClientName() + ' System',\n\t\t\t\t\t\turl: (serverConfig['ROOT_URL'] + '/forgot-password?' + encodeURIComponent(serverConfig['SERVER_URL']) + '&' + user.services['forgot_password'])\n\t\t\t\t\t};\n\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {services: user.services}});\n\t\t\t\t\tlet html = mainServer.getMethodManager().readFile('email-templates/forgot-password.html');\n\t\t\t\t\tlet template = handlebars.compile(html);\n\t\t\t\t\thandlebars.registerHelper('equals', (a, b) => {\n\t\t\t\t\t\treturn a === b;\n\t\t\t\t\t});\n\t\n\t\t\t\t\tawait mainServer.getMethodManager().sendEmail(user.email, 'ResolveIO (' + ResolveIOServer.getClientName() + ') - Forgot Password', '', template(emailData), null, null, '');\n\t\t\t\t}\n\t\t\t\telse if (resAuth['error'] === 'No Salt Value Stored') {\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'A password reset link has been sent to your email, please reset your password.'\n\t\t\t\t\t}));\n\n\t\t\t\t\tif (!user.services) {\n\t\t\t\t\t\tuser.services = {};\n\t\t\t\t\t}\n\n\t\t\t\t\tuser.services['forgot_password'] = jwt.sign({id_user: user._id}, serverConfig['JWT_SECRET']);\n\n\t\t\t\t\tlet emailData = {\n\t\t\t\t\t\tuserToChangePassword: user.fullname,\n\t\t\t\t\t\tuserWhoResetPassword: ResolveIOServer.getClientName() + ' System',\n\t\t\t\t\t\turl: (serverConfig['ROOT_URL'] + '/forgot-password?' + encodeURIComponent(serverConfig['SERVER_URL']) + '&' + user.services['forgot_password'])\n\t\t\t\t\t};\n\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {services: user.services}});\n\t\t\t\t\tlet html = mainServer.getMethodManager().readFile('email-templates/forgot-password.html');\n\t\t\t\t\tlet template = handlebars.compile(html);\n\t\t\t\t\thandlebars.registerHelper('equals', (a, b) => {\n\t\t\t\t\t\treturn a === b;\n\t\t\t\t\t});\n\n\t\t\t\t\tawait mainServer.getMethodManager().sendEmail(user.email, 'ResolveIO (' + ResolveIOServer.getClientName() + ') - Forgot Password', '', template(emailData), null, null, '');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: resAuth['error']\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (resAuth && resAuth['data'] && resAuth['data'].active) {\n\t\t\t\t\tawait Users.resetAttempts(resAuth['data']);\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: false,\n\t\t\t\t\t\tresult: {\n\t\t\t\t\t\t\ttoken: jwt.sign({id_user: resAuth['data']._id}, serverConfig['JWT_SECRET'], {\n\t\t\t\t\t\t\t\texpiresIn : 90 * 24 * 60 * 60 * 1000 // 90 days\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t} \n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\tapp.post('/accessToken', express.json(), async (request, response) => {\n\t\tif (!isAllowedOrigin(request.headers.origin, serverConfig)) {\n\t\t\tresponse.send(JSON.stringify({\n\t\t\t\terror: true,\n\t\t\t\tresult: 'Invalid header'\n\t\t\t}));\n\t\t}\n\t\telse {\n\t\t\tlet body = request.body;\n\n\t\t\tlet schema = new SimpleSchema({\n\t\t\t\trefreshToken: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\ttry {\n\t\t\t\tschema.validate(body);\n\t\t\t}\n\t\t\tcatch (errors) {\n\t\t\t\tif (errors) {\n\t\t\t\t\tconsole.error(new Date(), 'Error in HTTP Check (/accessToken)', errors);\n\n\t\t\t\t\tawait reportHttpValidationError('/accessToken', body, errors);\n\t\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Parameters'\n\t\t\t\t\t}));\n\t\t\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tjwt.verify(body.refreshToken, serverConfig['JWT_SECRET'], async (err, decoded) => {\n\t\t\t\tif (err) {\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Token'\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet user = await Users.findById(decoded['id_user']);\n\t\t\t\t\t\tif (user) {\n\t\t\t\t\t\t\tif (user.active) {\n\t\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\t\terror: false,\n\t\t\t\t\t\t\t\t\tresult: {\n\t\t\t\t\t\t\t\t\t\ttoken: jwt.sign({id_user: user._id}, serverConfig['JWT_SECRET'], {\n\t\t\t\t\t\t\t\t\t\t\texpiresIn : 3 * 24 * 60 * 60 * 1000 // 3 days\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\tuser: user\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t\t\tresult: 'Account is Disabled'\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t\tresult: 'Invalid User'\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch {\n\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\tresult: 'Invalid Mongo Get User'\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\tapp.post('/userWithEnrollmentToken', express.json(), async (request, response) => {\n\t\tif (!isAllowedOrigin(request.headers.origin, serverConfig)) {\n\t\t\tresponse.send(JSON.stringify({\n\t\t\t\terror: true,\n\t\t\t\tresult: 'Invalid header'\n\t\t\t}));\n\t\t}\n\t\telse {\n\t\t\tlet body = request.body;\n\n\t\t\tlet schema = new SimpleSchema({\n\t\t\t\tenrollmentToken: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\ttry {\n\t\t\t\tschema.validate(body);\n\t\t\t}\n\t\t\tcatch (errors) {\n\t\t\t\tif (errors) {\n\t\t\t\t\tconsole.error(new Date(), 'Error in HTTP Check (/userWithEnrollmentToken)', errors);\n\n\t\t\t\t\tawait reportHttpValidationError('/userWithEnrollmentToken', body, errors);\n\t\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Parameters'\n\t\t\t\t\t}));\n\t\t\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tjwt.verify(body.enrollmentToken, serverConfig['JWT_SECRET'], async (err, decoded) => {\n\t\t\t\tif (err) {\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Token'\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet user = await Users.findOne({\n\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t{_id: decoded['id_user']},\n\t\t\t\t\t\t\t\t{'services.enrollment': body.enrollmentToken}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}, {projection: {_id: 1, __v: 1, username: 1, active: 1}});\n\t\t\t\t\t\tif (user) {\n\t\t\t\t\t\t\tif (user.active) {\n\n\t\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\t\terror: false,\n\t\t\t\t\t\t\t\t\tresult: {\n\t\t\t\t\t\t\t\t\t\tuser: user\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t\t\tresult: 'Account is Disabled'\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t\tresult: 'Invalid User'\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch {\n\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\tresult: 'Invalid Mongo Get User'\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\tapp.post('/setUserWithEnrollmentToken', express.json(), async (request, response) => {\n\t\tif (!isAllowedOrigin(request.headers.origin, serverConfig)) {\n\t\t\tresponse.send(JSON.stringify({\n\t\t\t\terror: true,\n\t\t\t\tresult: 'Invalid header'\n\t\t\t}));\n\t\t}\n\t\telse {\n\t\t\tlet body = request.body;\n\n\t\t\tlet schema = new SimpleSchema({\n\t\t\t\tenrollmentToken: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tpassword: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\ttry {\n\t\t\t\tschema.validate(body);\n\t\t\t}\n\t\t\tcatch (errors) {\n\t\t\t\tif (errors) {\n\t\t\t\t\tconsole.error(new Date(), 'Error in HTTP Check (/setUserWithEnrollmentToken)', errors);\n\n\t\t\t\t\tawait reportHttpValidationError('/setUserWithEnrollmentToken', body, errors);\n\t\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Parameters'\n\t\t\t\t\t}));\n\t\t\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tjwt.verify(body.enrollmentToken, serverConfig['JWT_SECRET'], async (err, decoded) => {\n\t\t\t\tif (err) {\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Token'\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet user = await Users.findOne({\n\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t{_id: decoded['id_user']},\n\t\t\t\t\t\t\t\t{'services.enrollment': body.enrollmentToken}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (user) {\n\t\t\t\t\t\t\tif (user.active) {\n\t\t\t\t\t\t\t\tawait Users.setPassword(user, body.password);\n\n\t\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\t\terror: false,\n\t\t\t\t\t\t\t\t\tresult: true\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t\t\tresult: 'Account is Disabled'\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t\tresult: 'Invalid User'\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch {\n\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\tresult: 'Invalid Mongo Get User'\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\tapp.post('/userWithForgotPasswordToken', express.json(), async (request, response) => {\n\t\tif (!isAllowedOrigin(request.headers.origin, serverConfig)) {\n\t\t\tresponse.send(JSON.stringify({\n\t\t\t\terror: true,\n\t\t\t\tresult: 'Invalid header'\n\t\t\t}));\n\t\t}\n\t\telse {\n\t\t\tlet body = request.body;\n\n\t\t\tlet schema = new SimpleSchema({\n\t\t\t\tforgotPasswordToken: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\ttry {\n\t\t\t\tschema.validate(body);\n\t\t\t}\n\t\t\tcatch (errors) {\n\t\t\t\tif (errors) {\n\t\t\t\t\tconsole.error(new Date(), 'Error in HTTP Check (/userWithForgotPasswordToken)', errors);\n\n\t\t\t\t\tawait reportHttpValidationError('/userWithForgotPasswordToken', body, errors);\n\t\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Parameters'\n\t\t\t\t\t}));\n\t\t\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tjwt.verify(body.forgotPasswordToken, serverConfig['JWT_SECRET'], async (err, decoded) => {\n\t\t\t\tif (err) {\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Token'\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet user = await Users.findOne({\n\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t{_id: decoded['id_user']},\n\t\t\t\t\t\t\t\t{'services.forgot_password': body.forgotPasswordToken}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}, {projection: {_id: 1, __v: 1, username: 1, active: 1}});\n\t\t\t\t\t\t\t\n\t\t\t\t\t\tif (user) {\n\t\t\t\t\t\t\tif (user.active) {\n\t\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\t\terror: false,\n\t\t\t\t\t\t\t\t\tresult: {\n\t\t\t\t\t\t\t\t\t\tuser: user\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t\t\tresult: 'Account is Disabled'\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t\tresult: 'Invalid Token'\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch {\n\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\tresult: 'Invalid Mongo Get User'\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\tapp.post('/setUserWithForgotPasswordToken', express.json(), async (request, response) => {\n\t\tif (!isAllowedOrigin(request.headers.origin, serverConfig)) {\n\t\t\tresponse.send(JSON.stringify({\n\t\t\t\terror: true,\n\t\t\t\tresult: 'Invalid header'\n\t\t\t}));\n\t\t}\n\t\telse {\n\t\t\tlet body = request.body;\n\n\t\t\tlet schema = new SimpleSchema({\n\t\t\t\tforgotPasswordToken: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tpassword: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\ttry {\n\t\t\t\tschema.validate(body);\n\t\t\t}\n\t\t\tcatch (errors) {\n\t\t\t\tif (errors) {\n\t\t\t\t\tconsole.error(new Date(), 'Error in HTTP Check (/setUserWithForgotPasswordToken)', errors);\n\n\t\t\t\t\tawait reportHttpValidationError('/setUserWithForgotPasswordToken', body, errors);\n\t\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Parameters'\n\t\t\t\t\t}));\n\t\t\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tjwt.verify(body.forgotPasswordToken, serverConfig['JWT_SECRET'], async (err, decoded) => {\n\t\t\t\tif (err) {\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Token'\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet user = await Users.findOne({\n\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t{_id: decoded['id_user']},\n\t\t\t\t\t\t\t\t{'services.forgot_password': body.forgotPasswordToken}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\n\t\t\t\t\t\tif (user) {\n\t\t\t\t\t\t\tif (user.active) {\n\t\t\t\t\t\t\t\tawait Users.setPassword(user, body.password);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\t\terror: false,\n\t\t\t\t\t\t\t\t\tresult: true\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t\t\tresult: 'Account is Disabled'\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t\tresult: 'Invalid User'\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch {\n\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\tresult: 'Invalid Mongo Get User'\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\tapp.post('/resetPassword', express.json(), async (request, response) => {\n\t\tif (!isAllowedOrigin(request.headers.origin, serverConfig)) {\n\t\t\tresponse.send(JSON.stringify({\n\t\t\t\terror: true,\n\t\t\t\tresult: 'Invalid header'\n\t\t\t}));\n\t\t}\n\t\telse {\n\t\t\tlet body = request.body;\n\n\t\t\tlet schema = new SimpleSchema({\n\t\t\t\tusername: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\ttry {\n\t\t\t\tschema.validate(body);\n\t\t\t}\n\t\t\tcatch (errors) {\n\t\t\t\tif (errors) {\n\t\t\t\t\tconsole.error(new Date(), 'Error in HTTP Check (/resetPassword)', errors);\n\n\t\t\t\t\tawait reportHttpValidationError('/resetPassword', body, errors);\n\t\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Parameters'\n\t\t\t\t\t}));\n\t\t\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet user = await Users.findOne({active: true, username: body.username});\n\n\t\t\tif (!user) {\n\t\t\t\tuser = await Users.findOne({active: true, email: body.username});\n\t\t\t}\n\t\t\t\n\t\t\tif (user) {\n\t\t\t\tawait mainServer.getMethodManager().callMethod.call(mainServer.getMethodManager(), 'resetUserPassword', user._id);\n\t\t\t}\n\n\t\t\tresponse.send(JSON.stringify({\n\t\t\t\terror: false,\n\t\t\t\tresult: ''\n\t\t\t}));\n\t\t}\n\t});\n}\n"]}
1
+ {"version":3,"sources":["../../src/http/auth.ts"],"names":[],"mappings":"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","file":"auth.js","sourcesContent":["import * as express from 'express';\nimport * as handlebars from 'handlebars';\nimport * as jwt from 'jsonwebtoken';\nimport { jwtDecode } from 'jwt-decode';\nimport SimpleSchema from 'simpl-schema';\nimport { Users } from '../collections/user.collection';\nimport { ResolveIOServer } from '../resolveio-server-app';\nimport { ResolveIOMainServer } from '../server-app';\nimport { isAllowedOrigin, objectIdHexString } from '../util/common';\nimport { ErrorReporter } from '../util/error-reporter';\n\nasync function reportHttpValidationError(route: string, body: any, errors: any) {\n\tconst correlationId = objectIdHexString();\n\tconst config = ResolveIOServer.getServerConfig();\n\tawait ErrorReporter.report({\n\t\tsourceApp: 'http-auth',\n\t\tmessage: 'HTTP Validation Error - ' + route,\n\t\tenvironment: config?.ROOT_URL,\n\t\tclientSlug: ResolveIOServer.getClientName(),\n\t\tclientName: config?.CLIENT_NAME,\n\t\tcontext: {\n\t\t\troute,\n\t\t\tbody,\n\t\t\terrors\n\t\t},\n\t\tmetadata: {\n\t\t\tcontext: 'http-validation',\n\t\t\troute,\n\t\t\tcorrelationId\n\t\t},\n\t\tcorrelationId\n\t});\n}\n\nfunction isEnrollmentPhoneVerificationRequired(body: any) {\n\tlet value = body?.requireEnrollmentPhoneVerification;\n\n\treturn value === true || String(value || '').toLowerCase() === 'true';\n}\n\nfunction normalizePhoneNumberDigits(value: any) {\n\treturn String(value || '').replace(/\\D/g, '');\n}\n\nexport function setupAuthRoutes(mainServer: ResolveIOMainServer, app, serverConfig) {\n\tapp.post('/login365', express.json(), async (request, response) => {\n\t\tif (!isAllowedOrigin(request.headers.origin, serverConfig)) {\n\t\t\tresponse.send(JSON.stringify({\n\t\t\t\terror: true,\n\t\t\t\tresult: 'Invalid header'\n\t\t\t}));\n\t\t}\n\t\telse {\n\t\t\tlet body = request.body;\n\n\t\t\tlet schema = new SimpleSchema({\n\t\t\t\tid_token: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\ttry {\n\t\t\t\tschema.validate(body);\n\t\t\t}\n\t\t\tcatch (errors) {\n\t\t\t\tif (errors) {\n\t\t\t\t\tconsole.error(new Date(), 'Error in HTTP Check (/login)', errors);\n\n\t\t\t\t\tawait reportHttpValidationError('/login365', body, errors);\n\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Parameters'\n\t\t\t\t\t}));\n\t\t\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet tokenData = body.id_token.split('&');\n\t\t\tlet token = tokenData[0].split('=')[1];\n\t\t\tlet decodedJWT = jwtDecode(token);\n\n\t\t\tif (decodedJWT && decodedJWT['name'] && decodedJWT['preferred_username'] && decodedJWT['oid']) {\n\t\t\t\tlet user = await Users.findOne({'other.ms_oid': decodedJWT['oid']});\n\n\t\t\t\tif (!user) {\n\t\t\t\t\tuser = await Users.findOne({email: decodedJWT['preferred_username'].toLowerCase()});\n\n\t\t\t\t\tif (user) {\n\t\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {'other.ms_oid': decodedJWT['oid']}});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!user) {\n\t\t\t\t\tuser = {\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\troles: {\n\t\t\t\t\t\t\tsuper_admin: false,\n\t\t\t\t\t\t\tapprovals: [],\n\t\t\t\t\t\t\tgroups: [],\n\t\t\t\t\t\t\tnotifications: [],\n\t\t\t\t\t\t\tmiscs: []\n\t\t\t\t\t\t},\n\t\t\t\t\t\tusername: decodedJWT['preferred_username'].toLowerCase(),\n\t\t\t\t\t\temail: decodedJWT['preferred_username'].toLowerCase(),\n\t\t\t\t\t\tfullname: decodedJWT['name'],\n\t\t\t\t\t\tactive: true,\n\t\t\t\t\t\tphonenumber: '',\n\t\t\t\t\t\treadonly: false,\n\t\t\t\t\t\tother: {\n\t\t\t\t\t\t\tms_oid: decodedJWT['oid']\n\t\t\t\t\t\t},\n\t\t\t\t\t\tattempts: 0,\n\t\t\t\t\t\tsalt: jwt.sign({now: (Date.now() - 1000).toString()}, serverConfig['JWT_SECRET'], {\n\t\t\t\t\t\t\texpiresIn : 90 * 24 * 60 * 60 * 1000 // 90 days\n\t\t\t\t\t\t}),\n\t\t\t\t\t\thash: jwt.sign({now: (Date.now() + 1000).toString()}, serverConfig['JWT_SECRET'], {\n\t\t\t\t\t\t\texpiresIn : 90 * 24 * 60 * 60 * 1000 // 90 days\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tlast: new Date(),\n\t\t\t\t\t\tsettings: null,\n\t\t\t\t\t\tservices: null,\n\t\t\t\t\t\tis_customer: false\n\t\t\t\t\t};\n\t\t\t\t\t\n\t\t\t\t\tawait Users.create(user);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet update = false;\n\n\t\t\t\t\tif (user.email !== decodedJWT['preferred_username'].toLowerCase()) {\n\t\t\t\t\t\tuser.email = decodedJWT['preferred_username'].toLowerCase();\n\t\t\t\t\t\tupdate = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (user.fullname !== decodedJWT['name']) {\n\t\t\t\t\t\tuser.fullname = decodedJWT['name'];\n\t\t\t\t\t\tupdate = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (update) {\n\t\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {email: user.email, fullname: user.fullname}});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\terror: false,\n\t\t\t\t\tresult: {\n\t\t\t\t\t\ttoken: jwt.sign({id_user: user._id}, serverConfig['JWT_SECRET'], {\n\t\t\t\t\t\t\texpiresIn : 90 * 24 * 60 * 60 * 1000 // 90 days\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.log('ERROR - 1', tokenData, token, decodedJWT);\n\n\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\terror: true,\n\t\t\t\t\tresult: 'Invalid Azure Token'\n\t\t\t\t}));\n\t\t\t}\n\t\t}\n\t});\n\n\t// Login via HTTP, return refresh token if authenticated\n\tapp.post('/login', express.json(), async (request, response) => {\n\t\tif (!isAllowedOrigin(request.headers.origin, serverConfig)) {\n\t\t\tresponse.send(JSON.stringify({\n\t\t\t\terror: true,\n\t\t\t\tresult: 'Invalid header'\n\t\t\t}));\n\t\t}\n\t\telse {\n\n\t\t\tlet body = request.body;\n\n\t\t\tlet schema = new SimpleSchema({\n\t\t\t\tusername: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tpassword: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\ttry {\n\t\t\t\tschema.validate(body);\n\t\t\t}\n\t\t\tcatch (errors) {\n\t\t\t\tif (errors) {\n\t\t\t\t\tconsole.error(new Date(), 'Error in HTTP Check (/login)', errors);\n\n\t\t\t\t\tawait reportHttpValidationError('/login', body, errors);\n\t\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Parameters'\n\t\t\t\t\t}));\n\t\t\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet user = await Users.findOne({active: true, username: body.username});\n\n\t\t\tif (!user) {\n\t\t\t\tuser = await Users.findOne({active: true, email: body.username});\n\t\t\t}\n\t\t\t\n\t\t\tif (!user) {\n\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\terror: true,\n\t\t\t\t\tresult: 'Invalid Username And Password'\n\t\t\t\t}));\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet resAuth = await Users.authenticate(user, body.password);\n\n\t\t\tif (resAuth['error']) {\n\t\t\t\tif (resAuth['error'] === 'Too Many Attempts') {\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: resAuth['error'] + '. A password reset link has been sent to your email, please reset your password.'\n\t\t\t\t\t}));\n\n\t\t\t\t\tif (!user.services) {\n\t\t\t\t\t\tuser.services = {};\n\t\t\t\t\t}\n\n\t\t\t\t\tuser.services['forgot_password'] = jwt.sign({id_user: user._id}, serverConfig['JWT_SECRET']);\n\n\t\t\t\t\tlet emailData = {\n\t\t\t\t\t\tuserToChangePassword: user.fullname,\n\t\t\t\t\t\tuserWhoResetPassword: ResolveIOServer.getClientName() + ' System',\n\t\t\t\t\t\turl: (serverConfig['ROOT_URL'] + '/forgot-password?' + encodeURIComponent(serverConfig['SERVER_URL']) + '&' + user.services['forgot_password'])\n\t\t\t\t\t};\n\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {services: user.services}});\n\t\t\t\t\tlet html = mainServer.getMethodManager().readFile('email-templates/forgot-password.html');\n\t\t\t\t\tlet template = handlebars.compile(html);\n\t\t\t\t\thandlebars.registerHelper('equals', (a, b) => {\n\t\t\t\t\t\treturn a === b;\n\t\t\t\t\t});\n\t\n\t\t\t\t\tawait mainServer.getMethodManager().sendEmail(user.email, 'ResolveIO (' + ResolveIOServer.getClientName() + ') - Forgot Password', '', template(emailData), null, null, '');\n\t\t\t\t}\n\t\t\t\telse if (resAuth['error'] === 'No Salt Value Stored') {\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'A password reset link has been sent to your email, please reset your password.'\n\t\t\t\t\t}));\n\n\t\t\t\t\tif (!user.services) {\n\t\t\t\t\t\tuser.services = {};\n\t\t\t\t\t}\n\n\t\t\t\t\tuser.services['forgot_password'] = jwt.sign({id_user: user._id}, serverConfig['JWT_SECRET']);\n\n\t\t\t\t\tlet emailData = {\n\t\t\t\t\t\tuserToChangePassword: user.fullname,\n\t\t\t\t\t\tuserWhoResetPassword: ResolveIOServer.getClientName() + ' System',\n\t\t\t\t\t\turl: (serverConfig['ROOT_URL'] + '/forgot-password?' + encodeURIComponent(serverConfig['SERVER_URL']) + '&' + user.services['forgot_password'])\n\t\t\t\t\t};\n\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {services: user.services}});\n\t\t\t\t\tlet html = mainServer.getMethodManager().readFile('email-templates/forgot-password.html');\n\t\t\t\t\tlet template = handlebars.compile(html);\n\t\t\t\t\thandlebars.registerHelper('equals', (a, b) => {\n\t\t\t\t\t\treturn a === b;\n\t\t\t\t\t});\n\n\t\t\t\t\tawait mainServer.getMethodManager().sendEmail(user.email, 'ResolveIO (' + ResolveIOServer.getClientName() + ') - Forgot Password', '', template(emailData), null, null, '');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: resAuth['error']\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (resAuth && resAuth['data'] && resAuth['data'].active) {\n\t\t\t\t\tawait Users.resetAttempts(resAuth['data']);\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: false,\n\t\t\t\t\t\tresult: {\n\t\t\t\t\t\t\ttoken: jwt.sign({id_user: resAuth['data']._id}, serverConfig['JWT_SECRET'], {\n\t\t\t\t\t\t\t\texpiresIn : 90 * 24 * 60 * 60 * 1000 // 90 days\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t} \n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\tapp.post('/accessToken', express.json(), async (request, response) => {\n\t\tif (!isAllowedOrigin(request.headers.origin, serverConfig)) {\n\t\t\tresponse.send(JSON.stringify({\n\t\t\t\terror: true,\n\t\t\t\tresult: 'Invalid header'\n\t\t\t}));\n\t\t}\n\t\telse {\n\t\t\tlet body = request.body;\n\n\t\t\tlet schema = new SimpleSchema({\n\t\t\t\trefreshToken: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\ttry {\n\t\t\t\tschema.validate(body);\n\t\t\t}\n\t\t\tcatch (errors) {\n\t\t\t\tif (errors) {\n\t\t\t\t\tconsole.error(new Date(), 'Error in HTTP Check (/accessToken)', errors);\n\n\t\t\t\t\tawait reportHttpValidationError('/accessToken', body, errors);\n\t\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Parameters'\n\t\t\t\t\t}));\n\t\t\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tjwt.verify(body.refreshToken, serverConfig['JWT_SECRET'], async (err, decoded) => {\n\t\t\t\tif (err) {\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Token'\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet user = await Users.findById(decoded['id_user']);\n\t\t\t\t\t\tif (user) {\n\t\t\t\t\t\t\tif (user.active) {\n\t\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\t\terror: false,\n\t\t\t\t\t\t\t\t\tresult: {\n\t\t\t\t\t\t\t\t\t\ttoken: jwt.sign({id_user: user._id}, serverConfig['JWT_SECRET'], {\n\t\t\t\t\t\t\t\t\t\t\texpiresIn : 3 * 24 * 60 * 60 * 1000 // 3 days\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\tuser: user\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t\t\tresult: 'Account is Disabled'\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t\tresult: 'Invalid User'\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch {\n\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\tresult: 'Invalid Mongo Get User'\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\tapp.post('/userWithEnrollmentToken', express.json(), async (request, response) => {\n\t\tif (!isAllowedOrigin(request.headers.origin, serverConfig)) {\n\t\t\tresponse.send(JSON.stringify({\n\t\t\t\terror: true,\n\t\t\t\tresult: 'Invalid header'\n\t\t\t}));\n\t\t}\n\t\telse {\n\t\t\tlet body = request.body;\n\n\t\t\tlet schema = new SimpleSchema({\n\t\t\t\tenrollmentToken: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\ttry {\n\t\t\t\tschema.validate(body);\n\t\t\t}\n\t\t\tcatch (errors) {\n\t\t\t\tif (errors) {\n\t\t\t\t\tconsole.error(new Date(), 'Error in HTTP Check (/userWithEnrollmentToken)', errors);\n\n\t\t\t\t\tawait reportHttpValidationError('/userWithEnrollmentToken', body, errors);\n\t\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Parameters'\n\t\t\t\t\t}));\n\t\t\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tjwt.verify(body.enrollmentToken, serverConfig['JWT_SECRET'], async (err, decoded) => {\n\t\t\t\tif (err) {\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Token'\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet user = await Users.findOne({\n\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t{_id: decoded['id_user']},\n\t\t\t\t\t\t\t\t{'services.enrollment': body.enrollmentToken}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}, {projection: {_id: 1, __v: 1, username: 1, active: 1}});\n\t\t\t\t\t\tif (user) {\n\t\t\t\t\t\t\tif (user.active) {\n\n\t\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\t\terror: false,\n\t\t\t\t\t\t\t\t\tresult: {\n\t\t\t\t\t\t\t\t\t\tuser: user\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t\t\tresult: 'Account is Disabled'\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t\tresult: 'Invalid User'\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch {\n\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\tresult: 'Invalid Mongo Get User'\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\tapp.post('/setUserWithEnrollmentToken', express.json(), async (request, response) => {\n\t\tif (!isAllowedOrigin(request.headers.origin, serverConfig)) {\n\t\t\tresponse.send(JSON.stringify({\n\t\t\t\terror: true,\n\t\t\t\tresult: 'Invalid header'\n\t\t\t}));\n\t\t}\n\t\telse {\n\t\t\tlet body = request.body;\n\n\t\t\tlet schema = new SimpleSchema({\n\t\t\t\tenrollmentToken: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tpassword: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tphonenumber: {\n\t\t\t\t\ttype: String,\n\t\t\t\t\toptional: true\n\t\t\t\t},\n\t\t\t\trequireEnrollmentPhoneVerification: {\n\t\t\t\t\ttype: Boolean,\n\t\t\t\t\toptional: true\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\ttry {\n\t\t\t\tschema.validate(body);\n\t\t\t}\n\t\t\tcatch (errors) {\n\t\t\t\tif (errors) {\n\t\t\t\t\tconsole.error(new Date(), 'Error in HTTP Check (/setUserWithEnrollmentToken)', errors);\n\n\t\t\t\t\tawait reportHttpValidationError('/setUserWithEnrollmentToken', body, errors);\n\t\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Parameters'\n\t\t\t\t\t}));\n\t\t\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tjwt.verify(body.enrollmentToken, serverConfig['JWT_SECRET'], async (err, decoded) => {\n\t\t\t\tif (err) {\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Token'\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet user = await Users.findOne({\n\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t{_id: decoded['id_user']},\n\t\t\t\t\t\t\t\t{'services.enrollment': body.enrollmentToken}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (user) {\n\t\t\t\t\t\t\tif (user.active) {\n\t\t\t\t\t\t\t\tif (isEnrollmentPhoneVerificationRequired(body)) {\n\t\t\t\t\t\t\t\t\tlet submittedPhone = normalizePhoneNumberDigits(body.phonenumber);\n\t\t\t\t\t\t\t\t\tlet userPhone = normalizePhoneNumberDigits(user.phonenumber);\n\n\t\t\t\t\t\t\t\t\tif (!submittedPhone || !userPhone || submittedPhone !== userPhone) {\n\t\t\t\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t\t\t\t\tresult: 'Invalid Phone Number'\n\t\t\t\t\t\t\t\t\t\t}));\n\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tawait Users.setPassword(user, body.password);\n\n\t\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\t\terror: false,\n\t\t\t\t\t\t\t\t\tresult: true\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t\t\tresult: 'Account is Disabled'\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t\tresult: 'Invalid User'\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch {\n\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\tresult: 'Invalid Mongo Get User'\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\tapp.post('/userWithForgotPasswordToken', express.json(), async (request, response) => {\n\t\tif (!isAllowedOrigin(request.headers.origin, serverConfig)) {\n\t\t\tresponse.send(JSON.stringify({\n\t\t\t\terror: true,\n\t\t\t\tresult: 'Invalid header'\n\t\t\t}));\n\t\t}\n\t\telse {\n\t\t\tlet body = request.body;\n\n\t\t\tlet schema = new SimpleSchema({\n\t\t\t\tforgotPasswordToken: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\ttry {\n\t\t\t\tschema.validate(body);\n\t\t\t}\n\t\t\tcatch (errors) {\n\t\t\t\tif (errors) {\n\t\t\t\t\tconsole.error(new Date(), 'Error in HTTP Check (/userWithForgotPasswordToken)', errors);\n\n\t\t\t\t\tawait reportHttpValidationError('/userWithForgotPasswordToken', body, errors);\n\t\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Parameters'\n\t\t\t\t\t}));\n\t\t\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tjwt.verify(body.forgotPasswordToken, serverConfig['JWT_SECRET'], async (err, decoded) => {\n\t\t\t\tif (err) {\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Token'\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet user = await Users.findOne({\n\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t{_id: decoded['id_user']},\n\t\t\t\t\t\t\t\t{'services.forgot_password': body.forgotPasswordToken}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}, {projection: {_id: 1, __v: 1, username: 1, active: 1}});\n\t\t\t\t\t\t\t\n\t\t\t\t\t\tif (user) {\n\t\t\t\t\t\t\tif (user.active) {\n\t\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\t\terror: false,\n\t\t\t\t\t\t\t\t\tresult: {\n\t\t\t\t\t\t\t\t\t\tuser: user\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t\t\tresult: 'Account is Disabled'\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t\tresult: 'Invalid Token'\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch {\n\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\tresult: 'Invalid Mongo Get User'\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\tapp.post('/setUserWithForgotPasswordToken', express.json(), async (request, response) => {\n\t\tif (!isAllowedOrigin(request.headers.origin, serverConfig)) {\n\t\t\tresponse.send(JSON.stringify({\n\t\t\t\terror: true,\n\t\t\t\tresult: 'Invalid header'\n\t\t\t}));\n\t\t}\n\t\telse {\n\t\t\tlet body = request.body;\n\n\t\t\tlet schema = new SimpleSchema({\n\t\t\t\tforgotPasswordToken: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tpassword: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\ttry {\n\t\t\t\tschema.validate(body);\n\t\t\t}\n\t\t\tcatch (errors) {\n\t\t\t\tif (errors) {\n\t\t\t\t\tconsole.error(new Date(), 'Error in HTTP Check (/setUserWithForgotPasswordToken)', errors);\n\n\t\t\t\t\tawait reportHttpValidationError('/setUserWithForgotPasswordToken', body, errors);\n\t\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Parameters'\n\t\t\t\t\t}));\n\t\t\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tjwt.verify(body.forgotPasswordToken, serverConfig['JWT_SECRET'], async (err, decoded) => {\n\t\t\t\tif (err) {\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Token'\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet user = await Users.findOne({\n\t\t\t\t\t\t\t$and: [\n\t\t\t\t\t\t\t\t{_id: decoded['id_user']},\n\t\t\t\t\t\t\t\t{'services.forgot_password': body.forgotPasswordToken}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\n\t\t\t\t\t\tif (user) {\n\t\t\t\t\t\t\tif (user.active) {\n\t\t\t\t\t\t\t\tawait Users.setPassword(user, body.password);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\t\terror: false,\n\t\t\t\t\t\t\t\t\tresult: true\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t\t\tresult: 'Account is Disabled'\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\t\tresult: 'Invalid User'\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch {\n\t\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t\tresult: 'Invalid Mongo Get User'\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\tapp.post('/resetPassword', express.json(), async (request, response) => {\n\t\tif (!isAllowedOrigin(request.headers.origin, serverConfig)) {\n\t\t\tresponse.send(JSON.stringify({\n\t\t\t\terror: true,\n\t\t\t\tresult: 'Invalid header'\n\t\t\t}));\n\t\t}\n\t\telse {\n\t\t\tlet body = request.body;\n\n\t\t\tlet schema = new SimpleSchema({\n\t\t\t\tusername: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\ttry {\n\t\t\t\tschema.validate(body);\n\t\t\t}\n\t\t\tcatch (errors) {\n\t\t\t\tif (errors) {\n\t\t\t\t\tconsole.error(new Date(), 'Error in HTTP Check (/resetPassword)', errors);\n\n\t\t\t\t\tawait reportHttpValidationError('/resetPassword', body, errors);\n\t\n\t\t\t\t\tresponse.send(JSON.stringify({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tresult: 'Invalid Parameters'\n\t\t\t\t\t}));\n\t\t\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet user = await Users.findOne({active: true, username: body.username});\n\n\t\t\tif (!user) {\n\t\t\t\tuser = await Users.findOne({active: true, email: body.username});\n\t\t\t}\n\t\t\t\n\t\t\tif (user) {\n\t\t\t\tawait mainServer.getMethodManager().callMethod.call(mainServer.getMethodManager(), 'resetUserPassword', user._id);\n\t\t\t}\n\n\t\t\tresponse.send(JSON.stringify({\n\t\t\t\terror: false,\n\t\t\t\tresult: ''\n\t\t\t}));\n\t\t}\n\t});\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@resolveio/server-lib",
3
- "version": "22.3.106",
3
+ "version": "22.3.108",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "package": "./build_package.sh",
@@ -1,6 +1,56 @@
1
1
  export type ResolveIOSupportV5StepType = 'compile_check' | 'startup_check' | 'live_seed' | 'auth_bootstrap' | 'route_probe' | 'qa_row' | 'build_repair' | 'qa_retest' | 'pr_review' | 'artifact_package' | 'cleanup';
2
2
  export type ResolveIOSupportV5Outcome = 'pass' | 'needs_repair' | 'retry_same_step' | 'park_manual' | 'budget_stop' | 'infra_retry' | 'ready_for_merge';
3
3
  export type ResolveIOSupportV5Lane = 'build' | 'qa' | 'review' | 'supervisor';
4
+ export type ResolveIOSupportV5MicrotaskStatus = 'pending' | 'in_progress' | 'pass' | 'needs_repair' | 'blocked' | 'parked';
5
+ export type ResolveIOSupportV5MicrotaskType = ResolveIOSupportV5StepType | 'planning' | 'scope_slice' | 'product_repair' | 'runner_repair';
6
+ export interface ResolveIOSupportV5PromptBudget {
7
+ initialPlannerCap: number;
8
+ buildMicrotaskCap: number;
9
+ buildMicrotaskHardCap: number;
10
+ qaMicrotaskCap: number;
11
+ qaMicrotaskHardCap: number;
12
+ repairMicrotaskCap: number;
13
+ repairMicrotaskHardCap: number;
14
+ }
15
+ export interface ResolveIOSupportV5Microtask {
16
+ microtaskId: string;
17
+ lane: ResolveIOSupportV5Lane;
18
+ type: ResolveIOSupportV5MicrotaskType;
19
+ status: ResolveIOSupportV5MicrotaskStatus;
20
+ objective: string;
21
+ targetFiles: string[];
22
+ contextRefs: string[];
23
+ selfGate: string;
24
+ acceptanceProof: string;
25
+ threadKey: string;
26
+ promptTokenEstimate?: number;
27
+ attempts: number;
28
+ dependsOn: string[];
29
+ parentScopeId?: string;
30
+ blocker?: string;
31
+ createdAt: string;
32
+ updatedAt: string;
33
+ }
34
+ export interface ResolveIOSupportV5UsageSection {
35
+ name: string;
36
+ tokenEstimate: number;
37
+ }
38
+ export interface ResolveIOSupportV5MicrotaskUsage {
39
+ microtaskId: string;
40
+ lane: ResolveIOSupportV5Lane;
41
+ model?: string;
42
+ threadKey?: string;
43
+ reuseThread: boolean;
44
+ freshReason?: string;
45
+ promptTokenEstimate: number;
46
+ promptSections: ResolveIOSupportV5UsageSection[];
47
+ actualInputTokens?: number;
48
+ actualCachedInputTokens?: number;
49
+ actualOutputTokens?: number;
50
+ durationMs?: number;
51
+ outcome?: ResolveIOSupportV5Outcome | ResolveIOSupportV5MicrotaskStatus;
52
+ recordedAt: string;
53
+ }
4
54
  export interface ResolveIOSupportV5Budget {
5
55
  maxPromptTokensPerNonInitialStep: number;
6
56
  maxLoopsPerTicket: number;
@@ -81,6 +131,10 @@ export interface ResolveIOSupportV5StateBundle {
81
131
  supportV5StepHistory: ResolveIOSupportV5StepRecord[];
82
132
  supportV5Budget: ResolveIOSupportV5Budget;
83
133
  supportV5RunnerIncidents: ResolveIOSupportV5RunnerIncident[];
134
+ supportV5MicrotaskLedger: ResolveIOSupportV5Microtask[];
135
+ supportV5ActiveMicrotaskId?: string;
136
+ supportV5ScopeDigest?: string;
137
+ supportV5MicrotaskUsageHistory: ResolveIOSupportV5MicrotaskUsage[];
84
138
  }
85
139
  export interface ResolveIOSupportV5InitializeInput {
86
140
  jobId: string;
@@ -121,8 +175,25 @@ export interface ResolveIOSupportV5ContinuationDecision {
121
175
  }
122
176
  export declare function fingerprintResolveIOSupportV5Blocker(value: any): string;
123
177
  export declare function buildResolveIOSupportV5Budget(existing?: Partial<ResolveIOSupportV5Budget>): ResolveIOSupportV5Budget;
178
+ export declare function buildResolveIOSupportV5PromptBudget(existing?: Partial<ResolveIOSupportV5PromptBudget>): ResolveIOSupportV5PromptBudget;
179
+ export declare function buildResolveIOSupportV5ScopeDigest(input: {
180
+ goal?: string;
181
+ approvedScope?: string | string[];
182
+ prBranch?: string;
183
+ maxTokens?: number;
184
+ }): string;
185
+ export declare function buildResolveIOSupportV5MicrotaskLedger(input: {
186
+ scopeDigest: string;
187
+ requirements?: string[];
188
+ buildThreadKey: string;
189
+ qaThreadKey: string;
190
+ now?: Date | string;
191
+ existing?: ResolveIOSupportV5Microtask[];
192
+ }): ResolveIOSupportV5Microtask[];
193
+ export declare function selectResolveIOSupportV5ActiveMicrotask(ledger?: ResolveIOSupportV5Microtask[], preferredId?: string): ResolveIOSupportV5Microtask | undefined;
124
194
  export declare function initializeResolveIOSupportV5State(input: ResolveIOSupportV5InitializeInput): ResolveIOSupportV5StateBundle;
125
195
  export declare function recordResolveIOSupportV5Step(bundle: ResolveIOSupportV5StateBundle, step: ResolveIOSupportV5StepInput): ResolveIOSupportV5StateBundle;
196
+ export declare function recordResolveIOSupportV5MicrotaskUsage(bundle: ResolveIOSupportV5StateBundle, usage: Omit<ResolveIOSupportV5MicrotaskUsage, 'recordedAt'>): ResolveIOSupportV5StateBundle;
126
197
  export declare function decideResolveIOSupportV5Continuation(bundle: ResolveIOSupportV5StateBundle): ResolveIOSupportV5ContinuationDecision;
127
198
  export declare function buildResolveIOSupportV5DiagnoseFirstPrompt(lines: {
128
199
  goal?: string;
@@ -135,6 +206,38 @@ export declare function buildResolveIOSupportV5DiagnoseFirstPrompt(lines: {
135
206
  artifactPaths?: string[];
136
207
  changedFiles?: string[];
137
208
  }): string[];
209
+ export declare function buildResolveIOSupportV5MicrotaskPrompt(input: {
210
+ bundle: ResolveIOSupportV5StateBundle;
211
+ lane: 'build' | 'qa';
212
+ model?: string;
213
+ stage?: string;
214
+ failureText?: string;
215
+ changedFiles?: string[];
216
+ artifactPaths?: string[];
217
+ targetFiles?: string[];
218
+ contextSnippets?: string[];
219
+ activeQaRow?: ResolveIOSupportV5LaneMemory['activeQaRow'];
220
+ }): {
221
+ prompt: string;
222
+ promptTokenEstimate: number;
223
+ promptSections: ResolveIOSupportV5UsageSection[];
224
+ activeMicrotask?: ResolveIOSupportV5Microtask;
225
+ withinCap: boolean;
226
+ withinHardCap: boolean;
227
+ cap: number;
228
+ hardCap: number;
229
+ reason?: string;
230
+ };
231
+ export declare function summarizeResolveIOSupportV5MicrotaskUsage(bundle: ResolveIOSupportV5StateBundle): {
232
+ totalPromptTokenEstimate: number;
233
+ byMicrotask: Array<{
234
+ microtaskId: string;
235
+ promptTokenEstimate: number;
236
+ calls: number;
237
+ }>;
238
+ bySection: ResolveIOSupportV5UsageSection[];
239
+ broadPromptViolations: ResolveIOSupportV5MicrotaskUsage[];
240
+ };
138
241
  export declare function buildResolveIOSupportV5Incident(input: {
139
242
  incidentClass: string;
140
243
  summary: string;
@@ -49,10 +49,17 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
49
49
  Object.defineProperty(exports, "__esModule", { value: true });
50
50
  exports.fingerprintResolveIOSupportV5Blocker = fingerprintResolveIOSupportV5Blocker;
51
51
  exports.buildResolveIOSupportV5Budget = buildResolveIOSupportV5Budget;
52
+ exports.buildResolveIOSupportV5PromptBudget = buildResolveIOSupportV5PromptBudget;
53
+ exports.buildResolveIOSupportV5ScopeDigest = buildResolveIOSupportV5ScopeDigest;
54
+ exports.buildResolveIOSupportV5MicrotaskLedger = buildResolveIOSupportV5MicrotaskLedger;
55
+ exports.selectResolveIOSupportV5ActiveMicrotask = selectResolveIOSupportV5ActiveMicrotask;
52
56
  exports.initializeResolveIOSupportV5State = initializeResolveIOSupportV5State;
53
57
  exports.recordResolveIOSupportV5Step = recordResolveIOSupportV5Step;
58
+ exports.recordResolveIOSupportV5MicrotaskUsage = recordResolveIOSupportV5MicrotaskUsage;
54
59
  exports.decideResolveIOSupportV5Continuation = decideResolveIOSupportV5Continuation;
55
60
  exports.buildResolveIOSupportV5DiagnoseFirstPrompt = buildResolveIOSupportV5DiagnoseFirstPrompt;
61
+ exports.buildResolveIOSupportV5MicrotaskPrompt = buildResolveIOSupportV5MicrotaskPrompt;
62
+ exports.summarizeResolveIOSupportV5MicrotaskUsage = summarizeResolveIOSupportV5MicrotaskUsage;
56
63
  exports.buildResolveIOSupportV5Incident = buildResolveIOSupportV5Incident;
57
64
  function isoNow(value) {
58
65
  if (value instanceof Date) {
@@ -97,6 +104,21 @@ function cleanList(values, limit, max) {
97
104
  }
98
105
  return result;
99
106
  }
107
+ function stableIdFromText(prefix, value) {
108
+ var text = cleanText(value, 2000).toLowerCase();
109
+ var hash = 0;
110
+ for (var index = 0; index < text.length; index += 1) {
111
+ hash = ((hash << 5) - hash + text.charCodeAt(index)) | 0;
112
+ }
113
+ return "".concat(prefix, "-").concat(Math.abs(hash).toString(36) || '0');
114
+ }
115
+ function estimateTextTokens(value) {
116
+ var text = String(value || '');
117
+ if (!text) {
118
+ return 0;
119
+ }
120
+ return Math.max(1, Math.ceil(text.length / 4));
121
+ }
100
122
  function fingerprintResolveIOSupportV5Blocker(value) {
101
123
  var text = cleanText(value, 4000)
102
124
  .toLowerCase()
@@ -111,7 +133,7 @@ function fingerprintResolveIOSupportV5Blocker(value) {
111
133
  }
112
134
  function buildResolveIOSupportV5Budget(existing) {
113
135
  return {
114
- maxPromptTokensPerNonInitialStep: Number((existing === null || existing === void 0 ? void 0 : existing.maxPromptTokensPerNonInitialStep) || 4000),
136
+ maxPromptTokensPerNonInitialStep: Number((existing === null || existing === void 0 ? void 0 : existing.maxPromptTokensPerNonInitialStep) || 1800),
115
137
  maxLoopsPerTicket: Number((existing === null || existing === void 0 ? void 0 : existing.maxLoopsPerTicket) || 24),
116
138
  maxRepeatedNoProgress: Number((existing === null || existing === void 0 ? void 0 : existing.maxRepeatedNoProgress) || 2),
117
139
  maxRuntimeMinutesPerLoop: Number((existing === null || existing === void 0 ? void 0 : existing.maxRuntimeMinutesPerLoop) || 15),
@@ -120,6 +142,110 @@ function buildResolveIOSupportV5Budget(existing) {
120
142
  loopCount: Number((existing === null || existing === void 0 ? void 0 : existing.loopCount) || 0)
121
143
  };
122
144
  }
145
+ function buildResolveIOSupportV5PromptBudget(existing) {
146
+ return {
147
+ initialPlannerCap: Number((existing === null || existing === void 0 ? void 0 : existing.initialPlannerCap) || 6000),
148
+ buildMicrotaskCap: Number((existing === null || existing === void 0 ? void 0 : existing.buildMicrotaskCap) || 1800),
149
+ buildMicrotaskHardCap: Number((existing === null || existing === void 0 ? void 0 : existing.buildMicrotaskHardCap) || 2500),
150
+ qaMicrotaskCap: Number((existing === null || existing === void 0 ? void 0 : existing.qaMicrotaskCap) || 1500),
151
+ qaMicrotaskHardCap: Number((existing === null || existing === void 0 ? void 0 : existing.qaMicrotaskHardCap) || 2200),
152
+ repairMicrotaskCap: Number((existing === null || existing === void 0 ? void 0 : existing.repairMicrotaskCap) || 1200),
153
+ repairMicrotaskHardCap: Number((existing === null || existing === void 0 ? void 0 : existing.repairMicrotaskHardCap) || 1800)
154
+ };
155
+ }
156
+ function buildResolveIOSupportV5ScopeDigest(input) {
157
+ var scope = Array.isArray(input.approvedScope)
158
+ ? cleanList(input.approvedScope, 30, 220).join(' | ')
159
+ : cleanText(input.approvedScope, 4000);
160
+ var raw = [
161
+ input.goal ? "Goal: ".concat(cleanText(input.goal, 300)) : '',
162
+ scope ? "Approved scope: ".concat(scope) : '',
163
+ input.prBranch ? "PR branch: ".concat(cleanText(input.prBranch, 160)) : ''
164
+ ].filter(Boolean).join('\n');
165
+ var maxChars = Math.max(400, Math.floor(Number(input.maxTokens || 1000) * 4));
166
+ return raw.slice(0, maxChars);
167
+ }
168
+ function buildResolveIOSupportV5MicrotaskLedger(input) {
169
+ var e_2, _a;
170
+ var existing = Array.isArray(input.existing) ? input.existing : [];
171
+ var completedByObjective = new Map();
172
+ try {
173
+ for (var existing_1 = __values(existing), existing_1_1 = existing_1.next(); !existing_1_1.done; existing_1_1 = existing_1.next()) {
174
+ var task = existing_1_1.value;
175
+ if (task && (task.status === 'pass' || task.status === 'parked')) {
176
+ completedByObjective.set(cleanText(task.objective, 500).toLowerCase(), task);
177
+ }
178
+ }
179
+ }
180
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
181
+ finally {
182
+ try {
183
+ if (existing_1_1 && !existing_1_1.done && (_a = existing_1.return)) _a.call(existing_1);
184
+ }
185
+ finally { if (e_2) throw e_2.error; }
186
+ }
187
+ var now = isoNow(input.now);
188
+ var requirements = cleanList(input.requirements, 30, 240);
189
+ var sourceRequirements = requirements.length
190
+ ? requirements
191
+ : cleanText(input.scopeDigest, 1000).split(/\s+\|\s+|\r?\n/g).map(function (line) { return line.trim(); }).filter(Boolean).slice(0, 12);
192
+ var ledger = [];
193
+ sourceRequirements.forEach(function (requirement, index) {
194
+ var objective = cleanText(requirement, 240);
195
+ if (!objective) {
196
+ return;
197
+ }
198
+ var existingCompleted = completedByObjective.get(objective.toLowerCase());
199
+ var buildId = stableIdFromText("build-".concat(index + 1), objective);
200
+ var qaId = stableIdFromText("qa-".concat(index + 1), objective);
201
+ ledger.push(existingCompleted && existingCompleted.lane === 'build' ? existingCompleted : {
202
+ microtaskId: buildId,
203
+ lane: 'build',
204
+ type: 'build_repair',
205
+ status: 'pending',
206
+ objective: objective,
207
+ targetFiles: [],
208
+ contextRefs: ['scope_digest'],
209
+ selfGate: 'Run the smallest compile/type/unit check that proves this one behavior.',
210
+ acceptanceProof: 'Concrete code/data proof for this behavior, with changed files listed.',
211
+ threadKey: input.buildThreadKey,
212
+ attempts: 0,
213
+ dependsOn: [],
214
+ parentScopeId: stableIdFromText('scope', objective),
215
+ createdAt: now,
216
+ updatedAt: now
217
+ });
218
+ ledger.push({
219
+ microtaskId: qaId,
220
+ lane: 'qa',
221
+ type: 'qa_row',
222
+ status: 'pending',
223
+ objective: "QA proof for: ".concat(objective),
224
+ targetFiles: [],
225
+ contextRefs: ['scope_digest', buildId],
226
+ selfGate: 'Drive this one customer-facing workflow row in browser/localhost and capture one captioned proof artifact.',
227
+ acceptanceProof: 'QA matrix row pass with route/data assertion and screenshot/caption artifact.',
228
+ threadKey: input.qaThreadKey,
229
+ attempts: 0,
230
+ dependsOn: [buildId],
231
+ parentScopeId: stableIdFromText('scope', objective),
232
+ createdAt: now,
233
+ updatedAt: now
234
+ });
235
+ });
236
+ return ledger.length ? ledger : existing.slice(-80);
237
+ }
238
+ function selectResolveIOSupportV5ActiveMicrotask(ledger, preferredId) {
239
+ if (ledger === void 0) { ledger = []; }
240
+ var byPreferred = preferredId ? ledger.find(function (task) { return task.microtaskId === preferredId && !['pass', 'parked'].includes(task.status); }) : undefined;
241
+ if (byPreferred) {
242
+ return byPreferred;
243
+ }
244
+ return ledger.find(function (task) { return task.status === 'needs_repair'; })
245
+ || ledger.find(function (task) { return task.status === 'in_progress'; })
246
+ || ledger.find(function (task) { return task.status === 'pending'; })
247
+ || ledger.find(function (task) { return task.status === 'blocked'; });
248
+ }
123
249
  function initializeResolveIOSupportV5State(input) {
124
250
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
125
251
  var now = isoNow(input.now);
@@ -133,6 +259,20 @@ function initializeResolveIOSupportV5State(input) {
133
259
  var buildThreadKey = cleanText(input.buildThreadKey || ((_a = existingLaneMemory.build) === null || _a === void 0 ? void 0 : _a.threadKey) || "support:".concat(input.ticketId || input.jobId, ":job:").concat(input.jobId, ":build"), 240);
134
260
  var qaThreadKey = cleanText(input.qaThreadKey || ((_b = existingLaneMemory.qa) === null || _b === void 0 ? void 0 : _b.threadKey) || "support:".concat(input.ticketId || input.jobId, ":job:").concat(input.jobId, ":qa"), 240);
135
261
  var budget = buildResolveIOSupportV5Budget(existing.supportV5Budget);
262
+ var scopeDigest = cleanText(existing.supportV5ScopeDigest, 4000) || buildResolveIOSupportV5ScopeDigest({
263
+ goal: (existingSupervisor === null || existingSupervisor === void 0 ? void 0 : existingSupervisor.currentGoal) || "Resolve support ticket ".concat(ticketLabel),
264
+ approvedScope: scope,
265
+ prBranch: input.prBranch || (existingSupervisor === null || existingSupervisor === void 0 ? void 0 : existingSupervisor.prBranch) || ''
266
+ });
267
+ var ledger = buildResolveIOSupportV5MicrotaskLedger({
268
+ scopeDigest: scopeDigest,
269
+ requirements: cleanList(input.approvedScopeRequirements, 30, 240),
270
+ buildThreadKey: buildThreadKey,
271
+ qaThreadKey: qaThreadKey,
272
+ now: now,
273
+ existing: existing.supportV5MicrotaskLedger
274
+ });
275
+ var activeMicrotask = selectResolveIOSupportV5ActiveMicrotask(ledger, existing.supportV5ActiveMicrotaskId);
136
276
  return {
137
277
  supportWorkflowVersion: 'v5',
138
278
  supportV5SupervisorState: {
@@ -182,6 +322,12 @@ function initializeResolveIOSupportV5State(input) {
182
322
  supportV5Budget: budget,
183
323
  supportV5RunnerIncidents: Array.isArray(existing.supportV5RunnerIncidents)
184
324
  ? existing.supportV5RunnerIncidents.slice(-80)
325
+ : [],
326
+ supportV5MicrotaskLedger: ledger,
327
+ supportV5ActiveMicrotaskId: activeMicrotask === null || activeMicrotask === void 0 ? void 0 : activeMicrotask.microtaskId,
328
+ supportV5ScopeDigest: scopeDigest,
329
+ supportV5MicrotaskUsageHistory: Array.isArray(existing.supportV5MicrotaskUsageHistory)
330
+ ? existing.supportV5MicrotaskUsageHistory.slice(-200)
185
331
  : []
186
332
  };
187
333
  }
@@ -212,7 +358,34 @@ function recordResolveIOSupportV5Step(bundle, step) {
212
358
  var supervisor = __assign(__assign({}, bundle.supportV5SupervisorState), { status: step.outcome === 'ready_for_merge' ? 'complete' : (step.outcome === 'park_manual' || step.outcome === 'budget_stop' ? 'parked' : 'active'), activeStep: step.stepType, activeBlocker: record.blocker || '', currentQaRow: step.activeQaRow || bundle.supportV5SupervisorState.currentQaRow, lastGoodCheckpoint: step.outcome === 'pass' || step.outcome === 'ready_for_merge'
213
359
  ? step.stepType
214
360
  : bundle.supportV5SupervisorState.lastGoodCheckpoint, artifactLinks: Array.from(new Set(__spreadArray(__spreadArray([], __read(bundle.supportV5SupervisorState.artifactLinks), false), __read((record.artifactPaths || [])), false))).slice(-80), updatedAt: now });
215
- return __assign(__assign({}, bundle), { supportV5SupervisorState: supervisor, supportV5LaneMemory: laneMemory, supportV5StepHistory: __spreadArray(__spreadArray([], __read(bundle.supportV5StepHistory), false), [record], false).slice(-100), supportV5Budget: __assign(__assign({}, bundle.supportV5Budget), { totalPromptTokenEstimate: bundle.supportV5Budget.totalPromptTokenEstimate + promptTokens, totalRuntimeMs: bundle.supportV5Budget.totalRuntimeMs + runtimeMs, loopCount: bundle.supportV5Budget.loopCount + 1 }) });
361
+ var ledger = (bundle.supportV5MicrotaskLedger || []).map(function (task) {
362
+ if (task.microtaskId !== bundle.supportV5ActiveMicrotaskId) {
363
+ return task;
364
+ }
365
+ var status = step.outcome === 'pass' || step.outcome === 'ready_for_merge'
366
+ ? 'pass'
367
+ : step.outcome === 'park_manual' || step.outcome === 'budget_stop'
368
+ ? 'parked'
369
+ : step.outcome === 'needs_repair' || step.outcome === 'retry_same_step'
370
+ ? 'needs_repair'
371
+ : 'in_progress';
372
+ return __assign(__assign({}, task), { status: status, blocker: record.blocker || task.blocker, promptTokenEstimate: promptTokens || task.promptTokenEstimate, attempts: task.attempts + (step.outcome === 'pass' || step.outcome === 'ready_for_merge' ? 0 : 1), updatedAt: now });
373
+ });
374
+ var nextMicrotask = selectResolveIOSupportV5ActiveMicrotask(ledger, bundle.supportV5ActiveMicrotaskId);
375
+ return __assign(__assign({}, bundle), { supportV5SupervisorState: supervisor, supportV5LaneMemory: laneMemory, supportV5StepHistory: __spreadArray(__spreadArray([], __read(bundle.supportV5StepHistory), false), [record], false).slice(-100), supportV5Budget: __assign(__assign({}, bundle.supportV5Budget), { totalPromptTokenEstimate: bundle.supportV5Budget.totalPromptTokenEstimate + promptTokens, totalRuntimeMs: bundle.supportV5Budget.totalRuntimeMs + runtimeMs, loopCount: bundle.supportV5Budget.loopCount + 1 }), supportV5MicrotaskLedger: ledger, supportV5ActiveMicrotaskId: nextMicrotask === null || nextMicrotask === void 0 ? void 0 : nextMicrotask.microtaskId, supportV5MicrotaskUsageHistory: bundle.supportV5MicrotaskUsageHistory || [] });
376
+ }
377
+ function recordResolveIOSupportV5MicrotaskUsage(bundle, usage) {
378
+ var record = __assign(__assign({}, usage), { microtaskId: cleanText(usage.microtaskId, 160), threadKey: cleanText(usage.threadKey, 240), model: cleanText(usage.model, 80), promptTokenEstimate: Math.max(0, Number(usage.promptTokenEstimate || 0) || 0), promptSections: Array.isArray(usage.promptSections)
379
+ ? usage.promptSections.map(function (section) { return ({
380
+ name: cleanText(section.name, 120),
381
+ tokenEstimate: Math.max(0, Number(section.tokenEstimate || 0) || 0)
382
+ }); }).filter(function (section) { return section.name; })
383
+ : [], recordedAt: isoNow() });
384
+ var ledger = (bundle.supportV5MicrotaskLedger || []).map(function (task) { return task.microtaskId === record.microtaskId
385
+ ? __assign(__assign({}, task), { promptTokenEstimate: record.promptTokenEstimate, updatedAt: record.recordedAt }) : task; });
386
+ return __assign(__assign({}, bundle), { supportV5MicrotaskLedger: ledger, supportV5MicrotaskUsageHistory: __spreadArray(__spreadArray([], __read((bundle.supportV5MicrotaskUsageHistory || [])), false), [
387
+ record
388
+ ], false).slice(-200) });
216
389
  }
217
390
  function decideResolveIOSupportV5Continuation(bundle) {
218
391
  var history = bundle.supportV5StepHistory || [];
@@ -233,7 +406,7 @@ function decideResolveIOSupportV5Continuation(bundle) {
233
406
  }
234
407
  }
235
408
  var budgetExceeded = budget.loopCount >= budget.maxLoopsPerTicket
236
- || ((last === null || last === void 0 ? void 0 : last.promptTokenEstimate) || 0) > budget.maxPromptTokensPerNonInitialStep * 2;
409
+ || ((last === null || last === void 0 ? void 0 : last.promptTokenEstimate) || 0) > budget.maxPromptTokensPerNonInitialStep;
237
410
  if (budgetExceeded) {
238
411
  return {
239
412
  action: 'park',
@@ -281,6 +454,153 @@ function buildResolveIOSupportV5DiagnoseFirstPrompt(lines) {
281
454
  cleanList(lines.artifactPaths, 12, 240).length ? "Artifacts: ".concat(cleanList(lines.artifactPaths, 12, 240).join(', ')) : ''
282
455
  ].filter(Boolean);
283
456
  }
457
+ function buildResolveIOSupportV5MicrotaskPrompt(input) {
458
+ var _a, _b, _c;
459
+ var activeMicrotask = selectResolveIOSupportV5ActiveMicrotask(input.bundle.supportV5MicrotaskLedger || [], input.bundle.supportV5ActiveMicrotaskId);
460
+ var budget = buildResolveIOSupportV5PromptBudget();
461
+ var repairLike = Boolean(input.failureText || (activeMicrotask === null || activeMicrotask === void 0 ? void 0 : activeMicrotask.status) === 'needs_repair' || /repair/i.test(String(input.stage || (activeMicrotask === null || activeMicrotask === void 0 ? void 0 : activeMicrotask.type) || '')));
462
+ var cap = repairLike
463
+ ? budget.repairMicrotaskCap
464
+ : input.lane === 'qa'
465
+ ? budget.qaMicrotaskCap
466
+ : budget.buildMicrotaskCap;
467
+ var hardCap = repairLike
468
+ ? budget.repairMicrotaskHardCap
469
+ : input.lane === 'qa'
470
+ ? budget.qaMicrotaskHardCap
471
+ : budget.buildMicrotaskHardCap;
472
+ var laneMemory = input.bundle.supportV5LaneMemory[input.lane];
473
+ var taskThreadKey = (activeMicrotask === null || activeMicrotask === void 0 ? void 0 : activeMicrotask.threadKey) || laneMemory.threadKey;
474
+ var changedFiles = cleanList(((_a = input.changedFiles) === null || _a === void 0 ? void 0 : _a.length) ? input.changedFiles : laneMemory.changedFiles, 8, 160);
475
+ var artifactPaths = cleanList(((_b = input.artifactPaths) === null || _b === void 0 ? void 0 : _b.length) ? input.artifactPaths : laneMemory.artifactPaths, 8, 200);
476
+ var targetFiles = cleanList(((_c = input.targetFiles) === null || _c === void 0 ? void 0 : _c.length) ? input.targetFiles : activeMicrotask === null || activeMicrotask === void 0 ? void 0 : activeMicrotask.targetFiles, 5, 160);
477
+ var contextSnippets = cleanList(input.contextSnippets, 5, 360);
478
+ var qaRow = input.activeQaRow || (activeMicrotask === null || activeMicrotask === void 0 ? void 0 : activeMicrotask.lane) === 'qa' ? input.activeQaRow || laneMemory.activeQaRow || input.bundle.supportV5SupervisorState.currentQaRow : undefined;
479
+ var sections = [
480
+ {
481
+ name: 'microtask_contract',
482
+ text: [
483
+ 'Support Runner V5 Microtask Contract.',
484
+ 'Use the existing persistent lane thread. Do not start a fresh thread.',
485
+ 'Do exactly one microtask and one proof gate. Do not replay ticket triage, prior plans, attachments, broad QA checklist, or unrelated scope.',
486
+ 'If context is insufficient, request the smallest missing file/log/artifact by path and park this microtask; do not broaden the prompt.',
487
+ 'Do not send customer email. Do not deploy. Do not spawn duplicate server/client/Mongo/browser/Codex processes.'
488
+ ].join('\n')
489
+ },
490
+ {
491
+ name: 'scope_digest',
492
+ text: cleanText(input.bundle.supportV5ScopeDigest || input.bundle.supportV5SupervisorState.approvedScope, 900)
493
+ },
494
+ {
495
+ name: 'active_microtask',
496
+ text: activeMicrotask ? [
497
+ "Microtask id: ".concat(activeMicrotask.microtaskId),
498
+ "Lane: ".concat(input.lane),
499
+ "Type: ".concat(activeMicrotask.type),
500
+ "Status: ".concat(activeMicrotask.status),
501
+ "Objective: ".concat(cleanText(activeMicrotask.objective, 360)),
502
+ "Self-gate: ".concat(cleanText(activeMicrotask.selfGate, 260)),
503
+ "Acceptance proof: ".concat(cleanText(activeMicrotask.acceptanceProof, 260)),
504
+ "Attempts on this microtask: ".concat(activeMicrotask.attempts),
505
+ "Thread key: ".concat(taskThreadKey)
506
+ ].join('\n') : 'No active microtask found. Park and report support_v5_microtask_missing.'
507
+ },
508
+ {
509
+ name: 'failure_delta',
510
+ text: input.failureText ? "Latest blocker/failure delta: ".concat(cleanText(input.failureText, 700)) : ''
511
+ },
512
+ {
513
+ name: 'target_context',
514
+ text: [
515
+ targetFiles.length ? "Target files: ".concat(targetFiles.join(', ')) : '',
516
+ changedFiles.length ? "Changed files: ".concat(changedFiles.join(', ')) : '',
517
+ artifactPaths.length ? "Artifacts: ".concat(artifactPaths.join(', ')) : '',
518
+ (qaRow === null || qaRow === void 0 ? void 0 : qaRow.workflow) ? "QA row workflow: ".concat(cleanText(qaRow.workflow, 220)) : '',
519
+ (qaRow === null || qaRow === void 0 ? void 0 : qaRow.route) ? "QA row route: ".concat(cleanText(qaRow.route, 220)) : '',
520
+ (qaRow === null || qaRow === void 0 ? void 0 : qaRow.assertion) ? "QA row assertion: ".concat(cleanText(qaRow.assertion, 260)) : '',
521
+ contextSnippets.length ? "Relevant snippets:\n".concat(contextSnippets.join('\n---\n')) : ''
522
+ ].filter(Boolean).join('\n')
523
+ },
524
+ {
525
+ name: 'return_contract',
526
+ text: input.lane === 'qa'
527
+ ? 'Return strict JSON only: {"status":"pass"|"needs-fix"|"blocked","microtaskId":"","summary":"","evidence":[""],"artifacts":[""],"next_actions":[""]}.'
528
+ : 'Return concise Markdown with: Microtask Result, Root Cause, Changes, Self-Gate, Acceptance Proof, Residual Risk.'
529
+ }
530
+ ].filter(function (section) { return cleanText(section.text, 20); });
531
+ var promptSections = sections.map(function (section) { return ({
532
+ name: section.name,
533
+ tokenEstimate: estimateTextTokens(section.text)
534
+ }); });
535
+ var prompt = sections.map(function (section) { return section.text; }).join('\n\n');
536
+ var promptTokenEstimate = estimateTextTokens(prompt);
537
+ return {
538
+ prompt: prompt,
539
+ promptTokenEstimate: promptTokenEstimate,
540
+ promptSections: promptSections,
541
+ activeMicrotask: activeMicrotask,
542
+ withinCap: promptTokenEstimate <= cap,
543
+ withinHardCap: promptTokenEstimate <= hardCap,
544
+ cap: cap,
545
+ hardCap: hardCap,
546
+ reason: promptTokenEstimate > hardCap
547
+ ? 'support_v5_microtask_prompt_hard_cap'
548
+ : promptTokenEstimate > cap
549
+ ? 'support_v5_microtask_prompt_soft_cap'
550
+ : undefined
551
+ };
552
+ }
553
+ function summarizeResolveIOSupportV5MicrotaskUsage(bundle) {
554
+ var e_3, _a, e_4, _b;
555
+ var byMicrotask = new Map();
556
+ var bySection = new Map();
557
+ var totalPromptTokenEstimate = 0;
558
+ var broadPromptViolations = [];
559
+ var promptBudget = buildResolveIOSupportV5PromptBudget();
560
+ try {
561
+ for (var _c = __values(bundle.supportV5MicrotaskUsageHistory || []), _d = _c.next(); !_d.done; _d = _c.next()) {
562
+ var usage = _d.value;
563
+ totalPromptTokenEstimate += usage.promptTokenEstimate || 0;
564
+ var existing = byMicrotask.get(usage.microtaskId) || { microtaskId: usage.microtaskId, promptTokenEstimate: 0, calls: 0 };
565
+ existing.promptTokenEstimate += usage.promptTokenEstimate || 0;
566
+ existing.calls += 1;
567
+ byMicrotask.set(usage.microtaskId, existing);
568
+ try {
569
+ for (var _e = (e_4 = void 0, __values(usage.promptSections || [])), _f = _e.next(); !_f.done; _f = _e.next()) {
570
+ var section = _f.value;
571
+ bySection.set(section.name, (bySection.get(section.name) || 0) + section.tokenEstimate);
572
+ }
573
+ }
574
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
575
+ finally {
576
+ try {
577
+ if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
578
+ }
579
+ finally { if (e_4) throw e_4.error; }
580
+ }
581
+ var hardCap = usage.lane === 'qa' ? promptBudget.qaMicrotaskHardCap : promptBudget.buildMicrotaskHardCap;
582
+ if ((usage.promptTokenEstimate || 0) > hardCap) {
583
+ broadPromptViolations.push(usage);
584
+ }
585
+ }
586
+ }
587
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
588
+ finally {
589
+ try {
590
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
591
+ }
592
+ finally { if (e_3) throw e_3.error; }
593
+ }
594
+ return {
595
+ totalPromptTokenEstimate: totalPromptTokenEstimate,
596
+ byMicrotask: Array.from(byMicrotask.values()),
597
+ bySection: Array.from(bySection.entries()).map(function (_a) {
598
+ var _b = __read(_a, 2), name = _b[0], tokenEstimate = _b[1];
599
+ return ({ name: name, tokenEstimate: tokenEstimate });
600
+ }),
601
+ broadPromptViolations: broadPromptViolations
602
+ };
603
+ }
284
604
  function buildResolveIOSupportV5Incident(input) {
285
605
  return {
286
606
  incidentClass: cleanText(input.incidentClass, 120) || 'support_v5_runner_incident',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/util/support-runner-v5.ts"],"names":[],"mappings":"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","file":"support-runner-v5.js","sourcesContent":["export type ResolveIOSupportV5StepType =\n\t| 'compile_check'\n\t| 'startup_check'\n\t| 'live_seed'\n\t| 'auth_bootstrap'\n\t| 'route_probe'\n\t| 'qa_row'\n\t| 'build_repair'\n\t| 'qa_retest'\n\t| 'pr_review'\n\t| 'artifact_package'\n\t| 'cleanup';\n\nexport type ResolveIOSupportV5Outcome =\n\t| 'pass'\n\t| 'needs_repair'\n\t| 'retry_same_step'\n\t| 'park_manual'\n\t| 'budget_stop'\n\t| 'infra_retry'\n\t| 'ready_for_merge';\n\nexport type ResolveIOSupportV5Lane = 'build' | 'qa' | 'review' | 'supervisor';\n\nexport interface ResolveIOSupportV5Budget {\n\tmaxPromptTokensPerNonInitialStep: number;\n\tmaxLoopsPerTicket: number;\n\tmaxRepeatedNoProgress: number;\n\tmaxRuntimeMinutesPerLoop: number;\n\ttotalPromptTokenEstimate: number;\n\ttotalRuntimeMs: number;\n\tloopCount: number;\n}\n\nexport interface ResolveIOSupportV5LaneMemory {\n\tlane: ResolveIOSupportV5Lane;\n\tmodel: string;\n\tthreadKey: string;\n\tscopeSummary: string;\n\tactiveBlocker: string;\n\tactiveQaRow?: {\n\t\tindex?: number;\n\t\tworkflow?: string;\n\t\troute?: string;\n\t\tassertion?: string;\n\t\tstatus?: string;\n\t};\n\tchangedFiles: string[];\n\tartifactPaths: string[];\n\tlatestPromptTokenEstimate?: number;\n\tupdatedAt: string;\n}\n\nexport interface ResolveIOSupportV5SupervisorState {\n\tversion: 'v5';\n\tstatus: 'active' | 'parked' | 'complete';\n\tcurrentGoal: string;\n\tapprovedScope: string;\n\tprBranch: string;\n\tactiveStep: ResolveIOSupportV5StepType;\n\tactiveBlocker: string;\n\tlastGoodCheckpoint: string;\n\tcurrentQaRow?: ResolveIOSupportV5LaneMemory['activeQaRow'];\n\tprocessLease?: {\n\t\trunId?: string;\n\t\ttoken?: string;\n\t\tgeneration?: number;\n\t\tworkspace?: string;\n\t\tlane?: string;\n\t};\n\tartifactLinks: string[];\n\tnoEmailUnlessApproved: boolean;\n\tupdatedAt: string;\n}\n\nexport interface ResolveIOSupportV5StepRecord {\n\tstepType: ResolveIOSupportV5StepType;\n\toutcome: ResolveIOSupportV5Outcome;\n\tlane: ResolveIOSupportV5Lane;\n\tmodel?: string;\n\tthreadKey?: string;\n\tpromptTokenEstimate?: number;\n\truntimeMs?: number;\n\tsummary: string;\n\tblocker?: string;\n\tchangedFiles?: string[];\n\tartifactPaths?: string[];\n\trecordedAt: string;\n}\n\nexport interface ResolveIOSupportV5RunnerIncident {\n\tincidentClass: string;\n\tsummary: string;\n\tstepType?: ResolveIOSupportV5StepType;\n\tblockerFingerprint?: string;\n\tartifactPaths?: string[];\n\trecordedAt: string;\n}\n\nexport interface ResolveIOSupportV5StateBundle {\n\tsupportWorkflowVersion: 'v5';\n\tsupportV5SupervisorState: ResolveIOSupportV5SupervisorState;\n\tsupportV5LaneMemory: {\n\t\tbuild: ResolveIOSupportV5LaneMemory;\n\t\tqa: ResolveIOSupportV5LaneMemory;\n\t};\n\tsupportV5StepHistory: ResolveIOSupportV5StepRecord[];\n\tsupportV5Budget: ResolveIOSupportV5Budget;\n\tsupportV5RunnerIncidents: ResolveIOSupportV5RunnerIncident[];\n}\n\nexport interface ResolveIOSupportV5InitializeInput {\n\tjobId: string;\n\tticketId?: string;\n\tticketNumber?: string;\n\ttitle?: string;\n\tdescription?: string;\n\tapprovedScopeRequirements?: string[];\n\tapprovedScopeHours?: number | null;\n\tprBranch?: string;\n\tbuildThreadKey?: string;\n\tqaThreadKey?: string;\n\tprocessLease?: ResolveIOSupportV5SupervisorState['processLease'];\n\tnow?: Date | string;\n\texisting?: Partial<ResolveIOSupportV5StateBundle>;\n}\n\nexport interface ResolveIOSupportV5StepInput {\n\tstepType: ResolveIOSupportV5StepType;\n\toutcome: ResolveIOSupportV5Outcome;\n\tlane: ResolveIOSupportV5Lane;\n\tmodel?: string;\n\tthreadKey?: string;\n\tpromptTokenEstimate?: number;\n\truntimeMs?: number;\n\tsummary?: string;\n\tblocker?: string;\n\tchangedFiles?: string[];\n\tartifactPaths?: string[];\n\tactiveQaRow?: ResolveIOSupportV5LaneMemory['activeQaRow'];\n\tnow?: Date | string;\n}\n\nexport interface ResolveIOSupportV5ContinuationDecision {\n\taction: 'continue' | 'park';\n\treason: string;\n\tnextStep: ResolveIOSupportV5StepType;\n\trepeatedNoProgressCount: number;\n\tbudgetExceeded: boolean;\n}\n\nfunction isoNow(value?: Date | string): string {\n\tif (value instanceof Date) {\n\t\treturn value.toISOString();\n\t}\n\tconst parsed = value ? new Date(value) : new Date();\n\tif (Number.isFinite(parsed.getTime())) {\n\t\treturn parsed.toISOString();\n\t}\n\treturn new Date().toISOString();\n}\n\nfunction cleanText(value: any, max = 2000): string {\n\treturn String(value || '').replace(/\\s+/g, ' ').trim().slice(0, max);\n}\n\nfunction cleanList(values: any, limit = 20, max = 500): string[] {\n\tif (!Array.isArray(values)) {\n\t\treturn [];\n\t}\n\tconst result: string[] = [];\n\tfor (const value of values) {\n\t\tconst normalized = cleanText(value, max);\n\t\tif (normalized && !result.includes(normalized)) {\n\t\t\tresult.push(normalized);\n\t\t}\n\t\tif (result.length >= limit) {\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn result;\n}\n\nexport function fingerprintResolveIOSupportV5Blocker(value: any): string {\n\tconst text = cleanText(value, 4000)\n\t\t.toLowerCase()\n\t\t.replace(/[a-f0-9]{16,}/g, '<id>')\n\t\t.replace(/\\b\\d{2,}\\b/g, '<n>')\n\t\t.replace(/\\bline\\s+<n>\\b/g, 'line <n>');\n\tlet hash = 0;\n\tfor (let index = 0; index < text.length; index += 1) {\n\t\thash = ((hash << 5) - hash + text.charCodeAt(index)) | 0;\n\t}\n\treturn `v5-${Math.abs(hash).toString(36)}`;\n}\n\nexport function buildResolveIOSupportV5Budget(existing?: Partial<ResolveIOSupportV5Budget>): ResolveIOSupportV5Budget {\n\treturn {\n\t\tmaxPromptTokensPerNonInitialStep: Number(existing?.maxPromptTokensPerNonInitialStep || 4000),\n\t\tmaxLoopsPerTicket: Number(existing?.maxLoopsPerTicket || 24),\n\t\tmaxRepeatedNoProgress: Number(existing?.maxRepeatedNoProgress || 2),\n\t\tmaxRuntimeMinutesPerLoop: Number(existing?.maxRuntimeMinutesPerLoop || 15),\n\t\ttotalPromptTokenEstimate: Number(existing?.totalPromptTokenEstimate || 0),\n\t\ttotalRuntimeMs: Number(existing?.totalRuntimeMs || 0),\n\t\tloopCount: Number(existing?.loopCount || 0)\n\t};\n}\n\nexport function initializeResolveIOSupportV5State(input: ResolveIOSupportV5InitializeInput): ResolveIOSupportV5StateBundle {\n\tconst now = isoNow(input.now);\n\tconst existing = input.existing || {};\n\tconst existingSupervisor = existing.supportV5SupervisorState;\n\tconst existingLaneMemory = existing.supportV5LaneMemory || {} as ResolveIOSupportV5StateBundle['supportV5LaneMemory'];\n\tconst scope = cleanList(input.approvedScopeRequirements, 24, 240).join(' | ')\n\t\t|| cleanText(input.description, 1000)\n\t\t|| cleanText(input.title, 300);\n\tconst ticketLabel = cleanText(input.ticketNumber || input.ticketId || input.jobId, 120);\n\tconst buildThreadKey = cleanText(input.buildThreadKey || existingLaneMemory.build?.threadKey || `support:${input.ticketId || input.jobId}:job:${input.jobId}:build`, 240);\n\tconst qaThreadKey = cleanText(input.qaThreadKey || existingLaneMemory.qa?.threadKey || `support:${input.ticketId || input.jobId}:job:${input.jobId}:qa`, 240);\n\tconst budget = buildResolveIOSupportV5Budget(existing.supportV5Budget);\n\treturn {\n\t\tsupportWorkflowVersion: 'v5',\n\t\tsupportV5SupervisorState: {\n\t\t\tversion: 'v5',\n\t\t\tstatus: existingSupervisor?.status || 'active',\n\t\t\tcurrentGoal: existingSupervisor?.currentGoal || `Resolve support ticket ${ticketLabel}`,\n\t\t\tapprovedScope: existingSupervisor?.approvedScope || scope,\n\t\t\tprBranch: cleanText(input.prBranch || existingSupervisor?.prBranch || '', 240),\n\t\t\tactiveStep: existingSupervisor?.activeStep || 'compile_check',\n\t\t\tactiveBlocker: existingSupervisor?.activeBlocker || '',\n\t\t\tlastGoodCheckpoint: existingSupervisor?.lastGoodCheckpoint || 'v5_initialized',\n\t\t\tcurrentQaRow: existingSupervisor?.currentQaRow,\n\t\t\tprocessLease: input.processLease || existingSupervisor?.processLease,\n\t\t\tartifactLinks: cleanList(existingSupervisor?.artifactLinks, 40, 500),\n\t\t\tnoEmailUnlessApproved: true,\n\t\t\tupdatedAt: now\n\t\t},\n\t\tsupportV5LaneMemory: {\n\t\t\tbuild: {\n\t\t\t\tlane: 'build',\n\t\t\t\tmodel: existingLaneMemory.build?.model || 'gpt-5.3-codex',\n\t\t\t\tthreadKey: buildThreadKey,\n\t\t\t\tscopeSummary: existingLaneMemory.build?.scopeSummary || scope,\n\t\t\t\tactiveBlocker: existingLaneMemory.build?.activeBlocker || '',\n\t\t\t\tactiveQaRow: existingLaneMemory.build?.activeQaRow,\n\t\t\t\tchangedFiles: cleanList(existingLaneMemory.build?.changedFiles, 80, 500),\n\t\t\t\tartifactPaths: cleanList(existingLaneMemory.build?.artifactPaths, 80, 500),\n\t\t\t\tlatestPromptTokenEstimate: Number(existingLaneMemory.build?.latestPromptTokenEstimate || 0) || undefined,\n\t\t\t\tupdatedAt: existingLaneMemory.build?.updatedAt || now\n\t\t\t},\n\t\t\tqa: {\n\t\t\t\tlane: 'qa',\n\t\t\t\tmodel: existingLaneMemory.qa?.model || 'gpt-5.4-mini',\n\t\t\t\tthreadKey: qaThreadKey,\n\t\t\t\tscopeSummary: existingLaneMemory.qa?.scopeSummary || scope,\n\t\t\t\tactiveBlocker: existingLaneMemory.qa?.activeBlocker || '',\n\t\t\t\tactiveQaRow: existingLaneMemory.qa?.activeQaRow,\n\t\t\t\tchangedFiles: cleanList(existingLaneMemory.qa?.changedFiles, 80, 500),\n\t\t\t\tartifactPaths: cleanList(existingLaneMemory.qa?.artifactPaths, 80, 500),\n\t\t\t\tlatestPromptTokenEstimate: Number(existingLaneMemory.qa?.latestPromptTokenEstimate || 0) || undefined,\n\t\t\t\tupdatedAt: existingLaneMemory.qa?.updatedAt || now\n\t\t\t}\n\t\t},\n\t\tsupportV5StepHistory: Array.isArray(existing.supportV5StepHistory)\n\t\t\t? existing.supportV5StepHistory.slice(-80)\n\t\t\t: [],\n\t\tsupportV5Budget: budget,\n\t\tsupportV5RunnerIncidents: Array.isArray(existing.supportV5RunnerIncidents)\n\t\t\t? existing.supportV5RunnerIncidents.slice(-80)\n\t\t\t: []\n\t};\n}\n\nexport function recordResolveIOSupportV5Step(\n\tbundle: ResolveIOSupportV5StateBundle,\n\tstep: ResolveIOSupportV5StepInput\n): ResolveIOSupportV5StateBundle {\n\tconst now = isoNow(step.now);\n\tconst promptTokens = Math.max(0, Number(step.promptTokenEstimate || 0) || 0);\n\tconst runtimeMs = Math.max(0, Number(step.runtimeMs || 0) || 0);\n\tconst record: ResolveIOSupportV5StepRecord = {\n\t\tstepType: step.stepType,\n\t\toutcome: step.outcome,\n\t\tlane: step.lane,\n\t\tmodel: cleanText(step.model, 80),\n\t\tthreadKey: cleanText(step.threadKey, 240),\n\t\tpromptTokenEstimate: promptTokens || undefined,\n\t\truntimeMs: runtimeMs || undefined,\n\t\tsummary: cleanText(step.summary || step.blocker || step.outcome, 1200),\n\t\tblocker: cleanText(step.blocker, 1200),\n\t\tchangedFiles: cleanList(step.changedFiles, 80, 500),\n\t\tartifactPaths: cleanList(step.artifactPaths, 80, 500),\n\t\trecordedAt: now\n\t};\n\tconst laneMemory = { ...bundle.supportV5LaneMemory };\n\tif (step.lane === 'build' || step.lane === 'qa') {\n\t\tconst previous = laneMemory[step.lane];\n\t\tlaneMemory[step.lane] = {\n\t\t\t...previous,\n\t\t\tactiveBlocker: record.blocker || previous.activeBlocker || '',\n\t\t\tactiveQaRow: step.activeQaRow || previous.activeQaRow,\n\t\t\tchangedFiles: record.changedFiles?.length ? record.changedFiles : previous.changedFiles,\n\t\t\tartifactPaths: record.artifactPaths?.length ? record.artifactPaths : previous.artifactPaths,\n\t\t\tlatestPromptTokenEstimate: promptTokens || previous.latestPromptTokenEstimate,\n\t\t\tupdatedAt: now\n\t\t};\n\t}\n\tconst supervisor = {\n\t\t...bundle.supportV5SupervisorState,\n\t\tstatus: step.outcome === 'ready_for_merge' ? 'complete' as const : (step.outcome === 'park_manual' || step.outcome === 'budget_stop' ? 'parked' as const : 'active' as const),\n\t\tactiveStep: step.stepType,\n\t\tactiveBlocker: record.blocker || '',\n\t\tcurrentQaRow: step.activeQaRow || bundle.supportV5SupervisorState.currentQaRow,\n\t\tlastGoodCheckpoint: step.outcome === 'pass' || step.outcome === 'ready_for_merge'\n\t\t\t? step.stepType\n\t\t\t: bundle.supportV5SupervisorState.lastGoodCheckpoint,\n\t\tartifactLinks: Array.from(new Set([\n\t\t\t...bundle.supportV5SupervisorState.artifactLinks,\n\t\t\t...(record.artifactPaths || [])\n\t\t])).slice(-80),\n\t\tupdatedAt: now\n\t};\n\treturn {\n\t\t...bundle,\n\t\tsupportV5SupervisorState: supervisor,\n\t\tsupportV5LaneMemory: laneMemory,\n\t\tsupportV5StepHistory: [...bundle.supportV5StepHistory, record].slice(-100),\n\t\tsupportV5Budget: {\n\t\t\t...bundle.supportV5Budget,\n\t\t\ttotalPromptTokenEstimate: bundle.supportV5Budget.totalPromptTokenEstimate + promptTokens,\n\t\t\ttotalRuntimeMs: bundle.supportV5Budget.totalRuntimeMs + runtimeMs,\n\t\t\tloopCount: bundle.supportV5Budget.loopCount + 1\n\t\t}\n\t};\n}\n\nexport function decideResolveIOSupportV5Continuation(bundle: ResolveIOSupportV5StateBundle): ResolveIOSupportV5ContinuationDecision {\n\tconst history = bundle.supportV5StepHistory || [];\n\tconst budget = buildResolveIOSupportV5Budget(bundle.supportV5Budget);\n\tconst last = history[history.length - 1];\n\tconst blockerFingerprint = fingerprintResolveIOSupportV5Blocker(last?.blocker || last?.summary || '');\n\tlet repeatedNoProgressCount = 0;\n\tfor (let index = history.length - 1; index >= 0; index -= 1) {\n\t\tconst item = history[index];\n\t\tif (item.outcome === 'pass' || item.outcome === 'ready_for_merge') {\n\t\t\tbreak;\n\t\t}\n\t\tif (item.stepType !== last?.stepType) {\n\t\t\tbreak;\n\t\t}\n\t\tif (fingerprintResolveIOSupportV5Blocker(item.blocker || item.summary || '') === blockerFingerprint) {\n\t\t\trepeatedNoProgressCount += 1;\n\t\t}\n\t}\n\tconst budgetExceeded = budget.loopCount >= budget.maxLoopsPerTicket\n\t\t|| (last?.promptTokenEstimate || 0) > budget.maxPromptTokensPerNonInitialStep * 2;\n\tif (budgetExceeded) {\n\t\treturn {\n\t\t\taction: 'park',\n\t\t\treason: 'support_v5_budget_guard',\n\t\t\tnextStep: last?.stepType || 'cleanup',\n\t\t\trepeatedNoProgressCount,\n\t\t\tbudgetExceeded\n\t\t};\n\t}\n\tif (repeatedNoProgressCount > budget.maxRepeatedNoProgress) {\n\t\treturn {\n\t\t\taction: 'park',\n\t\t\treason: 'support_v5_repeated_no_progress',\n\t\t\tnextStep: last?.stepType || 'cleanup',\n\t\t\trepeatedNoProgressCount,\n\t\t\tbudgetExceeded\n\t\t};\n\t}\n\treturn {\n\t\taction: 'continue',\n\t\treason: 'support_v5_continue',\n\t\tnextStep: last?.stepType || bundle.supportV5SupervisorState.activeStep,\n\t\trepeatedNoProgressCount,\n\t\tbudgetExceeded: false\n\t};\n}\n\nexport function buildResolveIOSupportV5DiagnoseFirstPrompt(lines: {\n\tgoal?: string;\n\tapprovedScope?: string[];\n\tactiveStep?: ResolveIOSupportV5StepType;\n\tactiveBlocker?: string;\n\tlane?: ResolveIOSupportV5Lane;\n\tlaneSummary?: string;\n\tcurrentQaRow?: ResolveIOSupportV5LaneMemory['activeQaRow'];\n\tartifactPaths?: string[];\n\tchangedFiles?: string[];\n}): string[] {\n\treturn [\n\t\t'Support Runner V5 contract: act like a guarded autonomous engineer, not a gate checklist.',\n\t\t'Start with Diagnose First: observed evidence, likely cause, smallest next action, and expected proof.',\n\t\t'Use compact lane memory and current artifacts before asking for broad ticket context.',\n\t\t'Do not send customer email. Do not write production data. Do not spawn duplicate build, QA, server, client, Mongo, browser, or Codex processes.',\n\t\t'If repairing, inspect logs/artifacts/source/diff first; make the smallest code or localhost-data change, then run the smallest self-gate.',\n\t\t'If QA fails, retest the failed row before advancing; if the same blocker repeats without new proof, park with the exact blocker.',\n\t\tlines.goal ? `Goal: ${cleanText(lines.goal, 500)}` : '',\n\t\tcleanList(lines.approvedScope, 12, 240).length ? `Approved scope: ${cleanList(lines.approvedScope, 12, 240).join(' | ')}` : '',\n\t\tlines.activeStep ? `Active step: ${lines.activeStep}` : '',\n\t\tlines.lane ? `Lane: ${lines.lane}` : '',\n\t\tlines.laneSummary ? `Lane memory: ${cleanText(lines.laneSummary, 700)}` : '',\n\t\tlines.activeBlocker ? `Active blocker: ${cleanText(lines.activeBlocker, 800)}` : '',\n\t\tlines.currentQaRow?.workflow ? `Current QA row: ${cleanText(lines.currentQaRow.workflow, 300)}` : '',\n\t\tlines.currentQaRow?.route ? `Current QA route: ${cleanText(lines.currentQaRow.route, 300)}` : '',\n\t\tcleanList(lines.changedFiles, 12, 200).length ? `Changed files: ${cleanList(lines.changedFiles, 12, 200).join(', ')}` : '',\n\t\tcleanList(lines.artifactPaths, 12, 240).length ? `Artifacts: ${cleanList(lines.artifactPaths, 12, 240).join(', ')}` : ''\n\t].filter(Boolean);\n}\n\nexport function buildResolveIOSupportV5Incident(input: {\n\tincidentClass: string;\n\tsummary: string;\n\tstepType?: ResolveIOSupportV5StepType;\n\tblocker?: string;\n\tartifactPaths?: string[];\n\tnow?: Date | string;\n}): ResolveIOSupportV5RunnerIncident {\n\treturn {\n\t\tincidentClass: cleanText(input.incidentClass, 120) || 'support_v5_runner_incident',\n\t\tsummary: cleanText(input.summary, 1200),\n\t\tstepType: input.stepType,\n\t\tblockerFingerprint: input.blocker ? fingerprintResolveIOSupportV5Blocker(input.blocker) : undefined,\n\t\tartifactPaths: cleanList(input.artifactPaths, 40, 500),\n\t\trecordedAt: isoNow(input.now)\n\t};\n}\n"]}
1
+ {"version":3,"sources":["../../src/util/support-runner-v5.ts"],"names":[],"mappings":"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","file":"support-runner-v5.js","sourcesContent":["export type ResolveIOSupportV5StepType =\n\t| 'compile_check'\n\t| 'startup_check'\n\t| 'live_seed'\n\t| 'auth_bootstrap'\n\t| 'route_probe'\n\t| 'qa_row'\n\t| 'build_repair'\n\t| 'qa_retest'\n\t| 'pr_review'\n\t| 'artifact_package'\n\t| 'cleanup';\n\nexport type ResolveIOSupportV5Outcome =\n\t| 'pass'\n\t| 'needs_repair'\n\t| 'retry_same_step'\n\t| 'park_manual'\n\t| 'budget_stop'\n\t| 'infra_retry'\n\t| 'ready_for_merge';\n\nexport type ResolveIOSupportV5Lane = 'build' | 'qa' | 'review' | 'supervisor';\n\nexport type ResolveIOSupportV5MicrotaskStatus =\n\t| 'pending'\n\t| 'in_progress'\n\t| 'pass'\n\t| 'needs_repair'\n\t| 'blocked'\n\t| 'parked';\n\nexport type ResolveIOSupportV5MicrotaskType =\n\t| ResolveIOSupportV5StepType\n\t| 'planning'\n\t| 'scope_slice'\n\t| 'product_repair'\n\t| 'runner_repair';\n\nexport interface ResolveIOSupportV5PromptBudget {\n\tinitialPlannerCap: number;\n\tbuildMicrotaskCap: number;\n\tbuildMicrotaskHardCap: number;\n\tqaMicrotaskCap: number;\n\tqaMicrotaskHardCap: number;\n\trepairMicrotaskCap: number;\n\trepairMicrotaskHardCap: number;\n}\n\nexport interface ResolveIOSupportV5Microtask {\n\tmicrotaskId: string;\n\tlane: ResolveIOSupportV5Lane;\n\ttype: ResolveIOSupportV5MicrotaskType;\n\tstatus: ResolveIOSupportV5MicrotaskStatus;\n\tobjective: string;\n\ttargetFiles: string[];\n\tcontextRefs: string[];\n\tselfGate: string;\n\tacceptanceProof: string;\n\tthreadKey: string;\n\tpromptTokenEstimate?: number;\n\tattempts: number;\n\tdependsOn: string[];\n\tparentScopeId?: string;\n\tblocker?: string;\n\tcreatedAt: string;\n\tupdatedAt: string;\n}\n\nexport interface ResolveIOSupportV5UsageSection {\n\tname: string;\n\ttokenEstimate: number;\n}\n\nexport interface ResolveIOSupportV5MicrotaskUsage {\n\tmicrotaskId: string;\n\tlane: ResolveIOSupportV5Lane;\n\tmodel?: string;\n\tthreadKey?: string;\n\treuseThread: boolean;\n\tfreshReason?: string;\n\tpromptTokenEstimate: number;\n\tpromptSections: ResolveIOSupportV5UsageSection[];\n\tactualInputTokens?: number;\n\tactualCachedInputTokens?: number;\n\tactualOutputTokens?: number;\n\tdurationMs?: number;\n\toutcome?: ResolveIOSupportV5Outcome | ResolveIOSupportV5MicrotaskStatus;\n\trecordedAt: string;\n}\n\nexport interface ResolveIOSupportV5Budget {\n\tmaxPromptTokensPerNonInitialStep: number;\n\tmaxLoopsPerTicket: number;\n\tmaxRepeatedNoProgress: number;\n\tmaxRuntimeMinutesPerLoop: number;\n\ttotalPromptTokenEstimate: number;\n\ttotalRuntimeMs: number;\n\tloopCount: number;\n}\n\nexport interface ResolveIOSupportV5LaneMemory {\n\tlane: ResolveIOSupportV5Lane;\n\tmodel: string;\n\tthreadKey: string;\n\tscopeSummary: string;\n\tactiveBlocker: string;\n\tactiveQaRow?: {\n\t\tindex?: number;\n\t\tworkflow?: string;\n\t\troute?: string;\n\t\tassertion?: string;\n\t\tstatus?: string;\n\t};\n\tchangedFiles: string[];\n\tartifactPaths: string[];\n\tlatestPromptTokenEstimate?: number;\n\tupdatedAt: string;\n}\n\nexport interface ResolveIOSupportV5SupervisorState {\n\tversion: 'v5';\n\tstatus: 'active' | 'parked' | 'complete';\n\tcurrentGoal: string;\n\tapprovedScope: string;\n\tprBranch: string;\n\tactiveStep: ResolveIOSupportV5StepType;\n\tactiveBlocker: string;\n\tlastGoodCheckpoint: string;\n\tcurrentQaRow?: ResolveIOSupportV5LaneMemory['activeQaRow'];\n\tprocessLease?: {\n\t\trunId?: string;\n\t\ttoken?: string;\n\t\tgeneration?: number;\n\t\tworkspace?: string;\n\t\tlane?: string;\n\t};\n\tartifactLinks: string[];\n\tnoEmailUnlessApproved: boolean;\n\tupdatedAt: string;\n}\n\nexport interface ResolveIOSupportV5StepRecord {\n\tstepType: ResolveIOSupportV5StepType;\n\toutcome: ResolveIOSupportV5Outcome;\n\tlane: ResolveIOSupportV5Lane;\n\tmodel?: string;\n\tthreadKey?: string;\n\tpromptTokenEstimate?: number;\n\truntimeMs?: number;\n\tsummary: string;\n\tblocker?: string;\n\tchangedFiles?: string[];\n\tartifactPaths?: string[];\n\trecordedAt: string;\n}\n\nexport interface ResolveIOSupportV5RunnerIncident {\n\tincidentClass: string;\n\tsummary: string;\n\tstepType?: ResolveIOSupportV5StepType;\n\tblockerFingerprint?: string;\n\tartifactPaths?: string[];\n\trecordedAt: string;\n}\n\nexport interface ResolveIOSupportV5StateBundle {\n\tsupportWorkflowVersion: 'v5';\n\tsupportV5SupervisorState: ResolveIOSupportV5SupervisorState;\n\tsupportV5LaneMemory: {\n\t\tbuild: ResolveIOSupportV5LaneMemory;\n\t\tqa: ResolveIOSupportV5LaneMemory;\n\t};\n\tsupportV5StepHistory: ResolveIOSupportV5StepRecord[];\n\tsupportV5Budget: ResolveIOSupportV5Budget;\n\tsupportV5RunnerIncidents: ResolveIOSupportV5RunnerIncident[];\n\tsupportV5MicrotaskLedger: ResolveIOSupportV5Microtask[];\n\tsupportV5ActiveMicrotaskId?: string;\n\tsupportV5ScopeDigest?: string;\n\tsupportV5MicrotaskUsageHistory: ResolveIOSupportV5MicrotaskUsage[];\n}\n\nexport interface ResolveIOSupportV5InitializeInput {\n\tjobId: string;\n\tticketId?: string;\n\tticketNumber?: string;\n\ttitle?: string;\n\tdescription?: string;\n\tapprovedScopeRequirements?: string[];\n\tapprovedScopeHours?: number | null;\n\tprBranch?: string;\n\tbuildThreadKey?: string;\n\tqaThreadKey?: string;\n\tprocessLease?: ResolveIOSupportV5SupervisorState['processLease'];\n\tnow?: Date | string;\n\texisting?: Partial<ResolveIOSupportV5StateBundle>;\n}\n\nexport interface ResolveIOSupportV5StepInput {\n\tstepType: ResolveIOSupportV5StepType;\n\toutcome: ResolveIOSupportV5Outcome;\n\tlane: ResolveIOSupportV5Lane;\n\tmodel?: string;\n\tthreadKey?: string;\n\tpromptTokenEstimate?: number;\n\truntimeMs?: number;\n\tsummary?: string;\n\tblocker?: string;\n\tchangedFiles?: string[];\n\tartifactPaths?: string[];\n\tactiveQaRow?: ResolveIOSupportV5LaneMemory['activeQaRow'];\n\tnow?: Date | string;\n}\n\nexport interface ResolveIOSupportV5ContinuationDecision {\n\taction: 'continue' | 'park';\n\treason: string;\n\tnextStep: ResolveIOSupportV5StepType;\n\trepeatedNoProgressCount: number;\n\tbudgetExceeded: boolean;\n}\n\nfunction isoNow(value?: Date | string): string {\n\tif (value instanceof Date) {\n\t\treturn value.toISOString();\n\t}\n\tconst parsed = value ? new Date(value) : new Date();\n\tif (Number.isFinite(parsed.getTime())) {\n\t\treturn parsed.toISOString();\n\t}\n\treturn new Date().toISOString();\n}\n\nfunction cleanText(value: any, max = 2000): string {\n\treturn String(value || '').replace(/\\s+/g, ' ').trim().slice(0, max);\n}\n\nfunction cleanList(values: any, limit = 20, max = 500): string[] {\n\tif (!Array.isArray(values)) {\n\t\treturn [];\n\t}\n\tconst result: string[] = [];\n\tfor (const value of values) {\n\t\tconst normalized = cleanText(value, max);\n\t\tif (normalized && !result.includes(normalized)) {\n\t\t\tresult.push(normalized);\n\t\t}\n\t\tif (result.length >= limit) {\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction stableIdFromText(prefix: string, value: string): string {\n\tconst text = cleanText(value, 2000).toLowerCase();\n\tlet hash = 0;\n\tfor (let index = 0; index < text.length; index += 1) {\n\t\thash = ((hash << 5) - hash + text.charCodeAt(index)) | 0;\n\t}\n\treturn `${prefix}-${Math.abs(hash).toString(36) || '0'}`;\n}\n\nfunction estimateTextTokens(value: string): number {\n\tconst text = String(value || '');\n\tif (!text) {\n\t\treturn 0;\n\t}\n\treturn Math.max(1, Math.ceil(text.length / 4));\n}\n\nexport function fingerprintResolveIOSupportV5Blocker(value: any): string {\n\tconst text = cleanText(value, 4000)\n\t\t.toLowerCase()\n\t\t.replace(/[a-f0-9]{16,}/g, '<id>')\n\t\t.replace(/\\b\\d{2,}\\b/g, '<n>')\n\t\t.replace(/\\bline\\s+<n>\\b/g, 'line <n>');\n\tlet hash = 0;\n\tfor (let index = 0; index < text.length; index += 1) {\n\t\thash = ((hash << 5) - hash + text.charCodeAt(index)) | 0;\n\t}\n\treturn `v5-${Math.abs(hash).toString(36)}`;\n}\n\nexport function buildResolveIOSupportV5Budget(existing?: Partial<ResolveIOSupportV5Budget>): ResolveIOSupportV5Budget {\n\treturn {\n\t\tmaxPromptTokensPerNonInitialStep: Number(existing?.maxPromptTokensPerNonInitialStep || 1800),\n\t\tmaxLoopsPerTicket: Number(existing?.maxLoopsPerTicket || 24),\n\t\tmaxRepeatedNoProgress: Number(existing?.maxRepeatedNoProgress || 2),\n\t\tmaxRuntimeMinutesPerLoop: Number(existing?.maxRuntimeMinutesPerLoop || 15),\n\t\ttotalPromptTokenEstimate: Number(existing?.totalPromptTokenEstimate || 0),\n\t\ttotalRuntimeMs: Number(existing?.totalRuntimeMs || 0),\n\t\tloopCount: Number(existing?.loopCount || 0)\n\t};\n}\n\nexport function buildResolveIOSupportV5PromptBudget(existing?: Partial<ResolveIOSupportV5PromptBudget>): ResolveIOSupportV5PromptBudget {\n\treturn {\n\t\tinitialPlannerCap: Number(existing?.initialPlannerCap || 6000),\n\t\tbuildMicrotaskCap: Number(existing?.buildMicrotaskCap || 1800),\n\t\tbuildMicrotaskHardCap: Number(existing?.buildMicrotaskHardCap || 2500),\n\t\tqaMicrotaskCap: Number(existing?.qaMicrotaskCap || 1500),\n\t\tqaMicrotaskHardCap: Number(existing?.qaMicrotaskHardCap || 2200),\n\t\trepairMicrotaskCap: Number(existing?.repairMicrotaskCap || 1200),\n\t\trepairMicrotaskHardCap: Number(existing?.repairMicrotaskHardCap || 1800)\n\t};\n}\n\nexport function buildResolveIOSupportV5ScopeDigest(input: {\n\tgoal?: string;\n\tapprovedScope?: string | string[];\n\tprBranch?: string;\n\tmaxTokens?: number;\n}): string {\n\tconst scope = Array.isArray(input.approvedScope)\n\t\t? cleanList(input.approvedScope, 30, 220).join(' | ')\n\t\t: cleanText(input.approvedScope, 4000);\n\tconst raw = [\n\t\tinput.goal ? `Goal: ${cleanText(input.goal, 300)}` : '',\n\t\tscope ? `Approved scope: ${scope}` : '',\n\t\tinput.prBranch ? `PR branch: ${cleanText(input.prBranch, 160)}` : ''\n\t].filter(Boolean).join('\\n');\n\tconst maxChars = Math.max(400, Math.floor(Number(input.maxTokens || 1000) * 4));\n\treturn raw.slice(0, maxChars);\n}\n\nexport function buildResolveIOSupportV5MicrotaskLedger(input: {\n\tscopeDigest: string;\n\trequirements?: string[];\n\tbuildThreadKey: string;\n\tqaThreadKey: string;\n\tnow?: Date | string;\n\texisting?: ResolveIOSupportV5Microtask[];\n}): ResolveIOSupportV5Microtask[] {\n\tconst existing = Array.isArray(input.existing) ? input.existing : [];\n\tconst completedByObjective = new Map<string, ResolveIOSupportV5Microtask>();\n\tfor (const task of existing) {\n\t\tif (task && (task.status === 'pass' || task.status === 'parked')) {\n\t\t\tcompletedByObjective.set(cleanText(task.objective, 500).toLowerCase(), task);\n\t\t}\n\t}\n\tconst now = isoNow(input.now);\n\tconst requirements = cleanList(input.requirements, 30, 240);\n\tconst sourceRequirements = requirements.length\n\t\t? requirements\n\t\t: cleanText(input.scopeDigest, 1000).split(/\\s+\\|\\s+|\\r?\\n/g).map((line) => line.trim()).filter(Boolean).slice(0, 12);\n\tconst ledger: ResolveIOSupportV5Microtask[] = [];\n\tsourceRequirements.forEach((requirement, index) => {\n\t\tconst objective = cleanText(requirement, 240);\n\t\tif (!objective) {\n\t\t\treturn;\n\t\t}\n\t\tconst existingCompleted = completedByObjective.get(objective.toLowerCase());\n\t\tconst buildId = stableIdFromText(`build-${index + 1}`, objective);\n\t\tconst qaId = stableIdFromText(`qa-${index + 1}`, objective);\n\t\tledger.push(existingCompleted && existingCompleted.lane === 'build' ? existingCompleted : {\n\t\t\tmicrotaskId: buildId,\n\t\t\tlane: 'build',\n\t\t\ttype: 'build_repair',\n\t\t\tstatus: 'pending',\n\t\t\tobjective,\n\t\t\ttargetFiles: [],\n\t\t\tcontextRefs: ['scope_digest'],\n\t\t\tselfGate: 'Run the smallest compile/type/unit check that proves this one behavior.',\n\t\t\tacceptanceProof: 'Concrete code/data proof for this behavior, with changed files listed.',\n\t\t\tthreadKey: input.buildThreadKey,\n\t\t\tattempts: 0,\n\t\t\tdependsOn: [],\n\t\t\tparentScopeId: stableIdFromText('scope', objective),\n\t\t\tcreatedAt: now,\n\t\t\tupdatedAt: now\n\t\t});\n\t\tledger.push({\n\t\t\tmicrotaskId: qaId,\n\t\t\tlane: 'qa',\n\t\t\ttype: 'qa_row',\n\t\t\tstatus: 'pending',\n\t\t\tobjective: `QA proof for: ${objective}`,\n\t\t\ttargetFiles: [],\n\t\t\tcontextRefs: ['scope_digest', buildId],\n\t\t\tselfGate: 'Drive this one customer-facing workflow row in browser/localhost and capture one captioned proof artifact.',\n\t\t\tacceptanceProof: 'QA matrix row pass with route/data assertion and screenshot/caption artifact.',\n\t\t\tthreadKey: input.qaThreadKey,\n\t\t\tattempts: 0,\n\t\t\tdependsOn: [buildId],\n\t\t\tparentScopeId: stableIdFromText('scope', objective),\n\t\t\tcreatedAt: now,\n\t\t\tupdatedAt: now\n\t\t});\n\t});\n\treturn ledger.length ? ledger : existing.slice(-80);\n}\n\nexport function selectResolveIOSupportV5ActiveMicrotask(\n\tledger: ResolveIOSupportV5Microtask[] = [],\n\tpreferredId?: string\n): ResolveIOSupportV5Microtask | undefined {\n\tconst byPreferred = preferredId ? ledger.find((task) => task.microtaskId === preferredId && !['pass', 'parked'].includes(task.status)) : undefined;\n\tif (byPreferred) {\n\t\treturn byPreferred;\n\t}\n\treturn ledger.find((task) => task.status === 'needs_repair')\n\t\t|| ledger.find((task) => task.status === 'in_progress')\n\t\t|| ledger.find((task) => task.status === 'pending')\n\t\t|| ledger.find((task) => task.status === 'blocked');\n}\n\nexport function initializeResolveIOSupportV5State(input: ResolveIOSupportV5InitializeInput): ResolveIOSupportV5StateBundle {\n\tconst now = isoNow(input.now);\n\tconst existing = input.existing || {};\n\tconst existingSupervisor = existing.supportV5SupervisorState;\n\tconst existingLaneMemory = existing.supportV5LaneMemory || {} as ResolveIOSupportV5StateBundle['supportV5LaneMemory'];\n\tconst scope = cleanList(input.approvedScopeRequirements, 24, 240).join(' | ')\n\t\t|| cleanText(input.description, 1000)\n\t\t|| cleanText(input.title, 300);\n\tconst ticketLabel = cleanText(input.ticketNumber || input.ticketId || input.jobId, 120);\n\tconst buildThreadKey = cleanText(input.buildThreadKey || existingLaneMemory.build?.threadKey || `support:${input.ticketId || input.jobId}:job:${input.jobId}:build`, 240);\n\tconst qaThreadKey = cleanText(input.qaThreadKey || existingLaneMemory.qa?.threadKey || `support:${input.ticketId || input.jobId}:job:${input.jobId}:qa`, 240);\n\tconst budget = buildResolveIOSupportV5Budget(existing.supportV5Budget);\n\tconst scopeDigest = cleanText((existing as any).supportV5ScopeDigest, 4000) || buildResolveIOSupportV5ScopeDigest({\n\t\tgoal: existingSupervisor?.currentGoal || `Resolve support ticket ${ticketLabel}`,\n\t\tapprovedScope: scope,\n\t\tprBranch: input.prBranch || existingSupervisor?.prBranch || ''\n\t});\n\tconst ledger = buildResolveIOSupportV5MicrotaskLedger({\n\t\tscopeDigest,\n\t\trequirements: cleanList(input.approvedScopeRequirements, 30, 240),\n\t\tbuildThreadKey,\n\t\tqaThreadKey,\n\t\tnow,\n\t\texisting: (existing as any).supportV5MicrotaskLedger\n\t});\n\tconst activeMicrotask = selectResolveIOSupportV5ActiveMicrotask(ledger, (existing as any).supportV5ActiveMicrotaskId);\n\treturn {\n\t\tsupportWorkflowVersion: 'v5',\n\t\tsupportV5SupervisorState: {\n\t\t\tversion: 'v5',\n\t\t\tstatus: existingSupervisor?.status || 'active',\n\t\t\tcurrentGoal: existingSupervisor?.currentGoal || `Resolve support ticket ${ticketLabel}`,\n\t\t\tapprovedScope: existingSupervisor?.approvedScope || scope,\n\t\t\tprBranch: cleanText(input.prBranch || existingSupervisor?.prBranch || '', 240),\n\t\t\tactiveStep: existingSupervisor?.activeStep || 'compile_check',\n\t\t\tactiveBlocker: existingSupervisor?.activeBlocker || '',\n\t\t\tlastGoodCheckpoint: existingSupervisor?.lastGoodCheckpoint || 'v5_initialized',\n\t\t\tcurrentQaRow: existingSupervisor?.currentQaRow,\n\t\t\tprocessLease: input.processLease || existingSupervisor?.processLease,\n\t\t\tartifactLinks: cleanList(existingSupervisor?.artifactLinks, 40, 500),\n\t\t\tnoEmailUnlessApproved: true,\n\t\t\tupdatedAt: now\n\t\t},\n\t\tsupportV5LaneMemory: {\n\t\t\tbuild: {\n\t\t\t\tlane: 'build',\n\t\t\t\tmodel: existingLaneMemory.build?.model || 'gpt-5.3-codex',\n\t\t\t\tthreadKey: buildThreadKey,\n\t\t\t\tscopeSummary: existingLaneMemory.build?.scopeSummary || scope,\n\t\t\t\tactiveBlocker: existingLaneMemory.build?.activeBlocker || '',\n\t\t\t\tactiveQaRow: existingLaneMemory.build?.activeQaRow,\n\t\t\t\tchangedFiles: cleanList(existingLaneMemory.build?.changedFiles, 80, 500),\n\t\t\t\tartifactPaths: cleanList(existingLaneMemory.build?.artifactPaths, 80, 500),\n\t\t\t\tlatestPromptTokenEstimate: Number(existingLaneMemory.build?.latestPromptTokenEstimate || 0) || undefined,\n\t\t\t\tupdatedAt: existingLaneMemory.build?.updatedAt || now\n\t\t\t},\n\t\t\tqa: {\n\t\t\t\tlane: 'qa',\n\t\t\t\tmodel: existingLaneMemory.qa?.model || 'gpt-5.4-mini',\n\t\t\t\tthreadKey: qaThreadKey,\n\t\t\t\tscopeSummary: existingLaneMemory.qa?.scopeSummary || scope,\n\t\t\t\tactiveBlocker: existingLaneMemory.qa?.activeBlocker || '',\n\t\t\t\tactiveQaRow: existingLaneMemory.qa?.activeQaRow,\n\t\t\t\tchangedFiles: cleanList(existingLaneMemory.qa?.changedFiles, 80, 500),\n\t\t\t\tartifactPaths: cleanList(existingLaneMemory.qa?.artifactPaths, 80, 500),\n\t\t\t\tlatestPromptTokenEstimate: Number(existingLaneMemory.qa?.latestPromptTokenEstimate || 0) || undefined,\n\t\t\t\tupdatedAt: existingLaneMemory.qa?.updatedAt || now\n\t\t\t}\n\t\t},\n\t\tsupportV5StepHistory: Array.isArray(existing.supportV5StepHistory)\n\t\t\t? existing.supportV5StepHistory.slice(-80)\n\t\t\t: [],\n\t\tsupportV5Budget: budget,\n\t\tsupportV5RunnerIncidents: Array.isArray(existing.supportV5RunnerIncidents)\n\t\t\t? existing.supportV5RunnerIncidents.slice(-80)\n\t\t\t: [],\n\t\tsupportV5MicrotaskLedger: ledger,\n\t\tsupportV5ActiveMicrotaskId: activeMicrotask?.microtaskId,\n\t\tsupportV5ScopeDigest: scopeDigest,\n\t\tsupportV5MicrotaskUsageHistory: Array.isArray((existing as any).supportV5MicrotaskUsageHistory)\n\t\t\t? (existing as any).supportV5MicrotaskUsageHistory.slice(-200)\n\t\t\t: []\n\t};\n}\n\nexport function recordResolveIOSupportV5Step(\n\tbundle: ResolveIOSupportV5StateBundle,\n\tstep: ResolveIOSupportV5StepInput\n): ResolveIOSupportV5StateBundle {\n\tconst now = isoNow(step.now);\n\tconst promptTokens = Math.max(0, Number(step.promptTokenEstimate || 0) || 0);\n\tconst runtimeMs = Math.max(0, Number(step.runtimeMs || 0) || 0);\n\tconst record: ResolveIOSupportV5StepRecord = {\n\t\tstepType: step.stepType,\n\t\toutcome: step.outcome,\n\t\tlane: step.lane,\n\t\tmodel: cleanText(step.model, 80),\n\t\tthreadKey: cleanText(step.threadKey, 240),\n\t\tpromptTokenEstimate: promptTokens || undefined,\n\t\truntimeMs: runtimeMs || undefined,\n\t\tsummary: cleanText(step.summary || step.blocker || step.outcome, 1200),\n\t\tblocker: cleanText(step.blocker, 1200),\n\t\tchangedFiles: cleanList(step.changedFiles, 80, 500),\n\t\tartifactPaths: cleanList(step.artifactPaths, 80, 500),\n\t\trecordedAt: now\n\t};\n\tconst laneMemory = { ...bundle.supportV5LaneMemory };\n\tif (step.lane === 'build' || step.lane === 'qa') {\n\t\tconst previous = laneMemory[step.lane];\n\t\tlaneMemory[step.lane] = {\n\t\t\t...previous,\n\t\t\tactiveBlocker: record.blocker || previous.activeBlocker || '',\n\t\t\tactiveQaRow: step.activeQaRow || previous.activeQaRow,\n\t\t\tchangedFiles: record.changedFiles?.length ? record.changedFiles : previous.changedFiles,\n\t\t\tartifactPaths: record.artifactPaths?.length ? record.artifactPaths : previous.artifactPaths,\n\t\t\tlatestPromptTokenEstimate: promptTokens || previous.latestPromptTokenEstimate,\n\t\t\tupdatedAt: now\n\t\t};\n\t}\n\tconst supervisor = {\n\t\t...bundle.supportV5SupervisorState,\n\t\tstatus: step.outcome === 'ready_for_merge' ? 'complete' as const : (step.outcome === 'park_manual' || step.outcome === 'budget_stop' ? 'parked' as const : 'active' as const),\n\t\tactiveStep: step.stepType,\n\t\tactiveBlocker: record.blocker || '',\n\t\tcurrentQaRow: step.activeQaRow || bundle.supportV5SupervisorState.currentQaRow,\n\t\tlastGoodCheckpoint: step.outcome === 'pass' || step.outcome === 'ready_for_merge'\n\t\t\t? step.stepType\n\t\t\t: bundle.supportV5SupervisorState.lastGoodCheckpoint,\n\t\tartifactLinks: Array.from(new Set([\n\t\t\t...bundle.supportV5SupervisorState.artifactLinks,\n\t\t\t...(record.artifactPaths || [])\n\t\t])).slice(-80),\n\t\tupdatedAt: now\n\t};\n\tconst ledger = (bundle.supportV5MicrotaskLedger || []).map((task) => {\n\t\tif (task.microtaskId !== bundle.supportV5ActiveMicrotaskId) {\n\t\t\treturn task;\n\t\t}\n\t\tconst status: ResolveIOSupportV5MicrotaskStatus = step.outcome === 'pass' || step.outcome === 'ready_for_merge'\n\t\t\t? 'pass'\n\t\t\t: step.outcome === 'park_manual' || step.outcome === 'budget_stop'\n\t\t\t\t? 'parked'\n\t\t\t\t: step.outcome === 'needs_repair' || step.outcome === 'retry_same_step'\n\t\t\t\t\t? 'needs_repair'\n\t\t\t\t\t: 'in_progress';\n\t\treturn {\n\t\t\t...task,\n\t\t\tstatus,\n\t\t\tblocker: record.blocker || task.blocker,\n\t\t\tpromptTokenEstimate: promptTokens || task.promptTokenEstimate,\n\t\t\tattempts: task.attempts + (step.outcome === 'pass' || step.outcome === 'ready_for_merge' ? 0 : 1),\n\t\t\tupdatedAt: now\n\t\t};\n\t});\n\tconst nextMicrotask = selectResolveIOSupportV5ActiveMicrotask(ledger, bundle.supportV5ActiveMicrotaskId);\n\treturn {\n\t\t...bundle,\n\t\tsupportV5SupervisorState: supervisor,\n\t\tsupportV5LaneMemory: laneMemory,\n\t\tsupportV5StepHistory: [...bundle.supportV5StepHistory, record].slice(-100),\n\t\tsupportV5Budget: {\n\t\t\t...bundle.supportV5Budget,\n\t\t\ttotalPromptTokenEstimate: bundle.supportV5Budget.totalPromptTokenEstimate + promptTokens,\n\t\t\ttotalRuntimeMs: bundle.supportV5Budget.totalRuntimeMs + runtimeMs,\n\t\t\tloopCount: bundle.supportV5Budget.loopCount + 1\n\t\t},\n\t\tsupportV5MicrotaskLedger: ledger,\n\t\tsupportV5ActiveMicrotaskId: nextMicrotask?.microtaskId,\n\t\tsupportV5MicrotaskUsageHistory: bundle.supportV5MicrotaskUsageHistory || []\n\t};\n}\n\nexport function recordResolveIOSupportV5MicrotaskUsage(\n\tbundle: ResolveIOSupportV5StateBundle,\n\tusage: Omit<ResolveIOSupportV5MicrotaskUsage, 'recordedAt'>\n): ResolveIOSupportV5StateBundle {\n\tconst record: ResolveIOSupportV5MicrotaskUsage = {\n\t\t...usage,\n\t\tmicrotaskId: cleanText(usage.microtaskId, 160),\n\t\tthreadKey: cleanText(usage.threadKey, 240),\n\t\tmodel: cleanText(usage.model, 80),\n\t\tpromptTokenEstimate: Math.max(0, Number(usage.promptTokenEstimate || 0) || 0),\n\t\tpromptSections: Array.isArray(usage.promptSections)\n\t\t\t? usage.promptSections.map((section) => ({\n\t\t\t\tname: cleanText(section.name, 120),\n\t\t\t\ttokenEstimate: Math.max(0, Number(section.tokenEstimate || 0) || 0)\n\t\t\t})).filter((section) => section.name)\n\t\t\t: [],\n\t\trecordedAt: isoNow()\n\t};\n\tconst ledger = (bundle.supportV5MicrotaskLedger || []).map((task) => task.microtaskId === record.microtaskId\n\t\t? {\n\t\t\t...task,\n\t\t\tpromptTokenEstimate: record.promptTokenEstimate,\n\t\t\tupdatedAt: record.recordedAt\n\t\t}\n\t\t: task);\n\treturn {\n\t\t...bundle,\n\t\tsupportV5MicrotaskLedger: ledger,\n\t\tsupportV5MicrotaskUsageHistory: [\n\t\t\t...(bundle.supportV5MicrotaskUsageHistory || []),\n\t\t\trecord\n\t\t].slice(-200)\n\t};\n}\n\nexport function decideResolveIOSupportV5Continuation(bundle: ResolveIOSupportV5StateBundle): ResolveIOSupportV5ContinuationDecision {\n\tconst history = bundle.supportV5StepHistory || [];\n\tconst budget = buildResolveIOSupportV5Budget(bundle.supportV5Budget);\n\tconst last = history[history.length - 1];\n\tconst blockerFingerprint = fingerprintResolveIOSupportV5Blocker(last?.blocker || last?.summary || '');\n\tlet repeatedNoProgressCount = 0;\n\tfor (let index = history.length - 1; index >= 0; index -= 1) {\n\t\tconst item = history[index];\n\t\tif (item.outcome === 'pass' || item.outcome === 'ready_for_merge') {\n\t\t\tbreak;\n\t\t}\n\t\tif (item.stepType !== last?.stepType) {\n\t\t\tbreak;\n\t\t}\n\t\tif (fingerprintResolveIOSupportV5Blocker(item.blocker || item.summary || '') === blockerFingerprint) {\n\t\t\trepeatedNoProgressCount += 1;\n\t\t}\n\t}\n\tconst budgetExceeded = budget.loopCount >= budget.maxLoopsPerTicket\n\t\t|| (last?.promptTokenEstimate || 0) > budget.maxPromptTokensPerNonInitialStep;\n\tif (budgetExceeded) {\n\t\treturn {\n\t\t\taction: 'park',\n\t\t\treason: 'support_v5_budget_guard',\n\t\t\tnextStep: last?.stepType || 'cleanup',\n\t\t\trepeatedNoProgressCount,\n\t\t\tbudgetExceeded\n\t\t};\n\t}\n\tif (repeatedNoProgressCount > budget.maxRepeatedNoProgress) {\n\t\treturn {\n\t\t\taction: 'park',\n\t\t\treason: 'support_v5_repeated_no_progress',\n\t\t\tnextStep: last?.stepType || 'cleanup',\n\t\t\trepeatedNoProgressCount,\n\t\t\tbudgetExceeded\n\t\t};\n\t}\n\treturn {\n\t\taction: 'continue',\n\t\treason: 'support_v5_continue',\n\t\tnextStep: last?.stepType || bundle.supportV5SupervisorState.activeStep,\n\t\trepeatedNoProgressCount,\n\t\tbudgetExceeded: false\n\t};\n}\n\nexport function buildResolveIOSupportV5DiagnoseFirstPrompt(lines: {\n\tgoal?: string;\n\tapprovedScope?: string[];\n\tactiveStep?: ResolveIOSupportV5StepType;\n\tactiveBlocker?: string;\n\tlane?: ResolveIOSupportV5Lane;\n\tlaneSummary?: string;\n\tcurrentQaRow?: ResolveIOSupportV5LaneMemory['activeQaRow'];\n\tartifactPaths?: string[];\n\tchangedFiles?: string[];\n}): string[] {\n\treturn [\n\t\t'Support Runner V5 contract: act like a guarded autonomous engineer, not a gate checklist.',\n\t\t'Start with Diagnose First: observed evidence, likely cause, smallest next action, and expected proof.',\n\t\t'Use compact lane memory and current artifacts before asking for broad ticket context.',\n\t\t'Do not send customer email. Do not write production data. Do not spawn duplicate build, QA, server, client, Mongo, browser, or Codex processes.',\n\t\t'If repairing, inspect logs/artifacts/source/diff first; make the smallest code or localhost-data change, then run the smallest self-gate.',\n\t\t'If QA fails, retest the failed row before advancing; if the same blocker repeats without new proof, park with the exact blocker.',\n\t\tlines.goal ? `Goal: ${cleanText(lines.goal, 500)}` : '',\n\t\tcleanList(lines.approvedScope, 12, 240).length ? `Approved scope: ${cleanList(lines.approvedScope, 12, 240).join(' | ')}` : '',\n\t\tlines.activeStep ? `Active step: ${lines.activeStep}` : '',\n\t\tlines.lane ? `Lane: ${lines.lane}` : '',\n\t\tlines.laneSummary ? `Lane memory: ${cleanText(lines.laneSummary, 700)}` : '',\n\t\tlines.activeBlocker ? `Active blocker: ${cleanText(lines.activeBlocker, 800)}` : '',\n\t\tlines.currentQaRow?.workflow ? `Current QA row: ${cleanText(lines.currentQaRow.workflow, 300)}` : '',\n\t\tlines.currentQaRow?.route ? `Current QA route: ${cleanText(lines.currentQaRow.route, 300)}` : '',\n\t\tcleanList(lines.changedFiles, 12, 200).length ? `Changed files: ${cleanList(lines.changedFiles, 12, 200).join(', ')}` : '',\n\t\tcleanList(lines.artifactPaths, 12, 240).length ? `Artifacts: ${cleanList(lines.artifactPaths, 12, 240).join(', ')}` : ''\n\t].filter(Boolean);\n}\n\nexport function buildResolveIOSupportV5MicrotaskPrompt(input: {\n\tbundle: ResolveIOSupportV5StateBundle;\n\tlane: 'build' | 'qa';\n\tmodel?: string;\n\tstage?: string;\n\tfailureText?: string;\n\tchangedFiles?: string[];\n\tartifactPaths?: string[];\n\ttargetFiles?: string[];\n\tcontextSnippets?: string[];\n\tactiveQaRow?: ResolveIOSupportV5LaneMemory['activeQaRow'];\n}): {\n\tprompt: string;\n\tpromptTokenEstimate: number;\n\tpromptSections: ResolveIOSupportV5UsageSection[];\n\tactiveMicrotask?: ResolveIOSupportV5Microtask;\n\twithinCap: boolean;\n\twithinHardCap: boolean;\n\tcap: number;\n\thardCap: number;\n\treason?: string;\n} {\n\tconst activeMicrotask = selectResolveIOSupportV5ActiveMicrotask(\n\t\tinput.bundle.supportV5MicrotaskLedger || [],\n\t\tinput.bundle.supportV5ActiveMicrotaskId\n\t);\n\tconst budget = buildResolveIOSupportV5PromptBudget();\n\tconst repairLike = Boolean(input.failureText || activeMicrotask?.status === 'needs_repair' || /repair/i.test(String(input.stage || activeMicrotask?.type || '')));\n\tconst cap = repairLike\n\t\t? budget.repairMicrotaskCap\n\t\t: input.lane === 'qa'\n\t\t\t? budget.qaMicrotaskCap\n\t\t\t: budget.buildMicrotaskCap;\n\tconst hardCap = repairLike\n\t\t? budget.repairMicrotaskHardCap\n\t\t: input.lane === 'qa'\n\t\t\t? budget.qaMicrotaskHardCap\n\t\t\t: budget.buildMicrotaskHardCap;\n\tconst laneMemory = input.bundle.supportV5LaneMemory[input.lane];\n\tconst taskThreadKey = activeMicrotask?.threadKey || laneMemory.threadKey;\n\tconst changedFiles = cleanList(input.changedFiles?.length ? input.changedFiles : laneMemory.changedFiles, 8, 160);\n\tconst artifactPaths = cleanList(input.artifactPaths?.length ? input.artifactPaths : laneMemory.artifactPaths, 8, 200);\n\tconst targetFiles = cleanList(input.targetFiles?.length ? input.targetFiles : activeMicrotask?.targetFiles, 5, 160);\n\tconst contextSnippets = cleanList(input.contextSnippets, 5, 360);\n\tconst qaRow = input.activeQaRow || activeMicrotask?.lane === 'qa' ? input.activeQaRow || laneMemory.activeQaRow || input.bundle.supportV5SupervisorState.currentQaRow : undefined;\n\tconst sections = [\n\t\t{\n\t\t\tname: 'microtask_contract',\n\t\t\ttext: [\n\t\t\t\t'Support Runner V5 Microtask Contract.',\n\t\t\t\t'Use the existing persistent lane thread. Do not start a fresh thread.',\n\t\t\t\t'Do exactly one microtask and one proof gate. Do not replay ticket triage, prior plans, attachments, broad QA checklist, or unrelated scope.',\n\t\t\t\t'If context is insufficient, request the smallest missing file/log/artifact by path and park this microtask; do not broaden the prompt.',\n\t\t\t\t'Do not send customer email. Do not deploy. Do not spawn duplicate server/client/Mongo/browser/Codex processes.'\n\t\t\t].join('\\n')\n\t\t},\n\t\t{\n\t\t\tname: 'scope_digest',\n\t\t\ttext: cleanText(input.bundle.supportV5ScopeDigest || input.bundle.supportV5SupervisorState.approvedScope, 900)\n\t\t},\n\t\t{\n\t\t\tname: 'active_microtask',\n\t\t\ttext: activeMicrotask ? [\n\t\t\t\t`Microtask id: ${activeMicrotask.microtaskId}`,\n\t\t\t\t`Lane: ${input.lane}`,\n\t\t\t\t`Type: ${activeMicrotask.type}`,\n\t\t\t\t`Status: ${activeMicrotask.status}`,\n\t\t\t\t`Objective: ${cleanText(activeMicrotask.objective, 360)}`,\n\t\t\t\t`Self-gate: ${cleanText(activeMicrotask.selfGate, 260)}`,\n\t\t\t\t`Acceptance proof: ${cleanText(activeMicrotask.acceptanceProof, 260)}`,\n\t\t\t\t`Attempts on this microtask: ${activeMicrotask.attempts}`,\n\t\t\t\t`Thread key: ${taskThreadKey}`\n\t\t\t].join('\\n') : 'No active microtask found. Park and report support_v5_microtask_missing.'\n\t\t},\n\t\t{\n\t\t\tname: 'failure_delta',\n\t\t\ttext: input.failureText ? `Latest blocker/failure delta: ${cleanText(input.failureText, 700)}` : ''\n\t\t},\n\t\t{\n\t\t\tname: 'target_context',\n\t\t\ttext: [\n\t\t\t\ttargetFiles.length ? `Target files: ${targetFiles.join(', ')}` : '',\n\t\t\t\tchangedFiles.length ? `Changed files: ${changedFiles.join(', ')}` : '',\n\t\t\t\tartifactPaths.length ? `Artifacts: ${artifactPaths.join(', ')}` : '',\n\t\t\t\tqaRow?.workflow ? `QA row workflow: ${cleanText(qaRow.workflow, 220)}` : '',\n\t\t\t\tqaRow?.route ? `QA row route: ${cleanText(qaRow.route, 220)}` : '',\n\t\t\t\tqaRow?.assertion ? `QA row assertion: ${cleanText(qaRow.assertion, 260)}` : '',\n\t\t\t\tcontextSnippets.length ? `Relevant snippets:\\n${contextSnippets.join('\\n---\\n')}` : ''\n\t\t\t].filter(Boolean).join('\\n')\n\t\t},\n\t\t{\n\t\t\tname: 'return_contract',\n\t\t\ttext: input.lane === 'qa'\n\t\t\t\t? 'Return strict JSON only: {\"status\":\"pass\"|\"needs-fix\"|\"blocked\",\"microtaskId\":\"\",\"summary\":\"\",\"evidence\":[\"\"],\"artifacts\":[\"\"],\"next_actions\":[\"\"]}.'\n\t\t\t\t: 'Return concise Markdown with: Microtask Result, Root Cause, Changes, Self-Gate, Acceptance Proof, Residual Risk.'\n\t\t}\n\t].filter((section) => cleanText(section.text, 20));\n\tconst promptSections = sections.map((section) => ({\n\t\tname: section.name,\n\t\ttokenEstimate: estimateTextTokens(section.text)\n\t}));\n\tconst prompt = sections.map((section) => section.text).join('\\n\\n');\n\tconst promptTokenEstimate = estimateTextTokens(prompt);\n\treturn {\n\t\tprompt,\n\t\tpromptTokenEstimate,\n\t\tpromptSections,\n\t\tactiveMicrotask,\n\t\twithinCap: promptTokenEstimate <= cap,\n\t\twithinHardCap: promptTokenEstimate <= hardCap,\n\t\tcap,\n\t\thardCap,\n\t\treason: promptTokenEstimate > hardCap\n\t\t\t? 'support_v5_microtask_prompt_hard_cap'\n\t\t\t: promptTokenEstimate > cap\n\t\t\t\t? 'support_v5_microtask_prompt_soft_cap'\n\t\t\t\t: undefined\n\t};\n}\n\nexport function summarizeResolveIOSupportV5MicrotaskUsage(bundle: ResolveIOSupportV5StateBundle): {\n\ttotalPromptTokenEstimate: number;\n\tbyMicrotask: Array<{ microtaskId: string; promptTokenEstimate: number; calls: number }>;\n\tbySection: ResolveIOSupportV5UsageSection[];\n\tbroadPromptViolations: ResolveIOSupportV5MicrotaskUsage[];\n} {\n\tconst byMicrotask = new Map<string, { microtaskId: string; promptTokenEstimate: number; calls: number }>();\n\tconst bySection = new Map<string, number>();\n\tlet totalPromptTokenEstimate = 0;\n\tconst broadPromptViolations: ResolveIOSupportV5MicrotaskUsage[] = [];\n\tconst promptBudget = buildResolveIOSupportV5PromptBudget();\n\tfor (const usage of bundle.supportV5MicrotaskUsageHistory || []) {\n\t\ttotalPromptTokenEstimate += usage.promptTokenEstimate || 0;\n\t\tconst existing = byMicrotask.get(usage.microtaskId) || { microtaskId: usage.microtaskId, promptTokenEstimate: 0, calls: 0 };\n\t\texisting.promptTokenEstimate += usage.promptTokenEstimate || 0;\n\t\texisting.calls += 1;\n\t\tbyMicrotask.set(usage.microtaskId, existing);\n\t\tfor (const section of usage.promptSections || []) {\n\t\t\tbySection.set(section.name, (bySection.get(section.name) || 0) + section.tokenEstimate);\n\t\t}\n\t\tconst hardCap = usage.lane === 'qa' ? promptBudget.qaMicrotaskHardCap : promptBudget.buildMicrotaskHardCap;\n\t\tif ((usage.promptTokenEstimate || 0) > hardCap) {\n\t\t\tbroadPromptViolations.push(usage);\n\t\t}\n\t}\n\treturn {\n\t\ttotalPromptTokenEstimate,\n\t\tbyMicrotask: Array.from(byMicrotask.values()),\n\t\tbySection: Array.from(bySection.entries()).map(([name, tokenEstimate]) => ({ name, tokenEstimate })),\n\t\tbroadPromptViolations\n\t};\n}\n\nexport function buildResolveIOSupportV5Incident(input: {\n\tincidentClass: string;\n\tsummary: string;\n\tstepType?: ResolveIOSupportV5StepType;\n\tblocker?: string;\n\tartifactPaths?: string[];\n\tnow?: Date | string;\n}): ResolveIOSupportV5RunnerIncident {\n\treturn {\n\t\tincidentClass: cleanText(input.incidentClass, 120) || 'support_v5_runner_incident',\n\t\tsummary: cleanText(input.summary, 1200),\n\t\tstepType: input.stepType,\n\t\tblockerFingerprint: input.blocker ? fingerprintResolveIOSupportV5Blocker(input.blocker) : undefined,\n\t\tartifactPaths: cleanList(input.artifactPaths, 40, 500),\n\t\trecordedAt: isoNow(input.now)\n\t};\n}\n"]}