careermate 0.1.2 → 0.1.3

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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -1
  3. package/apps/web/public/pages/documents.js +7 -2
  4. package/apps/web/public/pages/home.js +4 -7
  5. package/apps/web/public/pages/jobs.js +1 -5
  6. package/apps/web/public/pages/profile.js +3 -3
  7. package/apps/web/public/styles.css +7 -2
  8. package/dist/doctor.mjs +112 -90
  9. package/dist/install-page/analytics.js +97 -0
  10. package/dist/install-page/index.html +77 -56
  11. package/dist/install-page/og.png +0 -0
  12. package/dist/install-page/robots.txt +4 -0
  13. package/dist/install-page/sitemap.xml +21 -0
  14. package/dist/install-page/start.html +13 -10
  15. package/dist/install-page/style.css +75 -40
  16. package/dist/mcp.mjs +112 -90
  17. package/dist/migrate.mjs +95 -82
  18. package/dist/public/pages/documents.js +7 -2
  19. package/dist/public/pages/home.js +4 -7
  20. package/dist/public/pages/jobs.js +1 -5
  21. package/dist/public/pages/profile.js +3 -3
  22. package/dist/public/styles.css +7 -2
  23. package/dist/web.mjs +113 -86
  24. package/package.json +1 -2
  25. package/packages/db/src/repositories.ts +18 -1
  26. package/packages/mcp-tools/src/tools.ts +5 -5
  27. package/packages/parsers/src/documents.ts +13 -1
  28. package/packages/shared/src/schemas.ts +115 -81
  29. package/scripts/build-dist.mjs +7 -1
  30. package/scripts/gen-og.mjs +1 -1
  31. package/scripts/test.ts +25 -0
  32. package/scripts/ui-smoke.ts +32 -4
  33. package/dist/install-page/.omc/state/agent-replay-55a58c0d-bb6e-43ea-8a05-4b6c93b80b34.jsonl +0 -12
  34. package/dist/install-page/.omc/state/idle-notif-cooldown.json +0 -3
  35. package/dist/install-page/.omc/state/sessions/55a58c0d-bb6e-43ea-8a05-4b6c93b80b34/mission-state.json +0 -147
  36. package/dist/install-page/.omc/state/sessions/55a58c0d-bb6e-43ea-8a05-4b6c93b80b34/pre-tool-advisory-throttle.json +0 -22
  37. package/dist/install-page/.omc/state/sessions/55a58c0d-bb6e-43ea-8a05-4b6c93b80b34/subagent-tracking-state.json +0 -44
  38. package/docs/ARCHITECTURE.md +0 -208
  39. package/docs/CHANGES_V1.md +0 -103
  40. package/docs/DATA_MODEL.md +0 -460
  41. package/docs/DECISIONS.md +0 -277
  42. package/docs/DEMO.md +0 -242
  43. package/docs/MCP_TOOLS.md +0 -292
  44. package/docs/ROADMAP.md +0 -135
  45. package/docs/RUNTIME_DISTRIBUTION_RESEARCH.md +0 -135
  46. package/docs/START_WORKFLOW.md +0 -137
  47. package/docs/SUPPORTED_AI_APPS.md +0 -112
  48. package/docs/TODO.md +0 -57
  49. package/docs/UX_NOTES.md +0 -247
  50. package/docs/WORKFLOWS.md +0 -202
  51. package/docs/superpowers/specs/2026-06-16-demo-dashboard-deploy-design.md +0 -64
package/dist/mcp.mjs CHANGED
@@ -92585,29 +92585,42 @@ function isSafeUrl(u) {
92585
92585
  return !/^[a-z][a-z0-9+.-]*:/i.test(s) || /^(https?:|mailto:)/i.test(s);
92586
92586
  }
92587
92587
  var UNSAFE_URL_MSG = "javascript: \uAC19\uC740 \uC704\uD5D8\uD55C \uB9C1\uD06C\uB294 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. http(s) \uB9C1\uD06C\uB97C \uC0AC\uC6A9\uD558\uC138\uC694.";
92588
- var SafeUrl = external_exports.string().min(1).refine(isSafeUrl, { message: UNSAFE_URL_MSG });
92589
- var SafeUrlOptional = external_exports.string().optional().refine((u) => u == null || u === "" || isSafeUrl(u), { message: UNSAFE_URL_MSG });
92588
+ var MAX_URL = 2e3;
92589
+ var SafeUrl = external_exports.string().min(1).max(MAX_URL).refine(isSafeUrl, { message: UNSAFE_URL_MSG });
92590
+ var SafeUrlOptional = external_exports.string().max(MAX_URL).optional().refine((u) => u == null || u === "" || isSafeUrl(u), { message: UNSAFE_URL_MSG });
92591
+ var MAX_LINE = 500;
92592
+ var MAX_NOTE = 1e4;
92593
+ var MAX_BODY = 2e5;
92594
+ var MAX_ITEM = 2e3;
92595
+ var MAX_ITEMS = 500;
92596
+ var EMPTY_MSG = "\uB0B4\uC6A9\uC774 \uBE44\uC5B4 \uC788\uC2B5\uB2C8\uB2E4(\uACF5\uBC31\uB9CC\uC73C\uB85C\uB294 \uC800\uC7A5\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4).";
92597
+ var reqLine = external_exports.string().trim().min(1).max(MAX_LINE);
92598
+ var optLine = external_exports.string().max(MAX_LINE).optional();
92599
+ var optNote = external_exports.string().max(MAX_NOTE).optional();
92600
+ var optBody = external_exports.string().max(MAX_BODY).optional();
92601
+ var reqBody = external_exports.string().max(MAX_BODY).refine((s) => s.trim().length > 0, { message: EMPTY_MSG });
92602
+ var strList = external_exports.array(external_exports.string().max(MAX_ITEM)).max(MAX_ITEMS);
92590
92603
  var baseRecord = {
92591
92604
  id,
92592
92605
  created_at: isoDateTime,
92593
92606
  updated_at: isoDateTime
92594
92607
  };
92595
92608
  var LinkSchema = external_exports.object({
92596
- label: external_exports.string().min(1),
92609
+ label: reqLine,
92597
92610
  url: SafeUrl
92598
92611
  });
