@task-mcp/shared 1.0.4 → 1.0.7

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 (98) hide show
  1. package/dist/algorithms/critical-path.d.ts.map +1 -1
  2. package/dist/algorithms/critical-path.js +50 -26
  3. package/dist/algorithms/critical-path.js.map +1 -1
  4. package/dist/algorithms/dependency-integrity.d.ts +73 -0
  5. package/dist/algorithms/dependency-integrity.d.ts.map +1 -0
  6. package/dist/algorithms/dependency-integrity.js +189 -0
  7. package/dist/algorithms/dependency-integrity.js.map +1 -0
  8. package/dist/algorithms/index.d.ts +2 -0
  9. package/dist/algorithms/index.d.ts.map +1 -1
  10. package/dist/algorithms/index.js +2 -0
  11. package/dist/algorithms/index.js.map +1 -1
  12. package/dist/algorithms/tech-analysis.d.ts +106 -0
  13. package/dist/algorithms/tech-analysis.d.ts.map +1 -0
  14. package/dist/algorithms/tech-analysis.js +296 -0
  15. package/dist/algorithms/tech-analysis.js.map +1 -0
  16. package/dist/algorithms/tech-analysis.test.d.ts +2 -0
  17. package/dist/algorithms/tech-analysis.test.d.ts.map +1 -0
  18. package/dist/algorithms/tech-analysis.test.js +338 -0
  19. package/dist/algorithms/tech-analysis.test.js.map +1 -0
  20. package/dist/algorithms/topological-sort.d.ts.map +1 -1
  21. package/dist/algorithms/topological-sort.js +60 -8
  22. package/dist/algorithms/topological-sort.js.map +1 -1
  23. package/dist/schemas/inbox.d.ts +55 -0
  24. package/dist/schemas/inbox.d.ts.map +1 -0
  25. package/dist/schemas/inbox.js +25 -0
  26. package/dist/schemas/inbox.js.map +1 -0
  27. package/dist/schemas/index.d.ts +3 -1
  28. package/dist/schemas/index.d.ts.map +1 -1
  29. package/dist/schemas/index.js +9 -1
  30. package/dist/schemas/index.js.map +1 -1
  31. package/dist/schemas/project.d.ts +154 -41
  32. package/dist/schemas/project.d.ts.map +1 -1
  33. package/dist/schemas/project.js +38 -33
  34. package/dist/schemas/project.js.map +1 -1
  35. package/dist/schemas/response-format.d.ts +80 -0
  36. package/dist/schemas/response-format.d.ts.map +1 -0
  37. package/dist/schemas/response-format.js +17 -0
  38. package/dist/schemas/response-format.js.map +1 -0
  39. package/dist/schemas/task.d.ts +592 -94
  40. package/dist/schemas/task.d.ts.map +1 -1
  41. package/dist/schemas/task.js +124 -64
  42. package/dist/schemas/task.js.map +1 -1
  43. package/dist/schemas/view.d.ts +128 -37
  44. package/dist/schemas/view.d.ts.map +1 -1
  45. package/dist/schemas/view.js +38 -24
  46. package/dist/schemas/view.js.map +1 -1
  47. package/dist/utils/date.d.ts.map +1 -1
  48. package/dist/utils/date.js +17 -2
  49. package/dist/utils/date.js.map +1 -1
  50. package/dist/utils/hierarchy.d.ts +75 -0
  51. package/dist/utils/hierarchy.d.ts.map +1 -0
  52. package/dist/utils/hierarchy.js +179 -0
  53. package/dist/utils/hierarchy.js.map +1 -0
  54. package/dist/utils/id.d.ts +51 -1
  55. package/dist/utils/id.d.ts.map +1 -1
  56. package/dist/utils/id.js +124 -4
  57. package/dist/utils/id.js.map +1 -1
  58. package/dist/utils/id.test.d.ts +2 -0
  59. package/dist/utils/id.test.d.ts.map +1 -0
  60. package/dist/utils/id.test.js +228 -0
  61. package/dist/utils/id.test.js.map +1 -0
  62. package/dist/utils/index.d.ts +4 -2
  63. package/dist/utils/index.d.ts.map +1 -1
  64. package/dist/utils/index.js +7 -2
  65. package/dist/utils/index.js.map +1 -1
  66. package/dist/utils/natural-language.d.ts +45 -0
  67. package/dist/utils/natural-language.d.ts.map +1 -1
  68. package/dist/utils/natural-language.js +86 -0
  69. package/dist/utils/natural-language.js.map +1 -1
  70. package/dist/utils/projection.d.ts +65 -0
  71. package/dist/utils/projection.d.ts.map +1 -0
  72. package/dist/utils/projection.js +181 -0
  73. package/dist/utils/projection.js.map +1 -0
  74. package/dist/utils/projection.test.d.ts +2 -0
  75. package/dist/utils/projection.test.d.ts.map +1 -0
  76. package/dist/utils/projection.test.js +400 -0
  77. package/dist/utils/projection.test.js.map +1 -0
  78. package/package.json +2 -2
  79. package/src/algorithms/critical-path.ts +56 -24
  80. package/src/algorithms/dependency-integrity.ts +270 -0
  81. package/src/algorithms/index.ts +28 -0
  82. package/src/algorithms/tech-analysis.test.ts +413 -0
  83. package/src/algorithms/tech-analysis.ts +412 -0
  84. package/src/algorithms/topological-sort.ts +66 -9
  85. package/src/schemas/inbox.ts +32 -0
  86. package/src/schemas/index.ts +31 -0
  87. package/src/schemas/project.ts +43 -40
  88. package/src/schemas/response-format.ts +108 -0
  89. package/src/schemas/task.ts +145 -77
  90. package/src/schemas/view.ts +43 -33
  91. package/src/utils/date.ts +18 -2
  92. package/src/utils/hierarchy.ts +224 -0
  93. package/src/utils/id.test.ts +281 -0
  94. package/src/utils/id.ts +139 -4
  95. package/src/utils/index.ts +46 -2
  96. package/src/utils/natural-language.ts +113 -0
  97. package/src/utils/projection.test.ts +505 -0
  98. package/src/utils/projection.ts +251 -0
