@profullstack/agenticjobs 0.12.0 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/README.md +70 -1
  2. package/dist/cli/args.js +1 -1
  3. package/dist/cli/args.js.map +1 -1
  4. package/dist/cli/index.js +78 -5
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/client/client.d.ts +44 -0
  7. package/dist/client/client.js +19 -0
  8. package/dist/client/client.js.map +1 -1
  9. package/dist/client/config.js +4 -3
  10. package/dist/client/config.js.map +1 -1
  11. package/dist/client/fanout.js +13 -4
  12. package/dist/client/fanout.js.map +1 -1
  13. package/dist/client/login.js +9 -2
  14. package/dist/client/login.js.map +1 -1
  15. package/dist/config.d.ts +1 -1
  16. package/dist/config.js +1 -1
  17. package/dist/core/agentwriter.js +22 -5
  18. package/dist/core/agentwriter.js.map +1 -1
  19. package/dist/core/applications.js +1 -1
  20. package/dist/core/applications.js.map +1 -1
  21. package/dist/core/capacity.js +7 -3
  22. package/dist/core/capacity.js.map +1 -1
  23. package/dist/core/import.js +10 -2
  24. package/dist/core/import.js.map +1 -1
  25. package/dist/core/jobs.d.ts +24 -6
  26. package/dist/core/jobs.js +116 -31
  27. package/dist/core/jobs.js.map +1 -1
  28. package/dist/core/recommendations.d.ts +134 -0
  29. package/dist/core/recommendations.js +356 -0
  30. package/dist/core/recommendations.js.map +1 -0
  31. package/dist/core/updates.d.ts +15 -3
  32. package/dist/core/updates.js +58 -24
  33. package/dist/core/updates.js.map +1 -1
  34. package/dist/core/zip.js +29 -4
  35. package/dist/core/zip.js.map +1 -1
  36. package/dist/directory/federate.js +3 -1
  37. package/dist/directory/federate.js.map +1 -1
  38. package/dist/directory/fetch.d.ts +1 -1
  39. package/dist/markup/markdown.js +2 -1
  40. package/dist/markup/markdown.js.map +1 -1
  41. package/dist/markup/resume.js +18 -5
  42. package/dist/markup/resume.js.map +1 -1
  43. package/dist/mcp/tools.js +99 -7
  44. package/dist/mcp/tools.js.map +1 -1
  45. package/dist/schema/index.d.ts +1 -0
  46. package/dist/schema/index.js +1 -0
  47. package/dist/schema/index.js.map +1 -1
  48. package/dist/schema/instance.js +29 -0
  49. package/dist/schema/instance.js.map +1 -1
  50. package/dist/schema/job.d.ts +12 -0
  51. package/dist/schema/job.js +17 -3
  52. package/dist/schema/job.js.map +1 -1
  53. package/dist/schema/jsonld.js +7 -6
  54. package/dist/schema/jsonld.js.map +1 -1
  55. package/dist/schema/pay.d.ts +173 -0
  56. package/dist/schema/pay.js +668 -0
  57. package/dist/schema/pay.js.map +1 -0
  58. package/dist/schema/query.js +1 -1
  59. package/dist/schema/query.js.map +1 -1
  60. package/dist/server/app.js +3 -1
  61. package/dist/server/app.js.map +1 -1
  62. package/dist/server/middleware.d.ts +11 -1
  63. package/dist/server/middleware.js +18 -3
  64. package/dist/server/middleware.js.map +1 -1
  65. package/dist/server/routes/api.js +153 -7
  66. package/dist/server/routes/api.js.map +1 -1
  67. package/dist/server/routes/discovery.js +10 -8
  68. package/dist/server/routes/discovery.js.map +1 -1
  69. package/dist/server/routes/openapi.js +136 -2
  70. package/dist/server/routes/openapi.js.map +1 -1
  71. package/dist/server/routes/pages.js +155 -14
  72. package/dist/server/routes/pages.js.map +1 -1
  73. package/dist/tui/views.js +9 -3
  74. package/dist/tui/views.js.map +1 -1
  75. package/dist/views/candidates.d.ts +6 -0
  76. package/dist/views/candidates.js +2 -1
  77. package/dist/views/candidates.js.map +1 -1
  78. package/dist/views/inbox.js +6 -6
  79. package/dist/views/inbox.js.map +1 -1
  80. package/dist/views/jobs.d.ts +16 -0
  81. package/dist/views/jobs.js +33 -11
  82. package/dist/views/jobs.js.map +1 -1
  83. package/dist/views/layout.d.ts +22 -0
  84. package/dist/views/layout.js +18 -0
  85. package/dist/views/layout.js.map +1 -1
  86. package/dist/views/me.d.ts +7 -0
  87. package/dist/views/me.js +3 -2
  88. package/dist/views/me.js.map +1 -1
  89. package/dist/views/post.d.ts +18 -0
  90. package/dist/views/post.js +39 -7
  91. package/dist/views/post.js.map +1 -1
  92. package/dist/views/recommendations.d.ts +43 -0
  93. package/dist/views/recommendations.js +26 -0
  94. package/dist/views/recommendations.js.map +1 -0
  95. package/dist/views/updates.js +5 -5
  96. package/dist/views/updates.js.map +1 -1
  97. package/docs/openjob.md +63 -0
  98. package/migrations/0015_pay_lines.sql +38 -0
  99. package/migrations/0016_recommendations.sql +65 -0
  100. package/package.json +1 -1
  101. package/web/public/app.css +60 -5
  102. package/web/public/sw.js +6 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pay.js","sourceRoot":"","sources":["../../src/schema/pay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,OAAO;IACP,UAAU;IACV,UAAU;IACV,eAAe;IACf,QAAQ;CACA,CAAC;AAGX;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAU,CAAC;AAE5E,+DAA+D;AAC/D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AA2BhG,MAAM,CAAC,MAAM,SAAS,GAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAEvF,kFAAkF;AAClF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC;AAC/B,iFAAiF;AACjF,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,CAAC;AAC3B,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,CAAC;AAC7B,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,CAAC;AAE7B,4EAA4E;AAE5E,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC;IACnB,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;IAClF,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;CACvD,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IACxF,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM;CACrC,CAAC,CAAC;AAEH,MAAM,cAAc,GAA2B;IAC7C,CAAC,EAAE,KAAK;IACR,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,KAAK;CACX,CAAC;AAEF,MAAM,cAAc,GAA2B;IAC7C,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;CACT,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAW,EAAE,CACvD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AAEjE,wFAAwF;AACxF,MAAM,WAAW,GAA4B;IAC3C,IAAI,EAAE,QAAQ;IACd,EAAE,EAAE,QAAQ;IACZ,CAAC,EAAE,QAAQ;IACX,GAAG,EAAE,OAAO;IACZ,IAAI,EAAE,QAAQ;IACd,EAAE,EAAE,QAAQ;IACZ,KAAK,EAAE,SAAS;IAChB,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,QAAQ;IACd,EAAE,EAAE,QAAQ;IACZ,KAAK,EAAE,QAAQ;CAChB,CAAC;AAEF,MAAM,WAAW,GAAyE;IACxF,MAAM,EAAE,MAAM;IACd,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,MAAM;CACf,CAAC;AAEF,2EAA2E;AAC3E,MAAM,UAAU,QAAQ,CAAC,IAAa;IACpC,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,SAA+B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACvF,CAAC;AAED,4EAA4E;AAE5E,iFAAiF;AACjF,MAAM,CAAC,MAAM,iBAAiB,GAC5B,kIAAkI,CAAC;AAErI,4DAA4D;AAC5D,SAAS,QAAQ,CAAC,MAAc,EAAE,KAAyB;IACzD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACzF,OAAO,IAAI,GAAG,MAAM,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,KAAK,GACT,4HAA4H,CAAC;AAQ/H;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,GAAuB;IACvC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAChC,IAAI,eAAe,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,GAAG,KAAK,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,EAAU;IACzC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;IACrB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC;IAClF,IAAI,GAAG,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/B,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,YAAY,KAAK,SAAS;QAAE,QAAQ,GAAG,cAAc,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;IAChF,IAAI,QAAQ,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAClD,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;QAChC,sEAAsE;QACtE,IAAI,QAAQ,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;IACrC,CAAC;IACD,IAAI,QAAQ,KAAK,IAAI,IAAI,WAAW,KAAK,SAAS;QAAE,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACnG,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QACjC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,QAAQ,KAAK,IAAI,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,oEAAoE;YACpE,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,OAAO,GAAG,+EAA+E,CAAC;AAEhG,SAAS,iBAAiB,CAAC,IAAY;IACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,mCAAmC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjG,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,0DAA0D,CAAC;IAC5F,MAAM,IAAI,GAAG,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,uCAAuC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxF,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;IAChC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,0DAA0D,CAAC;IAC3F,IAAI,GAAG,GAAkB,KAAK,CAAC;IAC/B,IAAI,GAAG,GAAkB,MAAM,IAAI,IAAI,CAAC;IACxC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,IAAI,EAAE,CAAC;YACT,GAAG,GAAG,IAAI,CAAC;YACX,GAAG,GAAG,KAAK,CAAC;QACd,CAAC;aAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YACjB,GAAG,GAAG,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IACD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QAC9C,OAAO,yDAAyD,CAAC;IACnE,CAAC;IACD,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG;QAAE,OAAO,kCAAkC,CAAC;IACpF,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,IAAI,GAAG,sIAAsI,CAAC;AACpJ,MAAM,MAAM,GAAG,4BAA4B,CAAC;AAC5C,MAAM,WAAW,GAAG,qEAAqE,CAAC;AAC1F,MAAM,GAAG,GAAG,wEAAwE,CAAC;AAErF,MAAM,WAAW,GAA4B;IAC3C,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,QAAQ;IAClB,MAAM,EAAE,QAAQ;IAChB,EAAE,EAAE,QAAQ;IACZ,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,QAAQ;CAChB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAChC,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AACrD,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,GACX,6GAA6G,CAAC;AAEhH,0EAA0E;AAC1E,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,qCAAqC,iBAAiB,GAAG,CAAC;IACjF,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG;QAAE,OAAO,uCAAuC,CAAC;IAErE,IAAI,IAAI,GAAG,GAAG,CAAC;IACf,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,yEAAyE;QACzE,qEAAqE;QACrE,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAChE,MAAM,GAAG,KAAK,CAAC;YACf,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC5D,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,OAAO,CACJ,aAAmC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;QACjF,0FAA0F,CAAC,IAAI,CAAC,KAAK,CAAC,CACvG,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAEjC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,IAAI,GAA2B,IAAI,CAAC;IACxC,MAAM,SAAS,GAAG,uEAAuE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrG,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QACzE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/B,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,gCAAgC,IAAI,oBAAoB,iBAAiB,GAAG,CAAC;IACtF,CAAC;IACD,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC;IAEnB,IAAI,MAAM,GAAiB,IAAI,CAAC;IAChC,MAAM,IAAI,GAAG,qBAAqB,CAAC;IACnC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;IACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,MAAM,KAAK,IAAI;YAAE,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC;IAC3C,CAAC;IAED,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;QACnD,SAAS,GAAG,IAAI,CAAC;QACjB,MAAM,IAAI,CAAC,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,EAAE,QAAQ,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7E,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAChF,OAAO,IAAI,IAAI,oDAAoD,CAAC;IACtE,CAAC;IAED,IAAI,GAAG,GAAkB,KAAK,CAAC,MAAM,CAAC;IACtC,IAAI,GAAG,GAAkB,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC;IAChD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,GAAG,GAAG,IAAI,CAAC;YACX,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;QACrB,CAAC;aAAM,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACzC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;QACrB,CAAC;IACH,CAAC;IACD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QAC9C,OAAO,eAAe,IAAI,8BAA8B,CAAC;IAC3D,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAChE,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,IAAI,IAAI,mFAAmF,CAAC;IACrG,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;IACpC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACnE,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAEtE,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9D,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC/D,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QACjE,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACvE,IAAI,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC9F,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC/E,IAAI,IAAI,CAAC,MAAM,GAAG,QAAQ;YAAE,OAAO,gBAAgB,IAAI,0BAA0B,QAAQ,cAAc,CAAC;QACxG,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACnD,CAAC;IAED,OAAO,mBAAmB,IAAI,SAAS,IAAI,oBAAoB,iBAAiB,GAAG,CAAC;AACtF,CAAC;AAED,4EAA4E;AAE5E,wDAAwD;AACxD,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,QAAgB;IAC3D,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACpC,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC;IAClD,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,GAAG,IAAI,KAAK,CAAC;YAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,CAAC;QAC/E,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;IAC1C,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACjB,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,GAAG,IAAI,KAAK,CAAC;YAAE,OAAO,GAAG,IAAI,IAAI,MAAM,GAAG,IAAI,GAAG,CAAC;QAC9E,OAAO,GAAG,IAAI,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;IACzC,CAAC;IACD,uEAAuE;IACvE,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;AACzC,CAAC;AAED,SAAS,UAAU,CAAC,MAAc;IAChC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACpE,OAAO,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,wBAAwB,EAAE,EAAE,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,QAAQ,CAAC,IAAa;IAC7B,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,UAAU;YACb,OAAO,OAAO,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC;QACtC,KAAK,UAAU;YACb,OAAO,OAAO,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC;QACtC,KAAK,eAAe;YAClB,OAAO,eAAe,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAa;IACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC1B,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAChD,MAAM,KAAK,GAAG,CAAC,MAAc,EAAU,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9E,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,KAAK,CAAC,GAAa,CAAC,IAAI,MAAM,EAAE,CAAC;IACnE,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,QAAQ,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC;IACxD,MAAM,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IACzE,OAAO,GAAG,KAAK,IAAI,MAAM,EAAE,CAAC;AAC9B,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,SAAS,CAAC,GAAQ;IAChC,IAAI,GAAG,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IAChC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;IACjF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,cAAc,CAAC,GAAQ;IACrC,IAAI,GAAG,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IAChC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;IAC/E,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,YAAY,CAAC,MAAqB;IAChD,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACzD,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,MAAM,KAAK,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChE,OAAO,QAAQ,CAAC,CAAC,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW,MAAM,EAAE,CAAC;AAC7D,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,SAAS,CAAC,GAAQ;IAChC,IAAI,GAAG,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;AAC1E,CAAC;AAaD,+EAA+E;AAC/E,MAAM,UAAU,aAAa,CAAC,MAAkB;IAC9C,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI,CAAC;IAC1D,OAAO;QACL,KAAK,EAAE,MAAM;YACX,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACnG,CAAC,CAAC,EAAE;QACN,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;QAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,IAAI;KAC/B,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAAQ;IAMpC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAC/F,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,IAAI,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACtF,CAAC;IACD,uEAAuE;IACvE,yCAAyC;IACzC,MAAM,KAAK,GAAG,CAAC,KAAoB,EAAiB,EAAE,CACpD,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7E,OAAO;QACL,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;QACpB,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;QACpB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;KACtC,CAAC;AACJ,CAAC;AAED,4EAA4E;AAE5E,SAAS,MAAM,CAAC,KAAc;IAC5B,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACtG,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,KAAc,EAAE,GAAW;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzC,OAAO,KAAK,CAAC,OAAO,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACjG,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC1C,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,IAAK,aAAmC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5F,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,KAA8B;IACpD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO,gCAAgC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,yCAAyC,CAAC;IACvG,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,GAAY,EAAiB,EAAE;QAC7C,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC;QACjE,MAAM,CAAC,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QACpF,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjD,CAAC,CAAC;IACF,2EAA2E;IAC3E,8DAA8D;IAC9D,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3C,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,GAAG,GAAG;QAAE,OAAO,mDAAmD,CAAC;IAC1G,IAAI,IAAI,KAAK,eAAe,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QACvE,OAAO,kCAAkC,CAAC;IAC5C,CAAC;IACD,MAAM,QAAQ,GACZ,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC;IAC1F,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC;IACxD,OAAO;QACL,IAAI;QACJ,GAAG;QACH,GAAG;QACH,QAAQ;QACR,IAAI,EAAE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;KACjF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAAC,KAA8B;IACzD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAC3E,CAAC,CAAE,GAA+B;QAClC,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,MAAM,GACV,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEhD,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACvD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;IAClG,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;IACxB,CAAC;SAAM,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACzF,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,IAAI,UAAU,GAAG,MAAM,CAAC;IACxB,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACjE,UAAU,GAAG,IAAI,CAAC;YAClB,SAAS;QACX,CAAC;QACD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,IAA+B,CAAC;YAC/C,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACvC,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;gBACzC,IAAI,OAAO,IAAI,KAAK,QAAQ;oBAAE,OAAO,IAAI,CAAC;gBAC1C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtB,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;oBAAE,WAAW,KAAK,IAAI,CAAC,MAAM,CAAC;gBACtD,SAAS;YACX,CAAC;YACD,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,WAAW,KAAK,IAAI,CAAC,MAAM,CAAC;IACxD,CAAC;IAED,gDAAgD;IAChD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,CAAC,KAAc,EAAiB,EAAE;YAC9C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;gBAAE,OAAO,IAAI,CAAC;YACvE,MAAM,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1F,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjD,CAAC,CAAC;QACF,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;QACtC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;gBAC9C,OAAO,wDAAwD,CAAC;YAClE,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,cAAc,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC1F,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,QAAQ;gBACrC,GAAG;gBACH,GAAG;gBACH,QAAQ,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE;gBACxE,IAAI,EAAE,IAAI;aACX,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,aAAa;QAAE,OAAO,WAAW,aAAa,aAAa,CAAC;IAE/E,MAAM,MAAM,GACV,eAAe,CACb,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,MAAM,EAAE,CAAC,QAAQ,CAAC,CAC3F,IAAI,WAAW,CAAC;IACnB,MAAM,MAAM,GACV,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;QAC3G,IAAI,CAAC;IAEP,yEAAyE;IACzE,uEAAuE;IACvE,sBAAsB;IACtB,OAAO;QACL,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK;QAC9B,MAAM;QACN,MAAM;QACN,MAAM,EAAE,UAAU;KACnB,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAqD;IAC5E,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC;IAC9F,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,SAAS,CAAC,GAAQ;IAChC,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC"}