92599
92612
  var ProfileInputSchema = external_exports.object({
92600
- name: external_exports.string().min(1).optional(),
92601
- email: external_exports.string().optional(),
92602
- phone: external_exports.string().optional(),
92603
- location: external_exports.string().optional(),
92604
- headline: external_exports.string().optional().describe("\uD55C \uC904 \uC18C\uAC1C / \uC9C1\uBB34 \uD0C0\uC774\uD2C0"),
92605
- summary: external_exports.string().optional().describe("\uC790\uAE30\uC18C\uAC1C \uC694\uC57D"),
92606
- desired_roles: external_exports.array(external_exports.string()).optional().describe("\uD76C\uB9DD \uC9C1\uBB34"),
92607
- desired_conditions: external_exports.string().optional().describe("\uD76C\uB9DD \uADFC\uBB34 \uC870\uAC74 (\uC5F0\uBD09, \uC9C0\uC5ED, \uADFC\uBB34\uD615\uD0DC \uB4F1)"),
92608
- preferred_tone: external_exports.string().optional().describe("\uC790\uAE30\uC18C\uAC1C\uC11C \uC120\uD638 \uBB38\uCCB4 (\uC608: \uB2F4\uBC31\uD558\uACE0 \uAD6C\uCCB4\uC801)"),
92609
- emphasis_points: external_exports.array(external_exports.string()).optional().describe("\uAC15\uC870\uD558\uACE0 \uC2F6\uC740 \uD575\uC2EC \uD3EC\uC778\uD2B8"),
92610
- links: external_exports.array(LinkSchema).optional().describe("\uD3EC\uD2B8\uD3F4\uB9AC\uC624/\uAE43\uD5C8\uBE0C/\uB9C1\uD06C\uB4DC\uC778 \uB4F1")
92613
+ name: reqLine.optional(),
92614
+ email: optLine,
92615
+ phone: optLine,
92616
+ location: optLine,
92617
+ headline: external_exports.string().max(MAX_LINE).optional().describe("\uD55C \uC904 \uC18C\uAC1C / \uC9C1\uBB34 \uD0C0\uC774\uD2C0"),
92618
+ summary: external_exports.string().max(MAX_NOTE).optional().describe("\uC790\uAE30\uC18C\uAC1C \uC694\uC57D"),
92619
+ desired_roles: strList.optional().describe("\uD76C\uB9DD \uC9C1\uBB34"),
92620
+ desired_conditions: external_exports.string().max(MAX_NOTE).optional().describe("\uD76C\uB9DD \uADFC\uBB34 \uC870\uAC74 (\uC5F0\uBD09, \uC9C0\uC5ED, \uADFC\uBB34\uD615\uD0DC \uB4F1)"),
92621
+ preferred_tone: external_exports.string().max(MAX_LINE).optional().describe("\uC790\uAE30\uC18C\uAC1C\uC11C \uC120\uD638 \uBB38\uCCB4 (\uC608: \uB2F4\uBC31\uD558\uACE0 \uAD6C\uCCB4\uC801)"),
92622
+ emphasis_points: strList.optional().describe("\uAC15\uC870\uD558\uACE0 \uC2F6\uC740 \uD575\uC2EC \uD3EC\uC778\uD2B8"),
92623
+ links: external_exports.array(LinkSchema).max(MAX_ITEMS).optional().describe("\uD3EC\uD2B8\uD3F4\uB9AC\uC624/\uAE43\uD5C8\uBE0C/\uB9C1\uD06C\uB4DC\uC778 \uB4F1")
92611
92624
  });