@@ -0,0 +1,228 @@
1
+ import { describe, test, expect } from "bun:test";
2
+ import { generateId, generateTaskId, generateProjectId, generateInboxId, isValidTaskId, isValidProjectId, isValidInboxId, validateTaskId, validateProjectId, validateInboxId, assertValidTaskId, assertValidProjectId, assertValidInboxId, InvalidIdError, } from "./id.js";
3
+ describe("ID Generation", () => {
4
+ describe("generateId", () => {
5
+ test("generates ID without prefix", () => {
6
+ const id = generateId();
7
+ expect(id.length).toBe(12);
8
+ expect(/^[a-z0-9]+$/.test(id)).toBe(true);
9
+ });
10
+ test("generates ID with prefix", () => {
11
+ const id = generateId("test");
12
+ expect(id).toMatch(/^test_[a-z0-9]+$/);
13
+ });
14
+ test("generates unique IDs", () => {
15
+ const ids = new Set(Array.from({ length: 100 }, () => generateId("test")));
16
+ expect(ids.size).toBe(100);
17
+ });
18
+ });
19
+ describe("generateTaskId", () => {
20
+ test("generates task ID with correct prefix", () => {
21
+ const id = generateTaskId();
22
+ expect(id).toMatch(/^task_[a-z0-9]+$/);
23
+ });
24
+ });
25
+ describe("generateProjectId", () => {
26
+ test("generates project ID with correct prefix", () => {
27
+ const id = generateProjectId();
28
+ expect(id).toMatch(/^proj_[a-z0-9]+$/);
29
+ });
30
+ });
31
+ describe("generateInboxId", () => {
32
+ test("generates inbox ID with correct prefix", () => {
33
+ const id = generateInboxId();
34
+ expect(id).toMatch(/^inbox_[a-z0-9]+$/);
35
+ });
36
+ });
37
+ });
38
+ describe("Simple ID Validation (boolean)", () => {
39
+ describe("isValidTaskId", () => {
40
+ test("returns true for valid task IDs", () => {
41
+ expect(isValidTaskId("task_abc123")).toBe(true);
42
+ expect(isValidTaskId("task_a")).toBe(true);
43
+ expect(isValidTaskId("task_123")).toBe(true);
44
+ expect(isValidTaskId("task_abc123def456")).toBe(true);
45
+ });
46
+ test("returns false for invalid task IDs", () => {
47
+ expect(isValidTaskId("")).toBe(false);
48
+ expect(isValidTaskId("task_")).toBe(false);
49
+ expect(isValidTaskId("abc123")).toBe(false);
50
+ expect(isValidTaskId("proj_abc123")).toBe(false);
51
+ expect(isValidTaskId("task_ABC123")).toBe(false);
52
+ expect(isValidTaskId("task_abc-123")).toBe(false);
53
+ expect(isValidTaskId("task_abc.123")).toBe(false);
54
+ expect(isValidTaskId("task_abc/123")).toBe(false);
55
+ expect(isValidTaskId("task_abc 123")).toBe(false);
56
+ });
57
+ });
58
+ describe("isValidProjectId", () => {
59
+ test("returns true for valid project IDs", () => {
60
+ expect(isValidProjectId("proj_abc123")).toBe(true);
61
+ expect(isValidProjectId("proj_a")).toBe(true);
62
+ });
63
+ test("returns false for invalid project IDs", () => {
64
+ expect(isValidProjectId("")).toBe(false);
65
+ expect(isValidProjectId("project_abc123")).toBe(false);
66
+ expect(isValidProjectId("task_abc123")).toBe(false);
67
+ });
68
+ });
69
+ describe("isValidInboxId", () => {
70
+ test("returns true for valid inbox IDs", () => {
71
+ expect(isValidInboxId("inbox_abc123")).toBe(true);
72
+ expect(isValidInboxId("inbox_a")).toBe(true);
73
+ });
74
+ test("returns false for invalid inbox IDs", () => {
75
+ expect(isValidInboxId("")).toBe(false);
76
+ expect(isValidInboxId("in_abc123")).toBe(false);
77
+ expect(isValidInboxId("task_abc123")).toBe(false);
78
+ });
79
+ });
80
+ });
81
+ describe("Detailed ID Validation", () => {
82
+ describe("validateTaskId", () => {
83
+ test("returns valid: true for valid task IDs", () => {
84
+ expect(validateTaskId("task_abc123")).toEqual({ valid: true });
85
+ expect(validateTaskId("task_a1b2c3")).toEqual({ valid: true });
86
+ });
87
+ test("returns error for null/undefined", () => {
88
+ const result = validateTaskId(null);
89
+ expect(result.valid).toBe(false);
90
+ expect(result.reason).toContain("required");
91
+ const result2 = validateTaskId(undefined);
92
+ expect(result2.valid).toBe(false);
93
+ });
94
+ test("returns error for non-string", () => {
95
+ const result = validateTaskId(123);
96
+ expect(result.valid).toBe(false);
97
+ expect(result.reason).toContain("string");
98
+ expect(result.reason).toContain("number");
99
+ });
100
+ test("returns error for empty string", () => {
101
+ const result = validateTaskId("");
102
+ expect(result.valid).toBe(false);
103
+ expect(result.reason).toContain("empty");
104
+ });
105
+ test("returns error for missing prefix", () => {
106
+ const result = validateTaskId("abc123");
107
+ expect(result.valid).toBe(false);
108
+ expect(result.reason).toContain("task_");
109
+ });
110
+ test("returns error for wrong prefix", () => {
111
+ const result = validateTaskId("proj_abc123");
112
+ expect(result.valid).toBe(false);
113
+ expect(result.reason).toContain("task_");
114
+ });
115
+ test("returns error for invalid characters", () => {
116
+ const result = validateTaskId("task_abc-123");
117
+ expect(result.valid).toBe(false);
118
+ expect(result.reason).toContain("invalid characters");
119
+ });
120
+ });
121
+ describe("validateProjectId", () => {
122
+ test("returns valid: true for valid project IDs", () => {
123
+ expect(validateProjectId("proj_abc123")).toEqual({ valid: true });
124
+ });
125
+ test("returns error for missing prefix", () => {
126
+ const result = validateProjectId("project_abc");
127
+ expect(result.valid).toBe(false);
128
+ expect(result.reason).toContain("proj_");
129
+ });
130
+ });
131
+ describe("validateInboxId", () => {
132
+ test("returns valid: true for valid inbox IDs", () => {
133
+ expect(validateInboxId("inbox_abc123")).toEqual({ valid: true });
134
+ });
135
+ test("returns error for missing prefix", () => {
136
+ const result = validateInboxId("in_abc");
137
+ expect(result.valid).toBe(false);
138
+ expect(result.reason).toContain("inbox_");
139
+ });
140
+ });
141
+ });
142
+ describe("Assert Functions", () => {
143
+ describe("assertValidTaskId", () => {
144
+ test("does not throw for valid ID", () => {
145
+ expect(() => assertValidTaskId("task_abc123")).not.toThrow();
146
+ });
147
+ test("throws InvalidIdError for invalid ID", () => {
148
+ expect(() => assertValidTaskId("")).toThrow(InvalidIdError);
149
+ expect(() => assertValidTaskId("abc123")).toThrow(InvalidIdError);
150
+ expect(() => assertValidTaskId(null)).toThrow(InvalidIdError);
151
+ });
152
+ test("InvalidIdError contains correct properties", () => {
153
+ try {
154
+ assertValidTaskId("invalid");
155
+ }
156
+ catch (error) {
157
+ expect(error).toBeInstanceOf(InvalidIdError);
158
+ if (error instanceof InvalidIdError) {
159
+ expect(error.idType).toBe("task");
160
+ expect(error.invalidValue).toBe("invalid");
161
+ expect(error.reason).toBeDefined();
162
+ expect(error.message).toContain("task");
163
+ }
164
+ }
165
+ });
166
+ });
167
+ describe("assertValidProjectId", () => {
168
+ test("does not throw for valid ID", () => {
169
+ expect(() => assertValidProjectId("proj_abc123")).not.toThrow();
170
+ });
171
+ test("throws InvalidIdError for invalid ID", () => {
172
+ expect(() => assertValidProjectId("project_abc")).toThrow(InvalidIdError);
173
+ });
174
+ });
175
+ describe("assertValidInboxId", () => {
176
+ test("does not throw for valid ID", () => {
177
+ expect(() => assertValidInboxId("inbox_abc123")).not.toThrow();
178
+ });
179
+ test("throws InvalidIdError for invalid ID", () => {
180
+ expect(() => assertValidInboxId("in_abc")).toThrow(InvalidIdError);
181
+ });
182
+ });
183
+ });
184
+ describe("InvalidIdError", () => {
185
+ test("extends Error", () => {
186
+ const error = new InvalidIdError("task", "bad_id", "test reason");
187
+ expect(error).toBeInstanceOf(Error);
188
+ expect(error).toBeInstanceOf(InvalidIdError);
189
+ });
190
+ test("has correct name", () => {
191
+ const error = new InvalidIdError("task", "bad_id", "test reason");
192
+ expect(error.name).toBe("InvalidIdError");
193
+ });
194
+ test("has correct message format", () => {
195
+ const error = new InvalidIdError("task", "bad_id", "test reason");
196
+ expect(error.message).toBe("Invalid task ID: test reason");
197
+ });
198
+ test("exposes idType, invalidValue, and reason", () => {
199
+ const error = new InvalidIdError("project", "wrong", "missing prefix");
200
+ expect(error.idType).toBe("project");
201
+ expect(error.invalidValue).toBe("wrong");
202
+ expect(error.reason).toBe("missing prefix");
203
+ });
204
+ });
205
+ describe("Security: ID Injection Prevention", () => {
206
+ test("rejects path traversal attempts", () => {
207
+ expect(validateTaskId("task_../etc/passwd").valid).toBe(false);
208
+ expect(validateTaskId("task_..%2F..%2Fetc").valid).toBe(false);
209
+ });
210
+ test("rejects null bytes", () => {
211
+ expect(validateTaskId("task_abc\0def").valid).toBe(false);
212
+ });
213
+ test("rejects SQL injection attempts", () => {
214
+ expect(validateTaskId("task_'; DROP TABLE tasks;--").valid).toBe(false);
215
+ expect(validateTaskId("task_1 OR 1=1").valid).toBe(false);
216
+ });
217
+ test("rejects script injection attempts", () => {
218
+ expect(validateTaskId("task_<script>alert(1)</script>").valid).toBe(false);
219
+ });
220
+ test("only allows safe alphanumeric characters", () => {
221
+ // The regex ^task_[a-z0-9]+$ only allows lowercase letters and numbers
222
+ expect(validateTaskId("task_abc123").valid).toBe(true);
223
+ expect(validateTaskId("task_UPPERCASE").valid).toBe(false);
224
+ expect(validateTaskId("task_with_underscore").valid).toBe(false);
225
+ expect(validateTaskId("task_with-dash").valid).toBe(false);
226
+ });
227
+ });
228
+ //# sourceMappingURL=id.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.test.js","sourceRoot":"","sources":["../../src/utils/id.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
- export { generateId, generateTaskId, generateProjectId, generateViewId, isValidProjectId, isValidTaskId } from "./id.js";
1
+ export { generateId, generateTaskId, generateProjectId, generateViewId, isValidProjectId, isValidTaskId, generateInboxId, isValidInboxId, InvalidIdError, type IdValidationResult, validateTaskId, validateProjectId, validateInboxId, assertValidTaskId, assertValidProjectId, assertValidInboxId, } from "./id.js";
2
2
  export { now, parseRelativeDate, formatDate, formatDisplayDate, isToday, isPastDue, isWithinDays } from "./date.js";