@@ -32,7 +32,7 @@ function one(params, key) {
32
32
  return trimmed === '' ? null : trimmed;
33
33
  }
34
34
  function integer(value, fallback, min, max) {
35
- if (value === null)
35
+ if (value === null || !/^[+-]?\d+$/.test(value))
36
36
  return fallback;
37
37
  const parsed = Number.parseInt(value, 10);
38
38
  if (!Number.isFinite(parsed))
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/schema/query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/schema/query.ts"],"names":[],"mappings":"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"}
@@ -26,7 +26,9 @@ export function createApp(pool, config, mailer = createMailer(config), coinpay =
26
26
  const deps = { pool, config, mailer, coinpay };
27
27
  const app = new Hono();
28
28
  app.use('*', withViewer(deps));
29
- app.use('*', securityHeaders());
29
+ // A payer is sent from a form on this board to CoinPay's hosted pay page,
30
+ // and the policy has to say so or the browser stops the redirect.
31
+ app.use('*', securityHeaders({ formActions: config.coinpay === null ? [] : [config.coinpay.url] }));
30
32
  app.use('/api/*', apiCors());
31
33
  app.route('/api/v1', apiRoutes());
32
34
  // The MCP tools call this same app, so the getter is resolved lazily: the
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/server/app.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/server/app.tsx"],"names":[],"mappings":"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"}
@@ -31,8 +31,18 @@ export declare function withViewer(deps: Deps): MiddlewareHandler<AppEnv>;
31
31
  * `style` attribute for a computed width - note that in CSP a style ATTRIBUTE
32
32
  * is covered by style-src, not by style-src-attr alone, which is a distinction
33
33
  * that has cost time before.
34
+ *
35
+ * form-action covers more than where a form posts. Chrome and Safari also
36
+ * apply it to the redirect a form submission comes back with, so a POST that
37
+ * answers 303 to another origin is refused by the browser and the person is
38
+ * left on a blank page with the work already done on the server. Paying an
39
+ * invoice is exactly that shape: the board mints the quote and sends the
40
+ * payer to CoinPay's hosted page. Every origin a form may be sent on to is
41
+ * named here; 'self' alone looked complete and was not.
34
42
  */
35
- export declare function securityHeaders(): MiddlewareHandler<AppEnv>;
43
+ export declare function securityHeaders(options?: {
44
+ formActions?: string[];
45
+ }): MiddlewareHandler<AppEnv>;
36
46
  /**
37
47
  * CORS for the API only.
38
48
  *
@@ -35,13 +35,19 @@ export function withViewer(deps) {
35
35
  c.set('viewer', viewer);
36
36
  // The nav's unread count, for a person on a page. One indexed query, and
37
37
  // only on the surface that has a nav: an API call has nowhere to show it.
38
- if (viewer !== null && !c.req.path.startsWith('/api/') && !c.req.path.startsWith('/assets/')) {
38
+ if (viewer !== null &&
39
+ !c.req.path.startsWith('/api/') &&
40
+ !c.req.path.startsWith('/assets/')) {
39
41
  c.set('unread', await unreadThreads(deps.pool, viewer.id));
40
42
  }
41
43
  }
42
44
  await next();
43
45
  };
44
46
  }
47
+ /** The origin of a URL, for a CSP source list; a bare origin passes through. */
48
+ function originOf(url) {
49
+ return new URL(url).origin;
50
+ }
45
51
  /**
46
52
  * Security headers.
47
53
  *
@@ -56,12 +62,21 @@ export function withViewer(deps) {
56
62
  * `style` attribute for a computed width - note that in CSP a style ATTRIBUTE
57
63
  * is covered by style-src, not by style-src-attr alone, which is a distinction
58
64
  * that has cost time before.
65
+ *
66
+ * form-action covers more than where a form posts. Chrome and Safari also
67
+ * apply it to the redirect a form submission comes back with, so a POST that
68
+ * answers 303 to another origin is refused by the browser and the person is
69
+ * left on a blank page with the work already done on the server. Paying an
70
+ * invoice is exactly that shape: the board mints the quote and sends the
71
+ * payer to CoinPay's hosted page. Every origin a form may be sent on to is
72
+ * named here; 'self' alone looked complete and was not.
59
73
  */
60
- export function securityHeaders() {
74
+ export function securityHeaders(options = {}) {
75
+ const formActions = ["'self'", ...(options.formActions ?? []).map(originOf)].join(' ');
61
76
  const policy = [
62
77
  `default-src 'self'`,
63
78
  `base-uri 'self'`,
64
- `form-action 'self'`,
79
+ `form-action ${formActions}`,
65
80
  `frame-ancestors 'none'`,
66
81
  `object-src 'none'`,
67
82
  `script-src 'self' https://crawlproof.com`,
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/server/middleware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/server/middleware.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@
16
16
  import { Hono } from 'hono';
17
17
  import { approveDeviceCode, createSession, ensureUser, normaliseEmail, pollDeviceAuth, requireAdmin, safeRedirect, startDeviceAuth, startMagicLink, } from "../../core/auth.js";
18
18
  import { createApplication, decideApplication, listApplications, listDraftApplications, recentApplicationCount, submitApplication, validateApplication, } from "../../core/applications.js";
19
- import { countJobs, createJob, getJobBySlug, getJobBySourceUrl, normaliseInput, searchJobs, setStatus, editJob, updateJobFromImport, } from "../../core/jobs.js";
19
+ import { countJobs, createJob, getJobBySlug, getJobBySourceUrl, normaliseInput, publishProblem, searchJobs, setStatus, editJob, updateJobFromImport, } from "../../core/jobs.js";
20
20
  import { extractJob, JobImportProblem } from "../../core/import-job.js";
21
21
  import { createOrg, deleteOrg, getOrgBySlug, isMember, listOrgs, listOrgsForUser, updateOrg, } from "../../core/orgs.js";
22
22
  import { createResume, deleteResume, getPublicResume, getResume, listPublicResumes, getResumeById, getSharedResume, isVisibility, listResumes, updateResume, } from "../../core/resumes.js";
@@ -24,6 +24,7 @@ import { importDocument, ImportProblem, MAX_UPLOAD_BYTES } from "../../core/impo
24
24
  import { deliverMagicLink } from "../../core/mail.js";
25
25
  import { resumeForViewer, tagsFrom, toCandidateSummary, withTags, } from "../../core/candidates.js";
26
26
  import { candidateSlugFor, deleteUpdate, follow, followerCount, isFollowing, listFollowedUpdates, listFollowing, listScoped, postUpdate, scopeFrom, unfollow, userForCandidate, } from "../../core/updates.js";
27
+ import { decide as decideRecommendation, listApproved, listGiven, listReceived, notifySubject, resolve as resolveRecommendation, withdraw as withdrawRecommendation, writeRecommendation, } from "../../core/recommendations.js";
27
28
  import { sameOrigin } from "../../config.js";
28
29
  import { announce, Blocked, listInstances, listTopics } from "../../directory/registry.js";
29
30
  import { federatedSearch, targetsFromDescriptors } from "../../directory/federate.js";
@@ -66,6 +67,38 @@ async function readBody(c) {
66
67
  return {};
67
68
  }
68
69
  }
70
+ /**
71
+ * The pay fields of a PATCH, merged onto what the listing already says.
72
+ *
73
+ * Any pay field in the body replaces the whole of the pay: `pay` (lines, in
74
+ * either form), the flat salary fields, `payMethod`, `unpaid`. A body with
75
+ * none of them keeps the listing's pay as it is, so editing a description
76
+ * does not quietly clear a rate.
77
+ */
78
+ function payPatch(body, job) {
79
+ const sent = (key) => body[key] !== undefined && body[key] !== null;
80
+ const hasLines = sent('pay') || sent('payLines') || sent('salaryMin') || sent('salaryMax') ||
81
+ sent('salaryPeriod') || sent('salaryCurrency');
82
+ const hasUnpaid = sent('salaryUnpaid') || sent('unpaid') || sent('payUnpaid');
83
+ return {
84
+ ...(hasLines
85
+ ? {
86
+ pay: body['pay'] ?? body['payLines'],
87
+ salaryMin: body['salaryMin'],
88
+ salaryMax: body['salaryMax'],
89
+ salaryPeriod: body['salaryPeriod'],
90
+ salaryCurrency: body['salaryCurrency'],
91
+ }
92
+ : { pay: { lines: job.pay.lines } }),
93
+ salaryUnpaid: hasUnpaid
94
+ ? (body['salaryUnpaid'] ?? body['unpaid'] ?? body['payUnpaid'])
95
+ : hasLines
96
+ ? false
97
+ : job.pay.unpaid,
98
+ payMethod: body['payMethod'] ?? body['paymentMethod'] ?? body['paymentCoin'] ?? job.pay.method,
99
+ payEquity: body['payEquity'] ?? body['salaryEquity'] ?? body['equity'] ?? job.pay.equity,
100
+ };
101
+ }
69
102
  export function apiRoutes() {
70
103
  const api = new Hono();
71
104
  // --- jobs -------------------------------------------------------------
@@ -195,11 +228,19 @@ export function apiRoutes() {
195
228
  const input = normaliseInput(body, org.id);
196
229
  if (typeof input === 'string')
197
230
  return fail(c, 400, 'invalid', input);
198
- const job = await createJob(pool, input);
199
231
  // A job posted through the API arrives as a draft like any other, unless
200
232
  // the caller asked for it to go live. An agent that posts a job the author
201
233
  // has not read is the failure mode worth designing against.
202
- if (body['publish'] === true || body['publish'] === 'true') {
234
+ const publish = body['publish'] === true || body['publish'] === 'true';
235
+ if (publish) {
236
+ // Checked before the insert: a caller who asked for a live listing and
237
+ // gets a 400 should not find a draft they did not ask for either.
238
+ const problem = publishProblem(input);
239
+ if (problem !== null)
240
+ return fail(c, 400, 'pay_required', problem);
241
+ }
242
+ const job = await createJob(pool, input);
243
+ if (publish) {
203
244
  const published = await setStatus(pool, job.id, 'published');
204
245
  return c.json({ job: published ?? job }, 201);
205
246
  }
@@ -328,13 +369,17 @@ export function apiRoutes() {
328
369
  requirements: body['requirements'] ?? job.requirements,
329
370
  responsibilities: body['responsibilities'] ?? job.responsibilities,
330
371
  agentPolicy: body['agentPolicy'] ?? job.agentPolicy,
331
- salaryMin: body['salaryMin'] ?? job.salary.min ?? undefined,
332
- salaryMax: body['salaryMax'] ?? job.salary.max ?? undefined,
333
- salaryCurrency: body['salaryCurrency'] ?? job.salary.currency,
334
- salaryPeriod: body['salaryPeriod'] ?? job.salary.period,
372
+ ...payPatch(body, job),
335
373
  }, job.org.id);
336
374
  if (typeof merged === 'string')
337
375
  return fail(c, 400, 'invalid', merged);
376
+ // A live listing stays held to the publish rule: an edit that removes
377
+ // the pay would leave it public without one.
378
+ if (job.status === 'published') {
379
+ const problem = publishProblem(merged);
380
+ if (problem !== null)
381
+ return fail(c, 400, 'pay_required', problem);
382
+ }
338
383
  const updated = await editJob(pool, job.id, merged);
339
384
  return c.json({ job: updated ?? job });
340
385
  });
@@ -351,6 +396,13 @@ export function apiRoutes() {
351
396
  }
352
397
  const action = c.req.param('action');
353
398
  const status = action === 'close' ? 'closed' : 'published';
399
+ if (status === 'published') {
400
+ // Pay is required to go live. The message says what to send, because
401
+ // the caller is as likely to be an agent as a person.
402
+ const problem = publishProblem(job);
403
+ if (problem !== null)
404
+ return fail(c, 400, 'pay_required', problem);
405
+ }
354
406
  const updated = await setStatus(pool, job.id, status);
355
407
  return c.json({ job: updated });
356
408
  });
@@ -852,6 +904,100 @@ export function apiRoutes() {
852
904
  const items = await listFollowing(pool, viewer.id);
853
905
  return c.json({ items, total: items.length });
854
906
  });
907
+ // --- recommendations ----------------------------------------------------
908
+ /**
909
+ * Written by somebody who worked with the subject, shown once the subject
910
+ * approves. Reading is public: an approved recommendation is on the page.
911
+ */
912
+ api.get('/candidates/:slug/recommendations', async (c) => {
913
+ const { pool } = c.get('deps');
914
+ const userId = await userForCandidate(pool, c.req.param('slug'));
915
+ if (userId === null)
916
+ return fail(c, 404, 'not_found', `Nobody here is "${c.req.param('slug')}".`);
917
+ const items = await listApproved(pool, { kind: 'candidate', userId });
918
+ return c.json({ items, total: items.length });
919
+ });
920
+ api.get('/orgs/:slug/recommendations', async (c) => {
921
+ const { pool } = c.get('deps');
922
+ const org = await getOrgBySlug(pool, c.req.param('slug'));
923
+ if (org === null)
924
+ return fail(c, 404, 'not_found', `No employer here is "${c.req.param('slug')}".`);
925
+ const items = await listApproved(pool, { kind: 'employer', orgId: org.id });
926
+ return c.json({ items, total: items.length });
927
+ });
928
+ /**
929
+ * Write one. As yourself, which needs a published resume so it is signed
930
+ * by a page, or as an employer you post for ("as"). It is pending until
931
+ * the subject approves it, and writing again replaces it.
932
+ */
933
+ const recommend = async (c, target) => {
934
+ const { pool, config, mailer } = c.get('deps');
935
+ const viewer = viewerOf(c);
936
+ if (viewer === null)
937
+ return fail(c, 401, 'unauthorised', 'Sign in to write a recommendation.');
938
+ const body = await readBody(c);
939
+ const resolved = await resolveRecommendation(pool, viewer.id, {
940
+ ...target,
941
+ ...(typeof body['as'] === 'string' ? { as: body['as'] } : {}),
942
+ });
943
+ if (typeof resolved === 'string') {
944
+ const notFound = /^Nobody here|^No employer/.test(resolved);
945
+ const noPage = /Publish a resume|signed by a page/.test(resolved);
946
+ return fail(c, notFound ? 404 : noPage ? 403 : 400, notFound ? 'not_found' : noPage ? 'no_profile' : 'invalid', resolved);
947
+ }
948
+ const written = await writeRecommendation(pool, viewer.id, {
949
+ as: resolved.as,
950
+ subject: resolved.subject,
951
+ body: body['body'],
952
+ relationship: body['relationship'],
953
+ });
954
+ if (typeof written === 'string') {
955
+ return fail(c, /limit/.test(written) ? 429 : 400, /limit/.test(written) ? 'rate_limited' : 'invalid', written);
956
+ }
957
+ void notifySubject({
958
+ pool,
959
+ mailer,
960
+ boardName: config.boardName,
961
+ publicUrl: config.publicUrl,
962
+ recommendation: written,
963
+ subject: resolved.subject,
964
+ }).catch(() => undefined);
965
+ return c.json({ recommendation: written }, 201);
966
+ };
967
+ api.post('/candidates/:slug/recommendations', (c) => recommend(c, { candidate: c.req.param('slug') }));
968
+ api.post('/orgs/:slug/recommendations', (c) => recommend(c, { org: c.req.param('slug') }));
969
+ /** About you and your employers, every status, and what you wrote. */
970
+ api.get('/me/recommendations', async (c) => {
971
+ const { pool } = c.get('deps');
972
+ const viewer = viewerOf(c);
973
+ if (viewer === null)
974
+ return fail(c, 401, 'unauthorised', 'Sign in to see your recommendations.');
975
+ const [received, given] = await Promise.all([listReceived(pool, viewer.id), listGiven(pool, viewer.id)]);
976
+ return c.json({ received, given, pending: received.filter((item) => item.status === 'pending').length });
977
+ });
978
+ /**
979
+ * Approve or reject one written about you, or withdraw one you wrote. A
980
+ * 404 covers "no such recommendation" and "not yours to decide", which
981
+ * are the same fact to a caller who should not be able to tell.
982
+ */
983
+ api.post('/recommendations/:id/:action{approve|reject|withdraw}', async (c) => {
984
+ const { pool } = c.get('deps');
985
+ const viewer = viewerOf(c);
986
+ if (viewer === null)
987
+ return fail(c, 401, 'unauthorised', 'Sign in first.');
988
+ const id = c.req.param('id');
989
+ const action = c.req.param('action');
990
+ if (action === 'withdraw') {
991
+ const gone = await withdrawRecommendation(pool, viewer.id, id);
992
+ if (!gone)
993
+ return fail(c, 404, 'not_found', 'No such recommendation, or it is not yours to withdraw.');
994
+ return c.json({ withdrawn: true });
995
+ }
996
+ const decided = await decideRecommendation(pool, viewer.id, id, action === 'approve' ? 'approved' : 'rejected');
997
+ if (decided === null)
998
+ return fail(c, 404, 'not_found', 'No such recommendation, or it is not yours to decide.');
999
+ return c.json({ recommendation: decided });
1000
+ });
855
1001
  // --- sign in ----------------------------------------------------------
856
1002
  api.post('/auth/magic-link', async (c) => {
857
1003
  const { pool, config, mailer } = c.get('deps');