92612
92625
  var ProfileRecordSchema = external_exports.object({
92613
92626
  ...baseRecord,
@@ -92624,15 +92637,15 @@ var ProfileRecordSchema = external_exports.object({
92624
92637
  links: external_exports.array(LinkSchema)
92625
92638
  });
92626
92639
  var ExperienceInputSchema = external_exports.object({
92627
- company: external_exports.string().min(1),
92628
- role: external_exports.string().optional(),
92629
- employment_type: external_exports.string().optional().describe("\uC815\uADDC\uC9C1/\uACC4\uC57D\uC9C1/\uC778\uD134/\uD504\uB9AC\uB79C\uC11C \uB4F1"),
92630
- start_date: external_exports.string().optional().describe("YYYY-MM \uB610\uB294 YYYY-MM-DD"),
92631
- end_date: external_exports.string().optional().describe("\uC7AC\uC9C1 \uC911\uC774\uBA74 \uBE44\uC6CC\uB450\uAE30"),
92640
+ company: reqLine,
92641
+ role: optLine,
92642
+ employment_type: external_exports.string().max(MAX_LINE).optional().describe("\uC815\uADDC\uC9C1/\uACC4\uC57D\uC9C1/\uC778\uD134/\uD504\uB9AC\uB79C\uC11C \uB4F1"),
92643
+ start_date: external_exports.string().max(MAX_LINE).optional().describe("YYYY-MM \uB610\uB294 YYYY-MM-DD"),
92644
+ end_date: external_exports.string().max(MAX_LINE).optional().describe("\uC7AC\uC9C1 \uC911\uC774\uBA74 \uBE44\uC6CC\uB450\uAE30"),
92632
92645
  is_current: external_exports.boolean().optional(),
92633
- description: external_exports.string().optional(),
92634
- achievements: external_exports.array(external_exports.string()).optional().describe("\uC131\uACFC/\uC5C5\uC801 (\uC815\uB7C9 \uC9C0\uD45C \uAD8C\uC7A5)"),
92635
- tech: external_exports.array(external_exports.string()).optional().describe("\uC0AC\uC6A9 \uAE30\uC220/\uB3C4\uAD6C"),
92646
+ description: optBody,
92647
+ achievements: strList.optional().describe("\uC131\uACFC/\uC5C5\uC801 (\uC815\uB7C9 \uC9C0\uD45C \uAD8C\uC7A5)"),
92648
+ tech: strList.optional().describe("\uC0AC\uC6A9 \uAE30\uC220/\uB3C4\uAD6C"),
92636
92649
  order_index: external_exports.number().optional()
92637
92650
  });
92638
92651
  var ExperienceRecordSchema = external_exports.object({
@@ -92649,14 +92662,14 @@ var ExperienceRecordSchema = external_exports.object({
92649
92662
  order_index: external_exports.number()
92650
92663
  });
92651
92664
  var ProjectInputSchema = external_exports.object({
92652
- name: external_exports.string().min(1),
92653
- role: external_exports.string().optional(),
92654
- description: external_exports.string().optional(),
92655
- highlights: external_exports.array(external_exports.string()).optional(),
92656
- tech: external_exports.array(external_exports.string()).optional(),
92665
+ name: reqLine,
92666
+ role: optLine,
92667
+ description: optBody,
92668
+ highlights: strList.optional(),
92669
+ tech: strList.optional(),
92657
92670
  url: SafeUrlOptional,
92658
- start_date: external_exports.string().optional(),
92659
- end_date: external_exports.string().optional(),
92671
+ start_date: optLine,
92672
+ end_date: optLine,
92660
92673
  order_index: external_exports.number().optional()
92661
92674
  });
92662
92675
  var ProjectRecordSchema = external_exports.object({
@@ -92672,9 +92685,9 @@ var ProjectRecordSchema = external_exports.object({
92672
92685
  order_index: external_exports.number()
92673
92686
  });
92674
92687
  var SkillInputSchema = external_exports.object({
92675
- name: external_exports.string().min(1),
92676
- category: external_exports.string().optional().describe("\uC5B8\uC5B4/\uD504\uB808\uC784\uC6CC\uD06C/\uD234/\uC18C\uD504\uD2B8\uC2A4\uD0AC \uB4F1"),
92677
- level: external_exports.string().optional().describe("\uC0C1/\uC911/\uD558 \uB610\uB294 \uC790\uC720 \uC11C\uC220"),
92688
+ name: reqLine,
92689
+ category: external_exports.string().max(MAX_LINE).optional().describe("\uC5B8\uC5B4/\uD504\uB808\uC784\uC6CC\uD06C/\uD234/\uC18C\uD504\uD2B8\uC2A4\uD0AC \uB4F1"),
92690
+ level: external_exports.string().max(MAX_LINE).optional().describe("\uC0C1/\uC911/\uD558 \uB610\uB294 \uC790\uC720 \uC11C\uC220"),
92678
92691
  years: external_exports.number().optional(),
92679
92692
  order_index: external_exports.number().optional()
92680
92693
  });
@@ -92688,11 +92701,11 @@ var SkillRecordSchema = external_exports.object({
92688
92701
  });
92689
92702
  var DocumentInputSchema = external_exports.object({
92690
92703
  kind: external_exports.enum(DOCUMENT_KINDS),
92691
- title: external_exports.string().min(1),
92692
- content: external_exports.string().describe("Markdown \uB610\uB294 \uC77C\uBC18 \uD14D\uC2A4\uD2B8 \uBCF8\uBB38"),
92704
+ title: reqLine,
92705
+ content: reqBody.describe("Markdown \uB610\uB294 \uC77C\uBC18 \uD14D\uC2A4\uD2B8 \uBCF8\uBB38"),
92693
92706
  source: external_exports.enum(CONTENT_SOURCES).optional(),
92694
92707
  is_primary: external_exports.boolean().optional().describe("\uB300\uD45C \uBB38\uC11C \uC5EC\uBD80"),
92695
- tags: external_exports.array(external_exports.string()).optional()
92708
+ tags: strList.optional()
92696
92709
  });
92697
92710
  var DocumentRecordSchema = external_exports.object({
92698
92711
  ...baseRecord,
@@ -92704,19 +92717,19 @@ var DocumentRecordSchema = external_exports.object({
92704
92717
  tags: external_exports.array(external_exports.string())
92705
92718
  });
92706
92719
  var CoverLetterInputSchema = external_exports.object({
92707
- title: external_exports.string().min(1),
92708
- job_id: external_exports.string().optional().describe("\uD2B9\uC815 \uACF5\uACE0\uC5D0 \uC5F0\uACB0\uD560 \uACBD\uC6B0"),
92720
+ title: reqLine,
92721
+ job_id: optLine.describe("\uD2B9\uC815 \uACF5\uACE0\uC5D0 \uC5F0\uACB0\uD560 \uACBD\uC6B0"),
92709
92722
  is_primary: external_exports.boolean().optional(),
92710
- content: external_exports.string().optional().describe("\uCD08\uAE30 \uBC84\uC804 \uBCF8\uBB38 (\uC788\uC73C\uBA74 v1\uB85C \uC800\uC7A5)"),
92723
+ content: optBody.describe("\uCD08\uAE30 \uBC84\uC804 \uBCF8\uBB38 (\uC788\uC73C\uBA74 v1\uB85C \uC800\uC7A5)"),
92711
92724
  source: external_exports.enum(CONTENT_SOURCES).optional(),
92712
- note: external_exports.string().optional().describe("\uCD08\uAE30 \uBC84\uC804 \uBA54\uBAA8")
92725
+ note: optNote.describe("\uCD08\uAE30 \uBC84\uC804 \uBA54\uBAA8")
92713
92726
  });
92714
92727
  var CoverLetterVersionInputSchema = external_exports.object({
92715
- cover_letter_id: external_exports.string().optional().describe("\uAE30\uC874 \uC790\uAE30\uC18C\uAC1C\uC11C\uC5D0 \uC0C8 \uBC84\uC804 \uCD94\uAC00 \uC2DC"),
92716
- title: external_exports.string().optional().describe("\uC0C8 \uC790\uAE30\uC18C\uAC1C\uC11C\uB97C \uB9CC\uB4E4 \uB54C \uC81C\uBAA9"),
92717
- job_id: external_exports.string().optional(),
92718
- content: external_exports.string().min(1),
92719
- note: external_exports.string().optional().describe("\uC774 \uBC84\uC804\uC758 \uBCC0\uACBD \uC694\uC57D (\uC608: \uC9C0\uC6D0\uB3D9\uAE30 \uBCF4\uAC15)"),
92728
+ cover_letter_id: optLine.describe("\uAE30\uC874 \uC790\uAE30\uC18C\uAC1C\uC11C\uC5D0 \uC0C8 \uBC84\uC804 \uCD94\uAC00 \uC2DC"),
92729
+ title: external_exports.string().max(MAX_LINE).optional().describe("\uC0C8 \uC790\uAE30\uC18C\uAC1C\uC11C\uB97C \uB9CC\uB4E4 \uB54C \uC81C\uBAA9"),
92730
+ job_id: optLine,
92731
+ content: reqBody,
92732
+ note: optNote.describe("\uC774 \uBC84\uC804\uC758 \uBCC0\uACBD \uC694\uC57D (\uC608: \uC9C0\uC6D0\uB3D9\uAE30 \uBCF4\uAC15)"),
92720
92733
  source: external_exports.enum(CONTENT_SOURCES).optional(),
92721
92734
  set_current: external_exports.boolean().optional().describe("\uC774 \uBC84\uC804\uC744 \uD604\uC7AC \uBC84\uC804\uC73C\uB85C \uC9C0\uC815 (\uAE30\uBCF8 true)")
92722
92735
  });
@@ -92740,16 +92753,16 @@ var CoverLetterRecordSchema = external_exports.object({
92740
92753
  versions: external_exports.array(CoverLetterVersionRecordSchema).optional()
92741
92754
  });
92742
92755
  var JobInputSchema = external_exports.object({
92743
- company: external_exports.string().min(1),
92744
- position: external_exports.string().min(1).describe("\uC9C1\uBB34/\uD3EC\uC9C0\uC158\uBA85"),
92756
+ company: reqLine,
92757
+ position: reqLine.describe("\uC9C1\uBB34/\uD3EC\uC9C0\uC158\uBA85"),
92745
92758
  url: SafeUrlOptional,
92746
- location: external_exports.string().optional(),
92747
- employment_type: external_exports.string().optional(),
92748
- description: external_exports.string().optional().describe("\uACF5\uACE0 \uC6D0\uBB38 \uB610\uB294 \uC815\uB9AC\uB41C \uD14D\uC2A4\uD2B8"),
92749
- requirements: external_exports.array(external_exports.string()).optional().describe("\uC790\uACA9\uC694\uAC74/\uC6B0\uB300\uC0AC\uD56D \uD575\uC2EC"),
92750
- keywords: external_exports.array(external_exports.string()).optional().describe("\uD575\uC2EC \uD0A4\uC6CC\uB4DC"),
92751
- deadline: external_exports.string().optional().describe("\uB9C8\uAC10\uC77C YYYY-MM-DD"),
92752
- source: external_exports.string().optional().describe("\uCD9C\uCC98 (\uC0AC\uB78C\uC778/\uC6D0\uD2F0\uB4DC/\uC9C1\uC811 \uC785\uB825 \uB4F1)")
92759
+ location: optLine,
92760
+ employment_type: optLine,
92761
+ description: optBody.describe("\uACF5\uACE0 \uC6D0\uBB38 \uB610\uB294 \uC815\uB9AC\uB41C \uD14D\uC2A4\uD2B8"),
92762
+ requirements: strList.optional().describe("\uC790\uACA9\uC694\uAC74/\uC6B0\uB300\uC0AC\uD56D \uD575\uC2EC"),
92763
+ keywords: strList.optional().describe("\uD575\uC2EC \uD0A4\uC6CC\uB4DC"),
92764
+ deadline: external_exports.string().max(MAX_LINE).optional().describe("\uB9C8\uAC10\uC77C YYYY-MM-DD"),
92765
+ source: external_exports.string().max(MAX_LINE).optional().describe("\uCD9C\uCC98 (\uC0AC\uB78C\uC778/\uC6D0\uD2F0\uB4DC/\uC9C1\uC811 \uC785\uB825 \uB4F1)")
92753
92766
  });
92754
92767
  var JobRecordSchema = external_exports.object({
92755
92768
  ...baseRecord,
@@ -92765,14 +92778,14 @@ var JobRecordSchema = external_exports.object({
92765
92778
  source: external_exports.string().nullable()
92766
92779
  });
92767
92780
  var FitAnalysisInputSchema = external_exports.object({
92768
- job_id: external_exports.string().describe("\uBD84\uC11D \uB300\uC0C1 \uACF5\uACE0 ID"),
92781
+ job_id: reqLine.describe("\uBD84\uC11D \uB300\uC0C1 \uACF5\uACE0 ID"),
92769
92782
  score: external_exports.number().min(0).max(100).optional().describe("\uC885\uD569 \uC801\uD569\uB3C4 0~100"),
92770
- summary: external_exports.string().optional().describe("\uD55C\uB450 \uBB38\uB2E8 \uC694\uC57D"),
92771
- strengths: external_exports.array(external_exports.string()).optional().describe("\uAC15\uC810 / \uC798 \uB9DE\uB294 \uBD80\uBD84"),
92772
- gaps: external_exports.array(external_exports.string()).optional().describe("\uBD80\uC871\uD55C \uBD80\uBD84 / \uBCF4\uC644 \uD544\uC694"),
92773
- matched_keywords: external_exports.array(external_exports.string()).optional(),
92774
- missing_keywords: external_exports.array(external_exports.string()).optional(),
92775
- recommendations: external_exports.array(external_exports.string()).optional().describe("\uC790\uAE30\uC18C\uAC1C\uC11C/\uC9C0\uC6D0 \uC804\uB7B5 \uC81C\uC548")
92783
+ summary: external_exports.string().max(MAX_NOTE).optional().describe("\uD55C\uB450 \uBB38\uB2E8 \uC694\uC57D"),
92784
+ strengths: strList.optional().describe("\uAC15\uC810 / \uC798 \uB9DE\uB294 \uBD80\uBD84"),
92785
+ gaps: strList.optional().describe("\uBD80\uC871\uD55C \uBD80\uBD84 / \uBCF4\uC644 \uD544\uC694"),
92786
+ matched_keywords: strList.optional(),
92787
+ missing_keywords: strList.optional(),
92788
+ recommendations: strList.optional().describe("\uC790\uAE30\uC18C\uAC1C\uC11C/\uC9C0\uC6D0 \uC804\uB7B5 \uC81C\uC548")
92776
92789
  });
92777
92790
  var FitAnalysisRecordSchema = external_exports.object({
92778
92791
  ...baseRecord,
@@ -92786,18 +92799,18 @@ var FitAnalysisRecordSchema = external_exports.object({
92786
92799
  recommendations: external_exports.array(external_exports.string())
92787
92800
  });
92788
92801
  var ApplicationInputSchema = external_exports.object({
92789
- job_id: external_exports.string(),
92802
+ job_id: reqLine,
92790
92803
  status: external_exports.enum(APPLICATION_STATUSES).optional(),
92791
- resume_id: external_exports.string().optional(),
92792
- cover_letter_id: external_exports.string().optional(),
92793
- applied_at: external_exports.string().optional(),
92794
- notes: external_exports.string().optional()
92804
+ resume_id: optLine,
92805
+ cover_letter_id: optLine,
92806
+ applied_at: optLine,
92807
+ notes: optNote
92795
92808
  });
92796
92809
  var ApplicationStatusUpdateSchema = external_exports.object({
92797
- job_id: external_exports.string().optional(),
92798
- application_id: external_exports.string().optional(),
92810
+ job_id: optLine,
92811
+ application_id: optLine,
92799
92812
  status: external_exports.enum(APPLICATION_STATUSES),
92800
- note: external_exports.string().optional().describe("\uC0C1\uD0DC \uBCC0\uACBD \uC0AC\uC720/\uBA54\uBAA8")
92813
+ note: optNote.describe("\uC0C1\uD0DC \uBCC0\uACBD \uC0AC\uC720/\uBA54\uBAA8")
92801
92814
  });
92802
92815
  var ApplicationRecordSchema = external_exports.object({
92803
92816
  ...baseRecord,
@@ -92809,24 +92822,24 @@ var ApplicationRecordSchema = external_exports.object({
92809
92822
  notes: external_exports.string().nullable()
92810
92823
  });
92811
92824
  var StarGuideSchema = external_exports.object({
92812
- question: external_exports.string(),
92813
- situation: external_exports.string().optional(),
92814
- task: external_exports.string().optional(),
92815
- action: external_exports.string().optional(),
92816
- result: external_exports.string().optional()
92825
+ question: external_exports.string().max(MAX_NOTE),
92826
+ situation: optNote,
92827
+ task: optNote,
92828
+ action: optNote,
92829
+ result: optNote
92817
92830
  });
92818
92831
  var InterviewQuestionSchema = external_exports.object({
92819
- question: external_exports.string(),
92820
- intent: external_exports.string().optional().describe("\uC9C8\uBB38 \uC758\uB3C4"),
92821
- followups: external_exports.array(external_exports.string()).optional().describe("\uC608\uC0C1 \uAF2C\uB9AC \uC9C8\uBB38"),
92822
- answer_outline: external_exports.string().optional().describe("\uB2F5\uBCC0 \uAC00\uC774\uB4DC/\uD575\uC2EC \uD3EC\uC778\uD2B8")
92832
+ question: external_exports.string().max(MAX_NOTE),
92833
+ intent: external_exports.string().max(MAX_NOTE).optional().describe("\uC9C8\uBB38 \uC758\uB3C4"),
92834
+ followups: strList.optional().describe("\uC608\uC0C1 \uAF2C\uB9AC \uC9C8\uBB38"),
92835
+ answer_outline: optBody.describe("\uB2F5\uBCC0 \uAC00\uC774\uB4DC/\uD575\uC2EC \uD3EC\uC778\uD2B8")
92823
92836
  });
92824
92837
  var InterviewPrepInputSchema = external_exports.object({
92825
- job_id: external_exports.string(),
92826
- questions: external_exports.array(InterviewQuestionSchema).optional(),
92827
- star_guides: external_exports.array(StarGuideSchema).optional(),
92828
- self_introduction: external_exports.string().optional().describe("1\uBD84 \uC790\uAE30\uC18C\uAC1C \uCD08\uC548"),
92829
- notes: external_exports.string().optional().describe("\uBA74\uC811 \uD6C4\uAE30/\uBA54\uBAA8")
92838
+ job_id: reqLine,
92839
+ questions: external_exports.array(InterviewQuestionSchema).max(MAX_ITEMS).optional(),
92840
+ star_guides: external_exports.array(StarGuideSchema).max(MAX_ITEMS).optional(),
92841
+ self_introduction: optBody.describe("1\uBD84 \uC790\uAE30\uC18C\uAC1C \uCD08\uC548"),
92842
+ notes: optNote.describe("\uBA74\uC811 \uD6C4\uAE30/\uBA54\uBAA8")
92830
92843
  });
92831
92844
  var InterviewPrepRecordSchema = external_exports.object({
92832
92845
  ...baseRecord,
@@ -92880,7 +92893,7 @@ var ApplicationContextSchema = external_exports.object({
92880
92893
  });
92881
92894
 
92882
92895
  // packages/shared/src/build-info.ts
92883
- var APP_VERSION = true ? "0.1.2" : "0.0.0-dev";
92896
+ var APP_VERSION = true ? "0.1.3" : "0.0.0-dev";
92884
92897
  var BUNDLED = true;
92885
92898
 
92886
92899
  // packages/shared/src/index.ts
@@ -94955,9 +94968,19 @@ async function finishPdf(buf, base) {
94955
94968
  });
94956
94969
  return base("pdf", { text, bytes: buf.length, warnings: pageWarnings });
94957
94970
  } catch (e) {
94971
+ const name = e && typeof e === "object" && "name" in e ? String(e.name) : "";
94972
+ if (name === "PasswordException") {
94973
+ return base("unsupported", {
94974
+ bytes: buf.length,
94975
+ warnings: [
94976
+ "\uC774 PDF\uB294 \uC554\uD638(\uBE44\uBC00\uBC88\uD638)\uB85C \uBCF4\uD638\uB418\uC5B4 \uC788\uC5B4 \uC77D\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. PDF \uBDF0\uC5B4\uC5D0\uC11C \uC554\uD638\uB97C \uD574\uC81C\uD574 \uB2E4\uC2DC \uC800\uC7A5\uD558\uAC70\uB098, \uB0B4\uC6A9\uC744 \uD14D\uC2A4\uD2B8\uB85C \uBD99\uC5EC\uB123\uC5B4 \uC8FC\uC138\uC694."
94977
+ ],
94978
+ unsupported: true
94979
+ });
94980
+ }
94958
94981
  return base("unsupported", {
94959
94982
  bytes: buf.length,
94960
- warnings: [`PDF\uB97C \uC77D\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4(${errMsg(e)}). \uC554\uD638\uD654\uB418\uC5C8\uAC70\uB098 \uC190\uC0C1\uB41C PDF\uC77C \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uD14D\uC2A4\uD2B8\uB85C \uBD99\uC5EC\uB123\uC5B4 \uC8FC\uC138\uC694.`],
94983
+ warnings: [`PDF\uB97C \uC77D\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4(${errMsg(e)}). \uC190\uC0C1\uB418\uC5C8\uAC70\uB098 \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 PDF\uC77C \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uD14D\uC2A4\uD2B8\uB85C \uBD99\uC5EC\uB123\uC5B4 \uC8FC\uC138\uC694.`],
94961
94984
  unsupported: true
94962
94985
  });
94963
94986
  }
@@ -95523,13 +95546,12 @@ ${lines}`;
95523
95546
  name: "add_resume",
95524
95547
  title: "\uC774\uB825\uC11C/\uACBD\uB825\uAE30\uC220\uC11C \uCD94\uAC00",
95525
95548
  description: "\uC774\uB825\uC11C, \uACBD\uB825\uAE30\uC220\uC11C, \uD3EC\uD2B8\uD3F4\uB9AC\uC624 \uB4F1 \uBB38\uC11C\uB97C \uC800\uC7A5\uD569\uB2C8\uB2E4. content\uC5D0\uB294 \uC0AC\uC6A9\uC790\uAC00 \uC5C5\uB85C\uB4DC/\uBD99\uC5EC\uB123\uC740 \uD14D\uC2A4\uD2B8(\uB610\uB294 \uC815\uB9AC\uD55C Markdown)\uB97C \uB123\uC73C\uC138\uC694. kind \uAE30\uBCF8\uAC12\uC740 resume\uC785\uB2C8\uB2E4. is_primary=true\uB85C \uB300\uD45C \uBB38\uC11C\uB97C \uC9C0\uC815\uD558\uBA74 get_application_context\uC758 primary_resume\uB85C \uB178\uCD9C\uB429\uB2C8\uB2E4.",
95549
+ // Reuse the shared (length-bounded, whitespace-rejecting) Document schema so
95550
+ // the MCP ingestion path — the primary route for résumé text — inherits the
95551
+ // same caps as the web API. kind stays optional here (defaults to resume).
95526
95552
  inputSchema: {
95527
- title: external_exports.string().describe("\uBB38\uC11C \uC81C\uBAA9"),
95528
- content: external_exports.string().describe("\uBCF8\uBB38 (Markdown/\uC77C\uBC18 \uD14D\uC2A4\uD2B8)"),
95529
- kind: external_exports.enum(DOCUMENT_KINDS).optional().describe("resume(\uC774\uB825\uC11C)/career_description(\uACBD\uB825\uAE30\uC220\uC11C)/portfolio/other"),
95530
- source: external_exports.enum(CONTENT_SOURCES).optional(),
95531
- is_primary: external_exports.boolean().optional().describe("\uB300\uD45C \uBB38\uC11C \uC5EC\uBD80"),
95532
- tags: external_exports.array(external_exports.string()).optional()
95553
+ ...DocumentInputSchema.omit({ kind: true }).shape,
95554
+ kind: external_exports.enum(DOCUMENT_KINDS).optional().describe("resume(\uC774\uB825\uC11C)/career_description(\uACBD\uB825\uAE30\uC220\uC11C)/portfolio/other")
95533
95555
  },
95534
95556
  handler: (args) => {
95535
95557
  const doc = addResume(args);
package/dist/migrate.mjs CHANGED
@@ -4422,29 +4422,42 @@ function isSafeUrl(u) {
4422
4422
  return !/^[a-z][a-z0-9+.-]*:/i.test(s) || /^(https?:|mailto:)/i.test(s);
4423
4423
  }
4424
4424
  var UNSAFE_URL_MSG = "javascript: \uAC19\uC740 \uC704\uD5D8\uD55C \uB9C1\uD06C\uB294 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. http(s) \uB9C1\uD06C\uB97C \uC0AC\uC6A9\uD558\uC138\uC694.";
4425
- var SafeUrl = external_exports.string().min(1).refine(isSafeUrl, { message: UNSAFE_URL_MSG });
4426
- var SafeUrlOptional = external_exports.string().optional().refine((u) => u == null || u === "" || isSafeUrl(u), { message: UNSAFE_URL_MSG });
4425
+ var MAX_URL = 2e3;
4426
+ var SafeUrl = external_exports.string().min(1).max(MAX_URL).refine(isSafeUrl, { message: UNSAFE_URL_MSG });
4427
+ var SafeUrlOptional = external_exports.string().max(MAX_URL).optional().refine((u) => u == null || u === "" || isSafeUrl(u), { message: UNSAFE_URL_MSG });
4428
+ var MAX_LINE = 500;
4429
+ var MAX_NOTE = 1e4;
4430
+ var MAX_BODY = 2e5;
4431
+ var MAX_ITEM = 2e3;
4432
+ var MAX_ITEMS = 500;
4433
+ var EMPTY_MSG = "\uB0B4\uC6A9\uC774 \uBE44\uC5B4 \uC788\uC2B5\uB2C8\uB2E4(\uACF5\uBC31\uB9CC\uC73C\uB85C\uB294 \uC800\uC7A5\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4).";
4434
+ var reqLine = external_exports.string().trim().min(1).max(MAX_LINE);
4435
+ var optLine = external_exports.string().max(MAX_LINE).optional();
4436
+ var optNote = external_exports.string().max(MAX_NOTE).optional();
4437
+ var optBody = external_exports.string().max(MAX_BODY).optional();
4438
+ var reqBody = external_exports.string().max(MAX_BODY).refine((s) => s.trim().length > 0, { message: EMPTY_MSG });
4439
+ var strList = external_exports.array(external_exports.string().max(MAX_ITEM)).max(MAX_ITEMS);
4427
4440
  var baseRecord = {
4428
4441
  id,
4429
4442
  created_at: isoDateTime,
4430
4443
  updated_at: isoDateTime
4431
4444
  };
4432
4445
  var LinkSchema = external_exports.object({
4433
- label: external_exports.string().min(1),
4446
+ label: reqLine,
4434
4447
  url: SafeUrl
4435
4448
  });
4436
4449
  var ProfileInputSchema = external_exports.object({
4437
- name: external_exports.string().min(1).optional(),
4438
- email: external_exports.string().optional(),
4439
- phone: external_exports.string().optional(),
4440
- location: external_exports.string().optional(),
4441
- headline: external_exports.string().optional().describe("\uD55C \uC904 \uC18C\uAC1C / \uC9C1\uBB34 \uD0C0\uC774\uD2C0"),
4442
- summary: external_exports.string().optional().describe("\uC790\uAE30\uC18C\uAC1C \uC694\uC57D"),
4443
- desired_roles: external_exports.array(external_exports.string()).optional().describe("\uD76C\uB9DD \uC9C1\uBB34"),
4444
- desired_conditions: external_exports.string().optional().describe("\uD76C\uB9DD \uADFC\uBB34 \uC870\uAC74 (\uC5F0\uBD09, \uC9C0\uC5ED, \uADFC\uBB34\uD615\uD0DC \uB4F1)"),
4445
- preferred_tone: external_exports.string().optional().describe("\uC790\uAE30\uC18C\uAC1C\uC11C \uC120\uD638 \uBB38\uCCB4 (\uC608: \uB2F4\uBC31\uD558\uACE0 \uAD6C\uCCB4\uC801)"),
4446
- emphasis_points: external_exports.array(external_exports.string()).optional().describe("\uAC15\uC870\uD558\uACE0 \uC2F6\uC740 \uD575\uC2EC \uD3EC\uC778\uD2B8"),
4447
- links: external_exports.array(LinkSchema).optional().describe("\uD3EC\uD2B8\uD3F4\uB9AC\uC624/\uAE43\uD5C8\uBE0C/\uB9C1\uD06C\uB4DC\uC778 \uB4F1")
4450
+ name: reqLine.optional(),
4451
+ email: optLine,
4452
+ phone: optLine,
4453
+ location: optLine,
4454
+ headline: external_exports.string().max(MAX_LINE).optional().describe("\uD55C \uC904 \uC18C\uAC1C / \uC9C1\uBB34 \uD0C0\uC774\uD2C0"),
4455
+ summary: external_exports.string().max(MAX_NOTE).optional().describe("\uC790\uAE30\uC18C\uAC1C \uC694\uC57D"),
4456
+ desired_roles: strList.optional().describe("\uD76C\uB9DD \uC9C1\uBB34"),
4457
+ desired_conditions: external_exports.string().max(MAX_NOTE).optional().describe("\uD76C\uB9DD \uADFC\uBB34 \uC870\uAC74 (\uC5F0\uBD09, \uC9C0\uC5ED, \uADFC\uBB34\uD615\uD0DC \uB4F1)"),
4458
+ preferred_tone: external_exports.string().max(MAX_LINE).optional().describe("\uC790\uAE30\uC18C\uAC1C\uC11C \uC120\uD638 \uBB38\uCCB4 (\uC608: \uB2F4\uBC31\uD558\uACE0 \uAD6C\uCCB4\uC801)"),
4459
+ emphasis_points: strList.optional().describe("\uAC15\uC870\uD558\uACE0 \uC2F6\uC740 \uD575\uC2EC \uD3EC\uC778\uD2B8"),
4460
+ links: external_exports.array(LinkSchema).max(MAX_ITEMS).optional().describe("\uD3EC\uD2B8\uD3F4\uB9AC\uC624/\uAE43\uD5C8\uBE0C/\uB9C1\uD06C\uB4DC\uC778 \uB4F1")
4448
4461
  });
4449
4462
  var ProfileRecordSchema = external_exports.object({
4450
4463
  ...baseRecord,
@@ -4461,15 +4474,15 @@ var ProfileRecordSchema = external_exports.object({
4461
4474
  links: external_exports.array(LinkSchema)
4462
4475
  });
4463
4476
  var ExperienceInputSchema = external_exports.object({
4464
- company: external_exports.string().min(1),
4465
- role: external_exports.string().optional(),
4466
- employment_type: external_exports.string().optional().describe("\uC815\uADDC\uC9C1/\uACC4\uC57D\uC9C1/\uC778\uD134/\uD504\uB9AC\uB79C\uC11C \uB4F1"),
4467
- start_date: external_exports.string().optional().describe("YYYY-MM \uB610\uB294 YYYY-MM-DD"),
4468
- end_date: external_exports.string().optional().describe("\uC7AC\uC9C1 \uC911\uC774\uBA74 \uBE44\uC6CC\uB450\uAE30"),
4477
+ company: reqLine,
4478
+ role: optLine,
4479
+ employment_type: external_exports.string().max(MAX_LINE).optional().describe("\uC815\uADDC\uC9C1/\uACC4\uC57D\uC9C1/\uC778\uD134/\uD504\uB9AC\uB79C\uC11C \uB4F1"),
4480
+ start_date: external_exports.string().max(MAX_LINE).optional().describe("YYYY-MM \uB610\uB294 YYYY-MM-DD"),
4481
+ end_date: external_exports.string().max(MAX_LINE).optional().describe("\uC7AC\uC9C1 \uC911\uC774\uBA74 \uBE44\uC6CC\uB450\uAE30"),
4469
4482
  is_current: external_exports.boolean().optional(),
4470
- description: external_exports.string().optional(),
4471
- achievements: external_exports.array(external_exports.string()).optional().describe("\uC131\uACFC/\uC5C5\uC801 (\uC815\uB7C9 \uC9C0\uD45C \uAD8C\uC7A5)"),
4472
- tech: external_exports.array(external_exports.string()).optional().describe("\uC0AC\uC6A9 \uAE30\uC220/\uB3C4\uAD6C"),
4483
+ description: optBody,
4484
+ achievements: strList.optional().describe("\uC131\uACFC/\uC5C5\uC801 (\uC815\uB7C9 \uC9C0\uD45C \uAD8C\uC7A5)"),
4485
+ tech: strList.optional().describe("\uC0AC\uC6A9 \uAE30\uC220/\uB3C4\uAD6C"),
4473
4486
  order_index: external_exports.number().optional()
4474
4487
  });
4475
4488
  var ExperienceRecordSchema = external_exports.object({
@@ -4486,14 +4499,14 @@ var ExperienceRecordSchema = external_exports.object({
4486
4499
  order_index: external_exports.number()
4487
4500
  });
4488
4501
  var ProjectInputSchema = external_exports.object({
4489
- name: external_exports.string().min(1),
4490
- role: external_exports.string().optional(),
4491
- description: external_exports.string().optional(),
4492
- highlights: external_exports.array(external_exports.string()).optional(),
4493
- tech: external_exports.array(external_exports.string()).optional(),
4502
+ name: reqLine,
4503
+ role: optLine,
4504
+ description: optBody,
4505
+ highlights: strList.optional(),
4506
+ tech: strList.optional(),
4494
4507
  url: SafeUrlOptional,
4495
- start_date: external_exports.string().optional(),
4496
- end_date: external_exports.string().optional(),
4508
+ start_date: optLine,
4509
+ end_date: optLine,
4497
4510
  order_index: external_exports.number().optional()
4498
4511
  });
4499
4512
  var ProjectRecordSchema = external_exports.object({
@@ -4509,9 +4522,9 @@ var ProjectRecordSchema = external_exports.object({
4509
4522
  order_index: external_exports.number()
4510
4523
  });
4511
4524
  var SkillInputSchema = external_exports.object({
4512
- name: external_exports.string().min(1),
4513
- category: external_exports.string().optional().describe("\uC5B8\uC5B4/\uD504\uB808\uC784\uC6CC\uD06C/\uD234/\uC18C\uD504\uD2B8\uC2A4\uD0AC \uB4F1"),
4514
- level: external_exports.string().optional().describe("\uC0C1/\uC911/\uD558 \uB610\uB294 \uC790\uC720 \uC11C\uC220"),
4525
+ name: reqLine,
4526
+ category: external_exports.string().max(MAX_LINE).optional().describe("\uC5B8\uC5B4/\uD504\uB808\uC784\uC6CC\uD06C/\uD234/\uC18C\uD504\uD2B8\uC2A4\uD0AC \uB4F1"),
4527
+ level: external_exports.string().max(MAX_LINE).optional().describe("\uC0C1/\uC911/\uD558 \uB610\uB294 \uC790\uC720 \uC11C\uC220"),
4515
4528
  years: external_exports.number().optional(),
4516
4529
  order_index: external_exports.number().optional()
4517
4530
  });
@@ -4525,11 +4538,11 @@ var SkillRecordSchema = external_exports.object({
4525
4538
  });
4526
4539
  var DocumentInputSchema = external_exports.object({
4527
4540
  kind: external_exports.enum(DOCUMENT_KINDS),
4528
- title: external_exports.string().min(1),
4529
- content: external_exports.string().describe("Markdown \uB610\uB294 \uC77C\uBC18 \uD14D\uC2A4\uD2B8 \uBCF8\uBB38"),
4541
+ title: reqLine,
4542
+ content: reqBody.describe("Markdown \uB610\uB294 \uC77C\uBC18 \uD14D\uC2A4\uD2B8 \uBCF8\uBB38"),
4530
4543
  source: external_exports.enum(CONTENT_SOURCES).optional(),
4531
4544
  is_primary: external_exports.boolean().optional().describe("\uB300\uD45C \uBB38\uC11C \uC5EC\uBD80"),
4532
- tags: external_exports.array(external_exports.string()).optional()
4545
+ tags: strList.optional()
4533
4546
  });
4534
4547
  var DocumentRecordSchema = external_exports.object({
4535
4548
  ...baseRecord,
@@ -4541,19 +4554,19 @@ var DocumentRecordSchema = external_exports.object({
4541
4554
  tags: external_exports.array(external_exports.string())
4542
4555
  });
4543
4556
  var CoverLetterInputSchema = external_exports.object({
4544
- title: external_exports.string().min(1),
4545
- job_id: external_exports.string().optional().describe("\uD2B9\uC815 \uACF5\uACE0\uC5D0 \uC5F0\uACB0\uD560 \uACBD\uC6B0"),
4557
+ title: reqLine,
4558
+ job_id: optLine.describe("\uD2B9\uC815 \uACF5\uACE0\uC5D0 \uC5F0\uACB0\uD560 \uACBD\uC6B0"),
4546
4559
  is_primary: external_exports.boolean().optional(),
4547
- content: external_exports.string().optional().describe("\uCD08\uAE30 \uBC84\uC804 \uBCF8\uBB38 (\uC788\uC73C\uBA74 v1\uB85C \uC800\uC7A5)"),
4560
+ content: optBody.describe("\uCD08\uAE30 \uBC84\uC804 \uBCF8\uBB38 (\uC788\uC73C\uBA74 v1\uB85C \uC800\uC7A5)"),
4548
4561
  source: external_exports.enum(CONTENT_SOURCES).optional(),
4549
- note: external_exports.string().optional().describe("\uCD08\uAE30 \uBC84\uC804 \uBA54\uBAA8")
4562
+ note: optNote.describe("\uCD08\uAE30 \uBC84\uC804 \uBA54\uBAA8")
4550
4563
  });
4551
4564
  var CoverLetterVersionInputSchema = external_exports.object({
4552
- cover_letter_id: external_exports.string().optional().describe("\uAE30\uC874 \uC790\uAE30\uC18C\uAC1C\uC11C\uC5D0 \uC0C8 \uBC84\uC804 \uCD94\uAC00 \uC2DC"),
4553
- title: external_exports.string().optional().describe("\uC0C8 \uC790\uAE30\uC18C\uAC1C\uC11C\uB97C \uB9CC\uB4E4 \uB54C \uC81C\uBAA9"),
4554
- job_id: external_exports.string().optional(),
4555
- content: external_exports.string().min(1),
4556
- note: external_exports.string().optional().describe("\uC774 \uBC84\uC804\uC758 \uBCC0\uACBD \uC694\uC57D (\uC608: \uC9C0\uC6D0\uB3D9\uAE30 \uBCF4\uAC15)"),
4565
+ cover_letter_id: optLine.describe("\uAE30\uC874 \uC790\uAE30\uC18C\uAC1C\uC11C\uC5D0 \uC0C8 \uBC84\uC804 \uCD94\uAC00 \uC2DC"),
4566
+ title: external_exports.string().max(MAX_LINE).optional().describe("\uC0C8 \uC790\uAE30\uC18C\uAC1C\uC11C\uB97C \uB9CC\uB4E4 \uB54C \uC81C\uBAA9"),
4567
+ job_id: optLine,
4568
+ content: reqBody,
4569
+ note: optNote.describe("\uC774 \uBC84\uC804\uC758 \uBCC0\uACBD \uC694\uC57D (\uC608: \uC9C0\uC6D0\uB3D9\uAE30 \uBCF4\uAC15)"),
4557
4570
  source: external_exports.enum(CONTENT_SOURCES).optional(),
4558
4571
  set_current: external_exports.boolean().optional().describe("\uC774 \uBC84\uC804\uC744 \uD604\uC7AC \uBC84\uC804\uC73C\uB85C \uC9C0\uC815 (\uAE30\uBCF8 true)")
4559
4572
  });
@@ -4577,16 +4590,16 @@ var CoverLetterRecordSchema = external_exports.object({
4577
4590
  versions: external_exports.array(CoverLetterVersionRecordSchema).optional()
4578
4591
  });
4579
4592
  var JobInputSchema = external_exports.object({
4580
- company: external_exports.string().min(1),
4581
- position: external_exports.string().min(1).describe("\uC9C1\uBB34/\uD3EC\uC9C0\uC158\uBA85"),
4593
+ company: reqLine,
4594
+ position: reqLine.describe("\uC9C1\uBB34/\uD3EC\uC9C0\uC158\uBA85"),
4582
4595
  url: SafeUrlOptional,
4583
- location: external_exports.string().optional(),
4584
- employment_type: external_exports.string().optional(),
4585
- description: external_exports.string().optional().describe("\uACF5\uACE0 \uC6D0\uBB38 \uB610\uB294 \uC815\uB9AC\uB41C \uD14D\uC2A4\uD2B8"),
4586
- requirements: external_exports.array(external_exports.string()).optional().describe("\uC790\uACA9\uC694\uAC74/\uC6B0\uB300\uC0AC\uD56D \uD575\uC2EC"),
4587
- keywords: external_exports.array(external_exports.string()).optional().describe("\uD575\uC2EC \uD0A4\uC6CC\uB4DC"),
4588
- deadline: external_exports.string().optional().describe("\uB9C8\uAC10\uC77C YYYY-MM-DD"),
4589
- source: external_exports.string().optional().describe("\uCD9C\uCC98 (\uC0AC\uB78C\uC778/\uC6D0\uD2F0\uB4DC/\uC9C1\uC811 \uC785\uB825 \uB4F1)")
4596
+ location: optLine,
4597
+ employment_type: optLine,
4598
+ description: optBody.describe("\uACF5\uACE0 \uC6D0\uBB38 \uB610\uB294 \uC815\uB9AC\uB41C \uD14D\uC2A4\uD2B8"),
4599
+ requirements: strList.optional().describe("\uC790\uACA9\uC694\uAC74/\uC6B0\uB300\uC0AC\uD56D \uD575\uC2EC"),
4600
+ keywords: strList.optional().describe("\uD575\uC2EC \uD0A4\uC6CC\uB4DC"),
4601
+ deadline: external_exports.string().max(MAX_LINE).optional().describe("\uB9C8\uAC10\uC77C YYYY-MM-DD"),
4602
+ source: external_exports.string().max(MAX_LINE).optional().describe("\uCD9C\uCC98 (\uC0AC\uB78C\uC778/\uC6D0\uD2F0\uB4DC/\uC9C1\uC811 \uC785\uB825 \uB4F1)")
4590
4603
  });
4591
4604
  var JobRecordSchema = external_exports.object({
4592
4605
  ...baseRecord,
@@ -4602,14 +4615,14 @@ var JobRecordSchema = external_exports.object({
4602
4615
  source: external_exports.string().nullable()
4603
4616
  });
4604
4617
  var FitAnalysisInputSchema = external_exports.object({
4605
- job_id: external_exports.string().describe("\uBD84\uC11D \uB300\uC0C1 \uACF5\uACE0 ID"),
4618
+ job_id: reqLine.describe("\uBD84\uC11D \uB300\uC0C1 \uACF5\uACE0 ID"),
4606
4619
  score: external_exports.number().min(0).max(100).optional().describe("\uC885\uD569 \uC801\uD569\uB3C4 0~100"),
4607
- summary: external_exports.string().optional().describe("\uD55C\uB450 \uBB38\uB2E8 \uC694\uC57D"),
4608
- strengths: external_exports.array(external_exports.string()).optional().describe("\uAC15\uC810 / \uC798 \uB9DE\uB294 \uBD80\uBD84"),
4609
- gaps: external_exports.array(external_exports.string()).optional().describe("\uBD80\uC871\uD55C \uBD80\uBD84 / \uBCF4\uC644 \uD544\uC694"),
4610
- matched_keywords: external_exports.array(external_exports.string()).optional(),
4611
- missing_keywords: external_exports.array(external_exports.string()).optional(),
4612
- recommendations: external_exports.array(external_exports.string()).optional().describe("\uC790\uAE30\uC18C\uAC1C\uC11C/\uC9C0\uC6D0 \uC804\uB7B5 \uC81C\uC548")
4620
+ summary: external_exports.string().max(MAX_NOTE).optional().describe("\uD55C\uB450 \uBB38\uB2E8 \uC694\uC57D"),
4621
+ strengths: strList.optional().describe("\uAC15\uC810 / \uC798 \uB9DE\uB294 \uBD80\uBD84"),
4622
+ gaps: strList.optional().describe("\uBD80\uC871\uD55C \uBD80\uBD84 / \uBCF4\uC644 \uD544\uC694"),
4623
+ matched_keywords: strList.optional(),
4624
+ missing_keywords: strList.optional(),
4625
+ recommendations: strList.optional().describe("\uC790\uAE30\uC18C\uAC1C\uC11C/\uC9C0\uC6D0 \uC804\uB7B5 \uC81C\uC548")
4613
4626
  });
4614
4627
  var FitAnalysisRecordSchema = external_exports.object({
4615
4628
  ...baseRecord,
@@ -4623,18 +4636,18 @@ var FitAnalysisRecordSchema = external_exports.object({
4623
4636
  recommendations: external_exports.array(external_exports.string())
4624
4637
  });
4625
4638
  var ApplicationInputSchema = external_exports.object({
4626
- job_id: external_exports.string(),
4639
+ job_id: reqLine,
4627
4640
  status: external_exports.enum(APPLICATION_STATUSES).optional(),
4628
- resume_id: external_exports.string().optional(),
4629
- cover_letter_id: external_exports.string().optional(),
4630
- applied_at: external_exports.string().optional(),
4631
- notes: external_exports.string().optional()
4641
+ resume_id: optLine,
4642
+ cover_letter_id: optLine,
4643
+ applied_at: optLine,
4644
+ notes: optNote
4632
4645
  });
4633
4646
  var ApplicationStatusUpdateSchema = external_exports.object({
4634
- job_id: external_exports.string().optional(),
4635
- application_id: external_exports.string().optional(),
4647
+ job_id: optLine,
4648
+ application_id: optLine,
4636
4649
  status: external_exports.enum(APPLICATION_STATUSES),
4637
- note: external_exports.string().optional().describe("\uC0C1\uD0DC \uBCC0\uACBD \uC0AC\uC720/\uBA54\uBAA8")
4650
+ note: optNote.describe("\uC0C1\uD0DC \uBCC0\uACBD \uC0AC\uC720/\uBA54\uBAA8")
4638
4651
  });
4639
4652
  var ApplicationRecordSchema = external_exports.object({
4640
4653
  ...baseRecord,
@@ -4646,24 +4659,24 @@ var ApplicationRecordSchema = external_exports.object({
4646
4659
  notes: external_exports.string().nullable()
4647
4660
  });
4648
4661
  var StarGuideSchema = external_exports.object({
4649
- question: external_exports.string(),
4650
- situation: external_exports.string().optional(),
4651
- task: external_exports.string().optional(),
4652
- action: external_exports.string().optional(),
4653
- result: external_exports.string().optional()
4662
+ question: external_exports.string().max(MAX_NOTE),
4663
+ situation: optNote,
4664
+ task: optNote,
4665
+ action: optNote,
4666
+ result: optNote
4654
4667
  });
4655
4668
  var InterviewQuestionSchema = external_exports.object({
4656
- question: external_exports.string(),
4657
- intent: external_exports.string().optional().describe("\uC9C8\uBB38 \uC758\uB3C4"),
4658
- followups: external_exports.array(external_exports.string()).optional().describe("\uC608\uC0C1 \uAF2C\uB9AC \uC9C8\uBB38"),
4659
- answer_outline: external_exports.string().optional().describe("\uB2F5\uBCC0 \uAC00\uC774\uB4DC/\uD575\uC2EC \uD3EC\uC778\uD2B8")
4669
+ question: external_exports.string().max(MAX_NOTE),
4670
+ intent: external_exports.string().max(MAX_NOTE).optional().describe("\uC9C8\uBB38 \uC758\uB3C4"),
4671
+ followups: strList.optional().describe("\uC608\uC0C1 \uAF2C\uB9AC \uC9C8\uBB38"),
4672
+ answer_outline: optBody.describe("\uB2F5\uBCC0 \uAC00\uC774\uB4DC/\uD575\uC2EC \uD3EC\uC778\uD2B8")
4660
4673
  });
4661
4674
  var InterviewPrepInputSchema = external_exports.object({
4662
- job_id: external_exports.string(),
4663
- questions: external_exports.array(InterviewQuestionSchema).optional(),
4664
- star_guides: external_exports.array(StarGuideSchema).optional(),
4665
- self_introduction: external_exports.string().optional().describe("1\uBD84 \uC790\uAE30\uC18C\uAC1C \uCD08\uC548"),
4666
- notes: external_exports.string().optional().describe("\uBA74\uC811 \uD6C4\uAE30/\uBA54\uBAA8")
4675
+ job_id: reqLine,
4676
+ questions: external_exports.array(InterviewQuestionSchema).max(MAX_ITEMS).optional(),
4677
+ star_guides: external_exports.array(StarGuideSchema).max(MAX_ITEMS).optional(),
4678
+ self_introduction: optBody.describe("1\uBD84 \uC790\uAE30\uC18C\uAC1C \uCD08\uC548"),
4679
+ notes: optNote.describe("\uBA74\uC811 \uD6C4\uAE30/\uBA54\uBAA8")
4667
4680
  });
4668
4681
  var InterviewPrepRecordSchema = external_exports.object({
4669
4682
  ...baseRecord,