3
- export { parseTaskInput } from "./natural-language.js";
3
+ export { parseTaskInput, parseInboxInput, parseInput, type ParseTarget, type ParsedInput } from "./natural-language.js";
4
+ export { MAX_HIERARCHY_DEPTH, getTaskLevel, validateHierarchyDepth, getAncestorIds, getDescendantIds, getChildTasks, getRootTask, buildTaskTree, type TaskTreeNode, } from "./hierarchy.js";
5
+ export { projectTask, projectTasks, projectTasksPaginated, projectProject, projectProjects, projectInboxItem, projectInboxItems, formatResponse, applyPagination, truncate, summarizeList, } from "./projection.js";
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,iBAAiB,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACzH,OAAO,EAAE,GAAG,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACpH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,cAAc,EAEd,cAAc,EACd,KAAK,kBAAkB,EACvB,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,GAAG,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACpH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACxH,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,sBAAsB,EACtB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,aAAa,EACb,KAAK,YAAY,GAClB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,WAAW,EACX,YAAY,EACZ,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,QAAQ,EACR,aAAa,GACd,MAAM,iBAAiB,CAAC"}
@@ -1,4 +1,9 @@
1
- export { generateId, generateTaskId, generateProjectId, generateViewId, isValidProjectId, isValidTaskId } from "./id.js";
1
+ export { generateId, generateTaskId, generateProjectId, generateViewId, isValidProjectId, isValidTaskId, generateInboxId, isValidInboxId,
2
+ // Validation utilities with detailed error information
3
+ InvalidIdError, validateTaskId, validateProjectId, validateInboxId, assertValidTaskId, assertValidProjectId, assertValidInboxId, } from "./id.js";
2
4
  export { now, parseRelativeDate, formatDate, formatDisplayDate, isToday, isPastDue, isWithinDays } from "./date.js";
3
- export { parseTaskInput } from "./natural-language.js";
5
+ export { parseTaskInput, parseInboxInput, parseInput } from "./natural-language.js";
6
+ export { MAX_HIERARCHY_DEPTH, getTaskLevel, validateHierarchyDepth, getAncestorIds, getDescendantIds, getChildTasks, getRootTask, buildTaskTree, } from "./hierarchy.js";
7
+ // Projection utilities (token optimization)
8
+ export { projectTask, projectTasks, projectTasksPaginated, projectProject, projectProjects, projectInboxItem, projectInboxItems, formatResponse, applyPagination, truncate, summarizeList, } from "./projection.js";
4
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,iBAAiB,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACzH,OAAO,EAAE,GAAG,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACpH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,cAAc;AACd,uDAAuD;AACvD,cAAc,EAEd,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,GAAG,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACpH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAsC,MAAM,uBAAuB,CAAC;AACxH,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,sBAAsB,EACtB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,aAAa,GAEd,MAAM,gBAAgB,CAAC;AAExB,4CAA4C;AAC5C,OAAO,EACL,WAAW,EACX,YAAY,EACZ,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,QAAQ,EACR,aAAa,GACd,MAAM,iBAAiB,CAAC"}
@@ -1,4 +1,49 @@
1
1
  import type { TaskCreateInput } from "../schemas/task.js";
2
+ import type { InboxCreateInput } from "../schemas/inbox.js";
3
+ /**
4
+ * Maximum allowed input length for natural language parsing.
5
+ * Prevents DoS attacks from extremely long input strings.
6
+ */
7
+ export declare const MAX_INPUT_LENGTH = 1000;
8
+ /**
9
+ * Error thrown when input validation fails
10
+ */
11
+ export declare class InputValidationError extends Error {
12
+ constructor(message: string);
13
+ }
14
+ /**
15
+ * Target type for parsed input
16
+ */
17
+ export type ParseTarget = "task" | "inbox";
18
+ /**
19
+ * Extended parse result with target information
20
+ */
21
+ export interface ParsedInput {
22
+ target: ParseTarget;
23
+ task?: TaskCreateInput;
24
+ inbox?: InboxCreateInput;
25
+ }
26
+ /**
27
+ * Parse natural language input with target detection
28
+ *
29
+ * Target keywords:
30
+ * - >>inbox, >>메모, >>아이디어 → capture to inbox
31
+ * - >>task, >>태스크 (default) → create task
32
+ *
33
+ * Examples:
34
+ * - "API 리팩토링 아이디어 >>inbox #backend"
35
+ * - "Review PR tomorrow #dev !high" (default: task)
36
+ * - "새 기능 구상 >>메모"
37
+ */
38
+ export declare function parseInput(input: string): ParsedInput;
39
+ /**
40
+ * Parse natural language inbox input
41
+ *
42
+ * Examples:
43
+ * - "GraphQL 도입 검토 #backend #연구"
44
+ * - "성능 개선 아이디어 #performance"
45
+ */
46
+ export declare function parseInboxInput(input: string): InboxCreateInput;
2
47
  /**
3
48
  * Parse natural language task input
4
49
  *
@@ -1 +1 @@
1
- {"version":3,"file":"natural-language.d.ts","sourceRoot":"","sources":["../../src/utils/natural-language.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGpE;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CA6F7D"}
1
+ {"version":3,"file":"natural-language.d.ts","sourceRoot":"","sources":["../../src/utils/natural-language.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG5D;;;GAGG;AACH,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAcD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CA4BrD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAkB/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CA8F7D"}
@@ -1,4 +1,89 @@
1
1
  import { parseRelativeDate, formatDate } from "./date.js";
2
+ /**
3
+ * Maximum allowed input length for natural language parsing.
4
+ * Prevents DoS attacks from extremely long input strings.
5
+ */
6
+ export const MAX_INPUT_LENGTH = 1000;
7
+ /**
8
+ * Error thrown when input validation fails
9
+ */
10
+ export class InputValidationError extends Error {
11
+ constructor(message) {
12
+ super(message);
13
+ this.name = "InputValidationError";
14
+ }
15
+ }
16
+ /**
17
+ * Validates input string length
18
+ * @throws {InputValidationError} if input exceeds MAX_INPUT_LENGTH
19
+ */
20
+ function validateInputLength(input) {
21
+ if (input.length > MAX_INPUT_LENGTH) {
22
+ throw new InputValidationError(`Input exceeds maximum length of ${MAX_INPUT_LENGTH} characters (received ${input.length})`);
23
+ }
24
+ }
25
+ /**
26
+ * Parse natural language input with target detection
27
+ *
28
+ * Target keywords:
29
+ * - >>inbox, >>메모, >>아이디어 → capture to inbox
30
+ * - >>task, >>태스크 (default) → create task
31
+ *
32
+ * Examples:
33
+ * - "API 리팩토링 아이디어 >>inbox #backend"
34
+ * - "Review PR tomorrow #dev !high" (default: task)
35
+ * - "새 기능 구상 >>메모"
36
+ */
37
+ export function parseInput(input) {
38
+ validateInputLength(input);
39
+ let remaining = input.trim();
40
+ let target = "task";
41
+ // Detect target keywords (>>inbox, >>task, >>메모, >>아이디어, >>태스크)
42
+ const targetMatch = remaining.match(/>>(inbox|task|메모|아이디어|태스크)/i);
43
+ if (targetMatch) {
44
+ const keyword = targetMatch[1].toLowerCase();
45
+ if (keyword === "inbox" || keyword === "메모" || keyword === "아이디어") {
46
+ target = "inbox";
47
+ }
48
+ else {
49
+ target = "task";
50
+ }
51
+ remaining = remaining.replace(targetMatch[0], "").trim();
52
+ }
53
+ if (target === "inbox") {
54
+ return {
55
+ target: "inbox",
56
+ inbox: parseInboxInput(remaining),
57
+ };
58
+ }
59
+ return {
60
+ target: "task",
61
+ task: parseTaskInput(remaining),
62
+ };
63
+ }
64
+ /**
65
+ * Parse natural language inbox input
66
+ *
67
+ * Examples:
68
+ * - "GraphQL 도입 검토 #backend #연구"
69
+ * - "성능 개선 아이디어 #performance"
70
+ */
71
+ export function parseInboxInput(input) {
72
+ validateInputLength(input);
73
+ let remaining = input.trim();
74
+ const result = { content: "" };
75
+ // Extract tags (#dev, #backend, #개발)
76
+ const tagMatches = remaining.match(/#([\p{L}\p{N}_]+)/gu);
77
+ if (tagMatches) {
78
+ result.tags = tagMatches.map((m) => m.slice(1));
79
+ for (const match of tagMatches) {
80
+ remaining = remaining.replace(match, "").trim();
81
+ }
82
+ }
83
+ // Clean up and set content
84
+ result.content = remaining.replace(/\s+/g, " ").trim();
85
+ return result;
86
+ }
2
87
  /**
3
88
  * Parse natural language task input
4
89
  *
@@ -9,6 +94,7 @@ import { parseRelativeDate, formatDate } from "./date.js";
9
94
  * - "Write tests every Monday #testing"
10
95
  */
11
96
  export function parseTaskInput(input) {
97
+ validateInputLength(input);
12
98
  let remaining = input.trim();
13
99
  const result = { title: "" };
14
100
  // Extract priority (!high, !critical, !medium, !low, !높음, !보통, !낮음)
@@ -1 +1 @@
1
- {"version":3,"file":"natural-language.js","sourceRoot":"","sources":["../../src/utils/natural-language.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"natural-language.js","sourceRoot":"","sources":["../../src/utils/natural-language.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Projection Utilities
3
+ *
4
+ * Transform full objects into token-efficient projections.
5
+ * Reduces token usage by 70-88% for list operations.
6
+ */
7
+ import type { Task } from "../schemas/task.js";
8
+ import type { Project } from "../schemas/project.js";
9
+ import type { InboxItem } from "../schemas/inbox.js";
10
+ import type { ResponseFormat, TaskSummary, TaskPreview, ProjectSummary, ProjectPreview, InboxSummary, InboxPreview, PaginatedResponse } from "../schemas/response-format.js";
11
+ /**
12
+ * Project a single task to the specified format
13
+ */
14
+ export declare function projectTask(task: Task, format: ResponseFormat): TaskSummary | TaskPreview | Task;
15
+ /**
16
+ * Project multiple tasks with optional limit
17
+ */
18
+ export declare function projectTasks(tasks: Task[], format: ResponseFormat, limit?: number): (TaskSummary | TaskPreview | Task)[];
19
+ /**
20
+ * Project tasks with pagination
21
+ */
22
+ export declare function projectTasksPaginated(tasks: Task[], format: ResponseFormat, limit?: number, offset?: number): PaginatedResponse<TaskSummary | TaskPreview | Task>;
23
+ /**
24
+ * Project a single project to the specified format
25
+ */
26
+ export declare function projectProject(project: Project, format: ResponseFormat): ProjectSummary | ProjectPreview | Project;
27
+ /**
28
+ * Project multiple projects with optional limit
29
+ */
30
+ export declare function projectProjects(projects: Project[], format: ResponseFormat, limit?: number): (ProjectSummary | ProjectPreview | Project)[];
31
+ /**
32
+ * Project a single inbox item to the specified format
33
+ */
34
+ export declare function projectInboxItem(item: InboxItem, format: ResponseFormat): InboxSummary | InboxPreview | InboxItem;
35
+ /**
36
+ * Project multiple inbox items with optional limit
37
+ */
38
+ export declare function projectInboxItems(items: InboxItem[], format: ResponseFormat, limit?: number): (InboxSummary | InboxPreview | InboxItem)[];
39
+ /**
40
+ * Format response based on format type
41
+ * - concise/standard: JSON string for machine processing
42
+ * - detailed: Human-readable text
43
+ */
44
+ export declare function formatResponse<T>(data: T | T[], format: ResponseFormat, detailedFormatter?: (data: T | T[]) => string): string;
45
+ /**
46
+ * Apply pagination parameters
47
+ */
48
+ export declare function applyPagination<T>(items: T[], limit?: number, offset?: number): {
49
+ items: T[];
50
+ hasMore: boolean;
51
+ total: number;
52
+ };
53
+ /**
54
+ * Truncate string for token efficiency
55
+ */
56
+ export declare function truncate(str: string, maxLength?: number): string;
57
+ /**
58
+ * Summarize a list of items for token efficiency
59
+ */
60
+ export declare function summarizeList<T>(items: T[], maxDisplay: number | undefined, getId: (item: T) => string): {
61
+ displayed: T[];
62
+ remaining: number;
63
+ remainingIds: string[];
64
+ };
65
+ //# sourceMappingURL=projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../../src/utils/projection.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,WAAW,EACX,cAAc,EACd,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,iBAAiB,EAGlB,MAAM,+BAA+B,CAAC;AAEvC;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,GAAG,WAAW,GAAG,WAAW,GAAG,IAAI,CA0BhG;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,IAAI,EAAE,EACb,MAAM,EAAE,cAAc,EACtB,KAAK,CAAC,EAAE,MAAM,GACb,CAAC,WAAW,GAAG,WAAW,GAAG,IAAI,CAAC,EAAE,CAGtC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,IAAI,EAAE,EACb,MAAM,EAAE,cAAc,EACtB,KAAK,GAAE,MAAW,EAClB,MAAM,GAAE,MAAU,GACjB,iBAAiB,CAAC,WAAW,GAAG,WAAW,GAAG,IAAI,CAAC,CAYrD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,cAAc,GACrB,cAAc,GAAG,cAAc,GAAG,OAAO,CAuC3C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,cAAc,EACtB,KAAK,CAAC,EAAE,MAAM,GACb,CAAC,cAAc,GAAG,cAAc,GAAG,OAAO,CAAC,EAAE,CAG/C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,cAAc,GACrB,YAAY,GAAG,YAAY,GAAG,SAAS,CAsBzC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,EAAE,EAClB,MAAM,EAAE,cAAc,EACtB,KAAK,CAAC,EAAE,MAAM,GACb,CAAC,YAAY,GAAG,YAAY,GAAG,SAAS,CAAC,EAAE,CAG7C;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,EACb,MAAM,EAAE,cAAc,EACtB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,MAAM,GAC5C,MAAM,CAOR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,GAAE,MAAW,EAClB,MAAM,GAAE,MAAU,GACjB;IAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAUjD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM,CAGrE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC7B,KAAK,EAAE,CAAC,EAAE,EACV,UAAU,EAAE,MAAM,YAAI,EACtB,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GACzB;IAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,CAS/D"}