paput-mcp 2.0.3 → 2.1.0

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 (61) hide show
  1. package/dist/handlers/add-knowledge-candidates/handler.js +68 -0
  2. package/dist/handlers/add-knowledge-candidates/handler.js.map +1 -0
  3. package/dist/handlers/add-knowledge-candidates/index.js +3 -0
  4. package/dist/handlers/add-knowledge-candidates/index.js.map +1 -0
  5. package/dist/handlers/add-knowledge-candidates/tool.js +36 -0
  6. package/dist/handlers/add-knowledge-candidates/tool.js.map +1 -0
  7. package/dist/handlers/cache-status/handler.js +22 -0
  8. package/dist/handlers/cache-status/handler.js.map +1 -0
  9. package/dist/handlers/cache-status/index.js +3 -0
  10. package/dist/handlers/cache-status/index.js.map +1 -0
  11. package/dist/handlers/cache-status/tool.js +13 -0
  12. package/dist/handlers/cache-status/tool.js.map +1 -0
  13. package/dist/handlers/discard-pending-candidate/handler.js +36 -0
  14. package/dist/handlers/discard-pending-candidate/handler.js.map +1 -0
  15. package/dist/handlers/discard-pending-candidate/index.js +3 -0
  16. package/dist/handlers/discard-pending-candidate/index.js.map +1 -0
  17. package/dist/handlers/discard-pending-candidate/tool.js +17 -0
  18. package/dist/handlers/discard-pending-candidate/tool.js.map +1 -0
  19. package/dist/handlers/get-session-transcript/handler.js +42 -0
  20. package/dist/handlers/get-session-transcript/handler.js.map +1 -0
  21. package/dist/handlers/get-session-transcript/index.js +3 -0
  22. package/dist/handlers/get-session-transcript/index.js.map +1 -0
  23. package/dist/handlers/get-session-transcript/tool.js +28 -0
  24. package/dist/handlers/get-session-transcript/tool.js.map +1 -0
  25. package/dist/handlers/index.js +8 -0
  26. package/dist/handlers/index.js.map +1 -1
  27. package/dist/handlers/list-pending-candidates/handler.js +19 -0
  28. package/dist/handlers/list-pending-candidates/handler.js.map +1 -0
  29. package/dist/handlers/list-pending-candidates/index.js +3 -0
  30. package/dist/handlers/list-pending-candidates/index.js.map +1 -0
  31. package/dist/handlers/list-pending-candidates/tool.js +18 -0
  32. package/dist/handlers/list-pending-candidates/tool.js.map +1 -0
  33. package/dist/handlers/save-pending-candidate/handler.js +80 -0
  34. package/dist/handlers/save-pending-candidate/handler.js.map +1 -0
  35. package/dist/handlers/save-pending-candidate/index.js +3 -0
  36. package/dist/handlers/save-pending-candidate/index.js.map +1 -0
  37. package/dist/handlers/save-pending-candidate/tool.js +20 -0
  38. package/dist/handlers/save-pending-candidate/tool.js.map +1 -0
  39. package/dist/handlers/scan-sessions/handler.js +26 -0
  40. package/dist/handlers/scan-sessions/handler.js.map +1 -0
  41. package/dist/handlers/scan-sessions/index.js +3 -0
  42. package/dist/handlers/scan-sessions/index.js.map +1 -0
  43. package/dist/handlers/scan-sessions/tool.js +27 -0
  44. package/dist/handlers/scan-sessions/tool.js.map +1 -0
  45. package/dist/handlers/sync-remote-memos/handler.js +42 -0
  46. package/dist/handlers/sync-remote-memos/handler.js.map +1 -0
  47. package/dist/handlers/sync-remote-memos/index.js +3 -0
  48. package/dist/handlers/sync-remote-memos/index.js.map +1 -0
  49. package/dist/handlers/sync-remote-memos/tool.js +22 -0
  50. package/dist/handlers/sync-remote-memos/tool.js.map +1 -0
  51. package/dist/services/local-cache/index.js +235 -0
  52. package/dist/services/local-cache/index.js.map +1 -0
  53. package/dist/services/session/index.js +124 -0
  54. package/dist/services/session/index.js.map +1 -0
  55. package/dist/tool.js +9 -1
  56. package/dist/tool.js.map +1 -1
  57. package/dist/types/index.js +1 -0
  58. package/dist/types/index.js.map +1 -1
  59. package/dist/types/knowledge.js +2 -0
  60. package/dist/types/knowledge.js.map +1 -0
  61. package/package.json +1 -4
@@ -0,0 +1,68 @@
1
+ import { addKnowledgeCandidates } from '../../services/local-cache/index.js';
2
+ export async function handleAddKnowledgeCandidates(args, _apiClient) {
3
+ if (!args || typeof args.session_id !== 'string') {
4
+ return {
5
+ content: [{ type: 'text', text: 'session_id は必須です' }],
6
+ isError: true,
7
+ };
8
+ }
9
+ if (args.source !== 'claude' && args.source !== 'codex') {
10
+ return {
11
+ content: [
12
+ {
13
+ type: 'text',
14
+ text: 'source は claude または codex を指定してください',
15
+ },
16
+ ],
17
+ isError: true,
18
+ };
19
+ }
20
+ if (!Array.isArray(args.candidates)) {
21
+ return {
22
+ content: [{ type: 'text', text: 'candidates は配列で指定してください' }],
23
+ isError: true,
24
+ };
25
+ }
26
+ const candidates = args.candidates.flatMap((candidate) => {
27
+ if (typeof candidate !== 'object' ||
28
+ candidate === null ||
29
+ !('title' in candidate) ||
30
+ !('body' in candidate) ||
31
+ typeof candidate.title !== 'string' ||
32
+ typeof candidate.body !== 'string') {
33
+ return [];
34
+ }
35
+ const rawCandidate = candidate;
36
+ const categories = Array.isArray(rawCandidate.categories)
37
+ ? rawCandidate.categories.filter((category) => typeof category === 'string')
38
+ : [];
39
+ return [
40
+ {
41
+ title: candidate.title,
42
+ body: candidate.body,
43
+ categories,
44
+ confidence: typeof rawCandidate.confidence === 'number'
45
+ ? rawCandidate.confidence
46
+ : undefined,
47
+ is_public: typeof rawCandidate.is_public === 'boolean'
48
+ ? rawCandidate.is_public
49
+ : false,
50
+ },
51
+ ];
52
+ });
53
+ const result = addKnowledgeCandidates(args.source, args.session_id, candidates);
54
+ return {
55
+ content: [
56
+ {
57
+ type: 'text',
58
+ text: JSON.stringify({
59
+ added: result.added.length,
60
+ duplicates: result.duplicates.length,
61
+ candidates: result.added,
62
+ duplicate_details: result.duplicates,
63
+ }, null, 2),
64
+ },
65
+ ],
66
+ };
67
+ }
68
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/add-knowledge-candidates/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAM7E,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,IAAyC,EACzC,UAAqB;IAErB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACjD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;YACrD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QACxD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,qCAAqC;iBAC5C;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC;YAC5D,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CACxC,CAAC,SAAS,EAA6B,EAAE;QACvC,IACE,OAAO,SAAS,KAAK,QAAQ;YAC7B,SAAS,KAAK,IAAI;YAClB,CAAC,CAAC,OAAO,IAAI,SAAS,CAAC;YACvB,CAAC,CAAC,MAAM,IAAI,SAAS,CAAC;YACtB,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ;YACnC,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,EAClC,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,YAAY,GAAG,SAAoC,CAAC;QAC1D,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC;YACvD,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,CAC5B,CAAC,QAAQ,EAAsB,EAAE,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAC/D;YACH,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO;YACL;gBACE,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,UAAU;gBACV,UAAU,EACR,OAAO,YAAY,CAAC,UAAU,KAAK,QAAQ;oBACzC,CAAC,CAAC,YAAY,CAAC,UAAU;oBACzB,CAAC,CAAC,SAAS;gBACf,SAAS,EACP,OAAO,YAAY,CAAC,SAAS,KAAK,SAAS;oBACzC,CAAC,CAAC,YAAY,CAAC,SAAS;oBACxB,CAAC,CAAC,KAAK;aACZ;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,MAAM,GAAG,sBAAsB,CACnC,IAAI,CAAC,MAAuB,EAC5B,IAAI,CAAC,UAAU,EACf,UAAU,CACX,CAAC;IAEF,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;oBAC1B,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM;oBACpC,UAAU,EAAE,MAAM,CAAC,KAAK;oBACxB,iBAAiB,EAAE,MAAM,CAAC,UAAU;iBACrC,EACD,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './handler.js';
2
+ export * from './tool.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/handlers/add-knowledge-candidates/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { handleAddKnowledgeCandidates } from './handler.js';
2
+ export const addKnowledgeCandidatesTool = {
3
+ definition: {
4
+ name: 'paput_add_knowledge_candidates',
5
+ description: 'AI が抽出した知見候補を pending に保存します',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {
9
+ session_id: { type: 'string', description: '抽出元セッションID' },
10
+ source: {
11
+ type: 'string',
12
+ enum: ['claude', 'codex'],
13
+ description: '抽出元セッションソース',
14
+ },
15
+ candidates: {
16
+ type: 'array',
17
+ description: '保存する知見候補',
18
+ items: {
19
+ type: 'object',
20
+ properties: {
21
+ title: { type: 'string' },
22
+ body: { type: 'string' },
23
+ categories: { type: 'array', items: { type: 'string' } },
24
+ confidence: { type: 'number' },
25
+ is_public: { type: 'boolean', default: false },
26
+ },
27
+ required: ['title', 'body'],
28
+ },
29
+ },
30
+ },
31
+ required: ['session_id', 'source', 'candidates'],
32
+ },
33
+ },
34
+ handler: handleAddKnowledgeCandidates,
35
+ };
36
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/handlers/add-knowledge-candidates/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,CAAC,MAAM,0BAA0B,GAAgB;IACrD,UAAU,EAAE;QACV,IAAI,EAAE,gCAAgC;QACtC,WAAW,EAAE,8BAA8B;QAC3C,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE;gBACzD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;oBACzB,WAAW,EAAE,aAAa;iBAC3B;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,UAAU;oBACvB,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACzB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACxB,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;4BACxD,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BAC9B,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;yBAC/C;wBACD,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;qBAC5B;iBACF;aACF;YACD,QAAQ,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,YAAY,CAAC;SACjD;KACF;IACD,OAAO,EAAE,4BAA4B;CACtC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { getCacheDir, readCache } from '../../services/local-cache/index.js';
2
+ export async function handleCacheStatus(_args, _apiClient) {
3
+ const cache = readCache();
4
+ const pendingCount = cache.pending.filter((candidate) => candidate.status === 'pending').length;
5
+ return {
6
+ content: [
7
+ {
8
+ type: 'text',
9
+ text: JSON.stringify({
10
+ cache_dir: getCacheDir(),
11
+ memos: cache.memos.length,
12
+ pending: pendingCount,
13
+ saved_candidates: cache.pending.filter((candidate) => candidate.status === 'saved').length,
14
+ discarded_candidates: cache.pending.filter((candidate) => candidate.status === 'discarded').length,
15
+ processed_sessions: cache.sessions.length,
16
+ last_remote_sync_at: cache.config.last_remote_sync_at || null,
17
+ }, null, 2),
18
+ },
19
+ ],
20
+ };
21
+ }
22
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/cache-status/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAE7E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAA0C,EAC1C,UAAqB;IAErB,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CACvC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,KAAK,SAAS,CAC9C,CAAC,MAAM,CAAC;IAET,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,SAAS,EAAE,WAAW,EAAE;oBACxB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;oBACzB,OAAO,EAAE,YAAY;oBACrB,gBAAgB,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CACpC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,KAAK,OAAO,CAC5C,CAAC,MAAM;oBACR,oBAAoB,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CACxC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,KAAK,WAAW,CAChD,CAAC,MAAM;oBACR,kBAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;oBACzC,mBAAmB,EAAE,KAAK,CAAC,MAAM,CAAC,mBAAmB,IAAI,IAAI;iBAC9D,EACD,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './handler.js';
2
+ export * from './tool.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/handlers/cache-status/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { handleCacheStatus } from './handler.js';
2
+ export const cacheStatusTool = {
3
+ definition: {
4
+ name: 'paput_cache_status',
5
+ description: 'PaPut のローカルキャッシュ状態を取得します',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {},
9
+ },
10
+ },
11
+ handler: handleCacheStatus,
12
+ };
13
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/handlers/cache-status/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,CAAC,MAAM,eAAe,GAAgB;IAC1C,UAAU,EAAE;QACV,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,0BAA0B;QACvC,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;KACF;IACD,OAAO,EAAE,iBAAiB;CAC3B,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { updatePendingCandidate } from '../../services/local-cache/index.js';
2
+ export async function handleDiscardPendingCandidate(args, _apiClient) {
3
+ if (!args || typeof args.candidate_id !== 'string') {
4
+ return {
5
+ content: [{ type: 'text', text: 'candidate_id は必須です' }],
6
+ isError: true,
7
+ };
8
+ }
9
+ const updated = updatePendingCandidate(args.candidate_id, (candidate) => ({
10
+ ...candidate,
11
+ status: 'discarded',
12
+ discarded_reason: typeof args.reason === 'string' ? args.reason : undefined,
13
+ updated_at: new Date().toISOString(),
14
+ }));
15
+ if (!updated) {
16
+ return {
17
+ content: [
18
+ { type: 'text', text: '破棄対象の pending 候補が見つかりません' },
19
+ ],
20
+ isError: true,
21
+ };
22
+ }
23
+ return {
24
+ content: [
25
+ {
26
+ type: 'text',
27
+ text: JSON.stringify({
28
+ discarded: true,
29
+ candidate_id: updated.id,
30
+ title: updated.title,
31
+ }, null, 2),
32
+ },
33
+ ],
34
+ };
35
+ }
36
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/discard-pending-candidate/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAE7E,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,IAAyC,EACzC,UAAqB;IAErB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;QACnD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;YACvD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACxE,GAAG,SAAS;QACZ,MAAM,EAAE,WAAW;QACnB,gBAAgB,EAAE,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QAC3E,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACrC,CAAC,CAAC,CAAC;IAEJ,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE;aACnD;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,SAAS,EAAE,IAAI;oBACf,YAAY,EAAE,OAAO,CAAC,EAAE;oBACxB,KAAK,EAAE,OAAO,CAAC,KAAK;iBACrB,EACD,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './handler.js';
2
+ export * from './tool.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/handlers/discard-pending-candidate/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { handleDiscardPendingCandidate } from './handler.js';
2
+ export const discardPendingCandidateTool = {
3
+ definition: {
4
+ name: 'paput_discard_pending_candidate',
5
+ description: 'pending の知見候補を破棄します',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {
9
+ candidate_id: { type: 'string', description: '破棄する候補ID' },
10
+ reason: { type: 'string', description: '破棄理由' },
11
+ },
12
+ required: ['candidate_id'],
13
+ },
14
+ },
15
+ handler: handleDiscardPendingCandidate,
16
+ };
17
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/handlers/discard-pending-candidate/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAE7D,MAAM,CAAC,MAAM,2BAA2B,GAAgB;IACtD,UAAU,EAAE;QACV,IAAI,EAAE,iCAAiC;QACvC,WAAW,EAAE,qBAAqB;QAClC,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE;gBACzD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE;aAChD;YACD,QAAQ,EAAE,CAAC,cAAc,CAAC;SAC3B;KACF;IACD,OAAO,EAAE,6BAA6B;CACvC,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { getSessionTranscript } from '../../services/session/index.js';
2
+ export async function handleGetSessionTranscript(args, _apiClient) {
3
+ if (!args || typeof args.session_id !== 'string') {
4
+ return {
5
+ content: [{ type: 'text', text: 'session_id は必須です' }],
6
+ isError: true,
7
+ };
8
+ }
9
+ if (args.source !== 'claude' && args.source !== 'codex') {
10
+ return {
11
+ content: [
12
+ {
13
+ type: 'text',
14
+ text: 'source は claude または codex を指定してください',
15
+ },
16
+ ],
17
+ isError: true,
18
+ };
19
+ }
20
+ const maxChars = typeof args.max_chars === 'number' ? Math.max(1000, args.max_chars) : 20000;
21
+ const transcript = getSessionTranscript(args.source, args.session_id, maxChars);
22
+ if (!transcript) {
23
+ return {
24
+ content: [
25
+ {
26
+ type: 'text',
27
+ text: `セッションが見つかりません: ${args.source}:${args.session_id}`,
28
+ },
29
+ ],
30
+ isError: true,
31
+ };
32
+ }
33
+ return {
34
+ content: [
35
+ {
36
+ type: 'text',
37
+ text: transcript,
38
+ },
39
+ ],
40
+ };
41
+ }
42
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/get-session-transcript/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAGvE,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,IAAyC,EACzC,UAAqB;IAErB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACjD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;YACrD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QACxD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,qCAAqC;iBAC5C;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GACZ,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9E,MAAM,UAAU,GAAG,oBAAoB,CACrC,IAAI,CAAC,MAAuB,EAC5B,IAAI,CAAC,UAAU,EACf,QAAQ,CACT,CAAC;IAEF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,kBAAkB,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE;iBACzD;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,UAAU;aACjB;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './handler.js';
2
+ export * from './tool.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/handlers/get-session-transcript/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { handleGetSessionTranscript } from './handler.js';
2
+ export const getSessionTranscriptTool = {
3
+ definition: {
4
+ name: 'paput_get_session_transcript',
5
+ description: '知見抽出用にローカルセッション本文を取得します',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {
9
+ session_id: {
10
+ type: 'string',
11
+ description: '取得対象のセッションID',
12
+ },
13
+ source: {
14
+ type: 'string',
15
+ enum: ['claude', 'codex'],
16
+ description: 'セッションソース',
17
+ },
18
+ max_chars: {
19
+ type: 'number',
20
+ description: '返却する最大文字数。デフォルトは20000です',
21
+ },
22
+ },
23
+ required: ['session_id', 'source'],
24
+ },
25
+ },
26
+ handler: handleGetSessionTranscript,
27
+ };
28
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/handlers/get-session-transcript/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAE1D,MAAM,CAAC,MAAM,wBAAwB,GAAgB;IACnD,UAAU,EAAE;QACV,IAAI,EAAE,8BAA8B;QACpC,WAAW,EAAE,yBAAyB;QACtC,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,cAAc;iBAC5B;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;oBACzB,WAAW,EAAE,UAAU;iBACxB;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,yBAAyB;iBACvC;aACF;YACD,QAAQ,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC;SACnC;KACF;IACD,OAAO,EAAE,0BAA0B;CACpC,CAAC"}
@@ -23,4 +23,12 @@ export * from './get-skill-sheet-projects/index.js';
23
23
  export * from './add-skill-sheet-project/index.js';
24
24
  export * from './update-skill-sheet-project/index.js';
25
25
  export * from './delete-skill-sheet-project/index.js';
26
+ export * from './cache-status/index.js';
27
+ export * from './sync-remote-memos/index.js';
28
+ export * from './scan-sessions/index.js';
29
+ export * from './get-session-transcript/index.js';
30
+ export * from './add-knowledge-candidates/index.js';
31
+ export * from './list-pending-candidates/index.js';
32
+ export * from './save-pending-candidate/index.js';
33
+ export * from './discard-pending-candidate/index.js';
26
34
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0CAA0C,CAAC;AACzD,cAAc,uCAAuC,CAAC;AACtD,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC;AACrD,cAAc,kCAAkC,CAAC;AACjD,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,oCAAoC,CAAC;AACnD,cAAc,uCAAuC,CAAC;AACtD,cAAc,uCAAuC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0CAA0C,CAAC;AACzD,cAAc,uCAAuC,CAAC;AACtD,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC;AACrD,cAAc,kCAAkC,CAAC;AACjD,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,oCAAoC,CAAC;AACnD,cAAc,uCAAuC,CAAC;AACtD,cAAc,uCAAuC,CAAC;AACtD,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { readCache } from '../../services/local-cache/index.js';
2
+ export async function handleListPendingCandidates(args, _apiClient) {
3
+ const limit = typeof args?.limit === 'number' ? Math.max(1, args.limit) : 20;
4
+ const candidates = readCache()
5
+ .pending.filter((candidate) => candidate.status === 'pending')
6
+ .slice(0, limit);
7
+ return {
8
+ content: [
9
+ {
10
+ type: 'text',
11
+ text: JSON.stringify({
12
+ count: candidates.length,
13
+ candidates,
14
+ }, null, 2),
15
+ },
16
+ ],
17
+ };
18
+ }
19
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/list-pending-candidates/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAEhE,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,IAAyC,EACzC,UAAqB;IAErB,MAAM,KAAK,GAAG,OAAO,IAAI,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,MAAM,UAAU,GAAG,SAAS,EAAE;SAC3B,OAAO,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC;SAC7D,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAEnB,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,KAAK,EAAE,UAAU,CAAC,MAAM;oBACxB,UAAU;iBACX,EACD,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './handler.js';
2
+ export * from './tool.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/handlers/list-pending-candidates/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { handleListPendingCandidates } from './handler.js';
2
+ export const listPendingCandidatesTool = {
3
+ definition: {
4
+ name: 'paput_list_pending_candidates',
5
+ description: '未保存の知見候補を一覧表示します',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {
9
+ limit: {
10
+ type: 'number',
11
+ description: '取得件数。デフォルトは20です',
12
+ },
13
+ },
14
+ },
15
+ },
16
+ handler: handleListPendingCandidates,
17
+ };
18
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/handlers/list-pending-candidates/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,CAAC,MAAM,yBAAyB,GAAgB;IACpD,UAAU,EAAE;QACV,IAAI,EAAE,+BAA+B;QACrC,WAAW,EAAE,kBAAkB;QAC/B,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,iBAAiB;iBAC/B;aACF;SACF;KACF;IACD,OAAO,EAAE,2BAA2B;CACrC,CAAC"}
@@ -0,0 +1,80 @@
1
+ import { createMemo, searchMemos } from '../../services/api/memo.js';
2
+ import { createFingerprint, readCache, toCachedMemo, updatePendingCandidate, upsertCachedMemos, } from '../../services/local-cache/index.js';
3
+ export async function handleSavePendingCandidate(args, apiClient) {
4
+ if (!args || typeof args.candidate_id !== 'string') {
5
+ return {
6
+ content: [{ type: 'text', text: 'candidate_id は必須です' }],
7
+ isError: true,
8
+ };
9
+ }
10
+ const candidate = readCache().pending.find((item) => item.id === args.candidate_id && item.status === 'pending');
11
+ if (!candidate) {
12
+ return {
13
+ content: [
14
+ { type: 'text', text: '保存対象の pending 候補が見つかりません' },
15
+ ],
16
+ isError: true,
17
+ };
18
+ }
19
+ const title = typeof args.title === 'string' ? args.title : candidate.title;
20
+ const body = typeof args.body === 'string' ? args.body : candidate.body;
21
+ const categories = Array.isArray(args.categories)
22
+ ? args.categories.filter((category) => typeof category === 'string')
23
+ : candidate.categories || [];
24
+ const params = {
25
+ title,
26
+ body,
27
+ is_public: typeof args.is_public === 'boolean'
28
+ ? args.is_public
29
+ : (candidate.is_public ?? false),
30
+ categories: categories.map((name) => ({ name })),
31
+ };
32
+ const result = await createMemo(apiClient, params);
33
+ if (!result.success) {
34
+ return {
35
+ content: [
36
+ {
37
+ type: 'text',
38
+ text: `知見候補の保存に失敗しました: ${result.error || '不明なエラー'}`,
39
+ },
40
+ ],
41
+ isError: true,
42
+ };
43
+ }
44
+ const savedMemo = await findSavedMemo(apiClient, title, body);
45
+ if (savedMemo) {
46
+ upsertCachedMemos([toCachedMemo(savedMemo)]);
47
+ }
48
+ const updated = updatePendingCandidate(candidate.id, (item) => ({
49
+ ...item,
50
+ title,
51
+ body,
52
+ categories,
53
+ is_public: params.is_public,
54
+ status: 'saved',
55
+ fingerprint: createFingerprint(title, body),
56
+ saved_memo_id: savedMemo?.id,
57
+ updated_at: new Date().toISOString(),
58
+ }));
59
+ return {
60
+ content: [
61
+ {
62
+ type: 'text',
63
+ text: JSON.stringify({
64
+ saved: true,
65
+ candidate_id: updated?.id,
66
+ memo_id: savedMemo?.id || null,
67
+ title,
68
+ }, null, 2),
69
+ },
70
+ ],
71
+ };
72
+ }
73
+ async function findSavedMemo(apiClient, title, body) {
74
+ const result = await searchMemos(apiClient, { word: title, limit: 10 });
75
+ if (!result.success || !result.memos)
76
+ return undefined;
77
+ const fingerprint = createFingerprint(title, body);
78
+ return result.memos.find((memo) => createFingerprint(memo.title, memo.body) === fingerprint);
79
+ }
80
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/save-pending-candidate/handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './handler.js';
2
+ export * from './tool.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/handlers/save-pending-candidate/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { handleSavePendingCandidate } from './handler.js';
2
+ export const savePendingCandidateTool = {
3
+ definition: {
4
+ name: 'paput_save_pending_candidate',
5
+ description: 'pending の知見候補を PaPut メモとして保存します',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {
9
+ candidate_id: { type: 'string', description: '保存する候補ID' },
10
+ title: { type: 'string', description: '保存時に上書きするタイトル' },
11
+ body: { type: 'string', description: '保存時に上書きする本文' },
12
+ categories: { type: 'array', items: { type: 'string' } },
13
+ is_public: { type: 'boolean', default: false },
14
+ },
15
+ required: ['candidate_id'],
16
+ },
17
+ },
18
+ handler: handleSavePendingCandidate,
19
+ };
20
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/handlers/save-pending-candidate/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAE1D,MAAM,CAAC,MAAM,wBAAwB,GAAgB;IACnD,UAAU,EAAE;QACV,IAAI,EAAE,8BAA8B;QACpC,WAAW,EAAE,iCAAiC;QAC9C,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE;gBACzD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE;gBACvD,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE;gBACpD,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;gBACxD,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;aAC/C;YACD,QAAQ,EAAE,CAAC,cAAc,CAAC;SAC3B;KACF;IACD,OAAO,EAAE,0BAA0B;CACpC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { scanSessions } from '../../services/session/index.js';
2
+ export async function handleScanSessions(args, _apiClient) {
3
+ const sources = parseSources(args?.sources);
4
+ const includeProcessed = typeof args?.include_processed === 'boolean'
5
+ ? args.include_processed
6
+ : false;
7
+ const sessions = scanSessions(sources, includeProcessed);
8
+ return {
9
+ content: [
10
+ {
11
+ type: 'text',
12
+ text: JSON.stringify({
13
+ count: sessions.length,
14
+ sessions,
15
+ }, null, 2),
16
+ },
17
+ ],
18
+ };
19
+ }
20
+ function parseSources(value) {
21
+ if (!Array.isArray(value))
22
+ return ['claude', 'codex'];
23
+ const sources = value.filter((source) => source === 'claude' || source === 'codex');
24
+ return sources.length > 0 ? sources : ['claude', 'codex'];
25
+ }
26
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/scan-sessions/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAG/D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAyC,EACzC,UAAqB;IAErB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,gBAAgB,GACpB,OAAO,IAAI,EAAE,iBAAiB,KAAK,SAAS;QAC1C,CAAC,CAAC,IAAI,CAAC,iBAAiB;QACxB,CAAC,CAAC,KAAK,CAAC;IACZ,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAEzD,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,KAAK,EAAE,QAAQ,CAAC,MAAM;oBACtB,QAAQ;iBACT,EACD,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAC1B,CAAC,MAAM,EAA2B,EAAE,CAClC,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,OAAO,CAC5C,CAAC;IACF,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './handler.js';
2
+ export * from './tool.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/handlers/scan-sessions/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { handleScanSessions } from './handler.js';
2
+ export const scanSessionsTool = {
3
+ definition: {
4
+ name: 'paput_scan_sessions',
5
+ description: 'Claude/Codex のローカルセッションログを検出します',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {
9
+ sources: {
10
+ type: 'array',
11
+ items: {
12
+ type: 'string',
13
+ enum: ['claude', 'codex'],
14
+ },
15
+ description: '検出対象のセッションソース',
16
+ },
17
+ include_processed: {
18
+ type: 'boolean',
19
+ description: 'digest 済みセッションも含めるかどうか',
20
+ default: false,
21
+ },
22
+ },
23
+ },
24
+ },
25
+ handler: handleScanSessions,
26
+ };
27
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/handlers/scan-sessions/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,CAAC,MAAM,gBAAgB,GAAgB;IAC3C,UAAU,EAAE;QACV,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,iCAAiC;QAC9C,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;qBAC1B;oBACD,WAAW,EAAE,eAAe;iBAC7B;gBACD,iBAAiB,EAAE;oBACjB,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,wBAAwB;oBACrC,OAAO,EAAE,KAAK;iBACf;aACF;SACF;KACF;IACD,OAAO,EAAE,kBAAkB;CAC5B,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { searchMemos } from '../../services/api/memo.js';
2
+ import { toCachedMemo, upsertCachedMemos, writeConfig, readCache, } from '../../services/local-cache/index.js';
3
+ export async function handleSyncRemoteMemos(args, apiClient) {
4
+ const limit = typeof args?.limit === 'number' ? Math.min(args.limit, 100) : 100;
5
+ const maxPages = typeof args?.max_pages === 'number' ? Math.max(1, args.max_pages) : 20;
6
+ const fetched = [];
7
+ for (let page = 1; page <= maxPages; page++) {
8
+ const result = await searchMemos(apiClient, { page, limit });
9
+ if (!result.success) {
10
+ return {
11
+ content: [
12
+ {
13
+ type: 'text',
14
+ text: `PaPut メモの同期に失敗しました: ${result.error || '不明なエラー'}`,
15
+ },
16
+ ],
17
+ isError: true,
18
+ };
19
+ }
20
+ const memos = result.memos || [];
21
+ fetched.push(...memos.map(toCachedMemo));
22
+ if (memos.length < limit)
23
+ break;
24
+ }
25
+ const memos = upsertCachedMemos(fetched);
26
+ writeConfig({
27
+ ...readCache().config,
28
+ last_remote_sync_at: new Date().toISOString(),
29
+ });
30
+ return {
31
+ content: [
32
+ {
33
+ type: 'text',
34
+ text: JSON.stringify({
35
+ synced: fetched.length,
36
+ cached_memos: memos.length,
37
+ }, null, 2),
38
+ },
39
+ ],
40
+ };
41
+ }
42
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/sync-remote-memos/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,SAAS,GACV,MAAM,qCAAqC,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAyC,EACzC,SAAoB;IAEpB,MAAM,KAAK,GACT,OAAO,IAAI,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACpE,MAAM,QAAQ,GACZ,OAAO,IAAI,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,MAAM,OAAO,GAAG,EAAE,CAAC;IAEnB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,uBAAuB,MAAM,CAAC,KAAK,IAAI,QAAQ,EAAE;qBACxD;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK;YAAE,MAAM;IAClC,CAAC;IAED,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACzC,WAAW,CAAC;QACV,GAAG,SAAS,EAAE,CAAC,MAAM;QACrB,mBAAmB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC9C,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,YAAY,EAAE,KAAK,CAAC,MAAM;iBAC3B,EACD,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './handler.js';
2
+ export * from './tool.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/handlers/sync-remote-memos/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { handleSyncRemoteMemos } from './handler.js';
2
+ export const syncRemoteMemosTool = {
3
+ definition: {
4
+ name: 'paput_sync_remote_memos',
5
+ description: 'PaPut の既存メモをローカルキャッシュへ同期します',
6
+ inputSchema: {
7
+ type: 'object',
8
+ properties: {
9
+ limit: {
10
+ type: 'number',
11
+ description: '1ページあたりの取得件数。最大100です',
12
+ },
13
+ max_pages: {
14
+ type: 'number',
15
+ description: '取得する最大ページ数。デフォルトは20です',
16
+ },
17
+ },
18
+ },
19
+ },
20
+ handler: handleSyncRemoteMemos,
21
+ };
22
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/handlers/sync-remote-memos/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,CAAC,MAAM,mBAAmB,GAAgB;IAC9C,UAAU,EAAE;QACV,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EAAE,6BAA6B;QAC1C,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,sBAAsB;iBACpC;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,uBAAuB;iBACrC;aACF;SACF;KACF;IACD,OAAO,EAAE,qBAAqB;CAC/B,CAAC"}
@@ -0,0 +1,235 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync, } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { dirname, join } from 'node:path';
5
+ const SIMILARITY_THRESHOLD = 0.78;
6
+ export function getCacheDir() {
7
+ return expandHome(process.env.PAPUT_CACHE_DIR || '~/.paput-mcp');
8
+ }
9
+ export function normalizeText(text) {
10
+ return text
11
+ .toLowerCase()
12
+ .replace(/[`*_#>\-\[\]().,、。!?!?::;;"'“”‘’]/g, ' ')
13
+ .replace(/\s+/g, ' ')
14
+ .trim();
15
+ }
16
+ export function createFingerprint(title, body) {
17
+ return createHash('sha256')
18
+ .update(`${normalizeText(title)}\n${normalizeText(body)}`)
19
+ .digest('hex');
20
+ }
21
+ export function toCachedMemo(memo) {
22
+ return {
23
+ id: memo.id,
24
+ title: memo.title,
25
+ body: memo.body,
26
+ categories: memo.categories?.map((category) => category.name) || [],
27
+ is_public: memo.is_public ?? false,
28
+ created_at: memo.created_at,
29
+ updated_at: memo.updated_at,
30
+ fingerprint: createFingerprint(memo.title, memo.body),
31
+ };
32
+ }
33
+ export function readCache() {
34
+ ensureCacheDir();
35
+ return {
36
+ memos: readJsonFile('memos.json', []),
37
+ pending: readJsonlFile('pending.jsonl'),
38
+ sessions: readJsonFile('sessions.json', []),
39
+ config: readJsonFile('config.json', {}),
40
+ };
41
+ }
42
+ export function writeMemos(memos) {
43
+ writeJsonFile('memos.json', dedupeMemos(memos));
44
+ }
45
+ export function writePending(pending) {
46
+ writeJsonlFile('pending.jsonl', pending);
47
+ }
48
+ export function writeSessions(sessions) {
49
+ const unique = new Map();
50
+ for (const session of sessions) {
51
+ unique.set(`${session.source}:${session.session_id}`, session);
52
+ }
53
+ writeJsonFile('sessions.json', [...unique.values()]);
54
+ }
55
+ export function writeConfig(config) {
56
+ writeJsonFile('config.json', config);
57
+ }
58
+ export function upsertCachedMemos(newMemos) {
59
+ const cache = readCache();
60
+ const byId = new Map(cache.memos.map((memo) => [memo.id, memo]));
61
+ for (const memo of newMemos) {
62
+ byId.set(memo.id, memo);
63
+ }
64
+ const memos = [...byId.values()].sort((a, b) => b.id - a.id);
65
+ writeMemos(memos);
66
+ return memos;
67
+ }
68
+ export function addKnowledgeCandidates(source, sessionId, candidates) {
69
+ const cache = readCache();
70
+ const pendingFingerprints = new Set(cache.pending
71
+ .filter((candidate) => candidate.status !== 'discarded')
72
+ .map((candidate) => candidate.fingerprint));
73
+ const memoFingerprints = new Set(cache.memos.map((memo) => memo.fingerprint));
74
+ const added = [];
75
+ const duplicates = [];
76
+ for (const candidate of candidates) {
77
+ const fingerprint = createFingerprint(candidate.title, candidate.body);
78
+ const similarMemos = findSimilarMemos(candidate.title, candidate.body, cache.memos);
79
+ if (memoFingerprints.has(fingerprint)) {
80
+ duplicates.push({
81
+ title: candidate.title,
82
+ reason: '既存メモと完全一致しました',
83
+ similar_memos: similarMemos,
84
+ });
85
+ continue;
86
+ }
87
+ if (pendingFingerprints.has(fingerprint)) {
88
+ duplicates.push({
89
+ title: candidate.title,
90
+ reason: 'pending 候補と完全一致しました',
91
+ similar_memos: similarMemos,
92
+ });
93
+ continue;
94
+ }
95
+ const now = new Date().toISOString();
96
+ const pendingCandidate = {
97
+ id: randomUUID(),
98
+ session_id: sessionId,
99
+ source,
100
+ title: candidate.title,
101
+ body: candidate.body,
102
+ categories: candidate.categories || [],
103
+ confidence: candidate.confidence,
104
+ is_public: candidate.is_public ?? false,
105
+ status: 'pending',
106
+ fingerprint,
107
+ similar_memos: similarMemos,
108
+ created_at: now,
109
+ updated_at: now,
110
+ };
111
+ added.push(pendingCandidate);
112
+ pendingFingerprints.add(fingerprint);
113
+ }
114
+ writePending([...cache.pending, ...added]);
115
+ markSessionProcessed(source, sessionId, '');
116
+ return { added, duplicates };
117
+ }
118
+ export function markSessionProcessed(source, sessionId, path) {
119
+ const cache = readCache();
120
+ const sessions = cache.sessions.filter((session) => !(session.source === source && session.session_id === sessionId));
121
+ sessions.push({
122
+ session_id: sessionId,
123
+ source,
124
+ path,
125
+ processed_at: new Date().toISOString(),
126
+ });
127
+ writeSessions(sessions);
128
+ }
129
+ export function updatePendingCandidate(candidateId, updater) {
130
+ const cache = readCache();
131
+ let updated;
132
+ const pending = cache.pending.map((candidate) => {
133
+ if (candidate.id !== candidateId)
134
+ return candidate;
135
+ updated = updater(candidate);
136
+ return updated;
137
+ });
138
+ if (updated) {
139
+ writePending(pending);
140
+ }
141
+ return updated;
142
+ }
143
+ export function findSimilarMemos(title, body, memos) {
144
+ const target = `${title} ${body}`;
145
+ return memos
146
+ .map((memo) => ({
147
+ id: memo.id,
148
+ title: memo.title,
149
+ score: jaccardSimilarity(target, `${memo.title} ${memo.body}`),
150
+ }))
151
+ .filter((memo) => memo.score >= SIMILARITY_THRESHOLD)
152
+ .sort((a, b) => b.score - a.score)
153
+ .slice(0, 5);
154
+ }
155
+ function expandHome(path) {
156
+ if (path === '~')
157
+ return homedir();
158
+ if (path.startsWith('~/'))
159
+ return join(homedir(), path.slice(2));
160
+ return path;
161
+ }
162
+ function ensureCacheDir() {
163
+ mkdirSync(getCacheDir(), { recursive: true });
164
+ }
165
+ function cachePath(fileName) {
166
+ return join(getCacheDir(), fileName);
167
+ }
168
+ function readJsonFile(fileName, defaultValue) {
169
+ const path = cachePath(fileName);
170
+ if (!existsSync(path))
171
+ return defaultValue;
172
+ try {
173
+ return JSON.parse(readFileSync(path, 'utf8'));
174
+ }
175
+ catch {
176
+ return defaultValue;
177
+ }
178
+ }
179
+ function readJsonlFile(fileName) {
180
+ const path = cachePath(fileName);
181
+ if (!existsSync(path))
182
+ return [];
183
+ return readFileSync(path, 'utf8')
184
+ .split('\n')
185
+ .filter(Boolean)
186
+ .flatMap((line) => {
187
+ try {
188
+ return [JSON.parse(line)];
189
+ }
190
+ catch {
191
+ return [];
192
+ }
193
+ });
194
+ }
195
+ function writeJsonFile(fileName, value) {
196
+ const path = cachePath(fileName);
197
+ mkdirSync(dirname(path), { recursive: true });
198
+ atomicWrite(path, `${JSON.stringify(value, null, 2)}\n`);
199
+ }
200
+ function writeJsonlFile(fileName, values) {
201
+ const path = cachePath(fileName);
202
+ mkdirSync(dirname(path), { recursive: true });
203
+ atomicWrite(path, values.map((value) => JSON.stringify(value)).join('\n') + '\n');
204
+ }
205
+ function atomicWrite(path, content) {
206
+ const tmpPath = `${path}.tmp`;
207
+ writeFileSync(tmpPath, content, 'utf8');
208
+ renameSync(tmpPath, path);
209
+ }
210
+ function dedupeMemos(memos) {
211
+ const byId = new Map();
212
+ for (const memo of memos) {
213
+ byId.set(memo.id, memo);
214
+ }
215
+ return [...byId.values()];
216
+ }
217
+ function jaccardSimilarity(left, right) {
218
+ const leftTokens = new Set(tokenize(left));
219
+ const rightTokens = new Set(tokenize(right));
220
+ if (leftTokens.size === 0 || rightTokens.size === 0)
221
+ return 0;
222
+ let intersection = 0;
223
+ for (const token of leftTokens) {
224
+ if (rightTokens.has(token))
225
+ intersection++;
226
+ }
227
+ const union = new Set([...leftTokens, ...rightTokens]).size;
228
+ return intersection / union;
229
+ }
230
+ function tokenize(text) {
231
+ return normalizeText(text)
232
+ .split(' ')
233
+ .filter((token) => token.length >= 2);
234
+ }
235
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/local-cache/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { basename, join } from 'node:path';
4
+ import { readCache } from '../local-cache/index.js';
5
+ export function scanSessions(sources = ['claude', 'codex'], includeProcessed = false) {
6
+ const processed = new Set(readCache().sessions.map((session) => `${session.source}:${session.session_id}`));
7
+ const sessions = sources.flatMap((source) => {
8
+ const paths = source === 'claude' ? findClaudeSessionFiles() : findCodexSessionFiles();
9
+ return paths.map((path) => {
10
+ const sessionId = basename(path, '.jsonl');
11
+ return {
12
+ session_id: sessionId,
13
+ source,
14
+ path,
15
+ updated_at: statSync(path).mtime.toISOString(),
16
+ message_count: readSessionMessages(source, path).length,
17
+ processed: processed.has(`${source}:${sessionId}`),
18
+ };
19
+ });
20
+ });
21
+ return sessions
22
+ .filter((session) => includeProcessed || !session.processed)
23
+ .sort((a, b) => b.updated_at.localeCompare(a.updated_at));
24
+ }
25
+ export function getSessionTranscript(source, sessionId, maxChars = 20000) {
26
+ const session = scanSessions([source], true).find((item) => item.session_id === sessionId);
27
+ if (!session)
28
+ return undefined;
29
+ const messages = readSessionMessages(source, session.path);
30
+ const transcript = messages
31
+ .map((message) => `${message.role === 'user' ? 'User' : 'Assistant'}:\n${message.text}`)
32
+ .join('\n\n---\n\n');
33
+ if (transcript.length <= maxChars)
34
+ return transcript;
35
+ return transcript.slice(Math.max(0, transcript.length - maxChars));
36
+ }
37
+ function findClaudeSessionFiles() {
38
+ return findJsonlFiles(join(homedir(), '.claude', 'projects'));
39
+ }
40
+ function findCodexSessionFiles() {
41
+ return findJsonlFiles(join(homedir(), '.codex', 'sessions'));
42
+ }
43
+ function findJsonlFiles(root) {
44
+ if (!existsSync(root))
45
+ return [];
46
+ const results = [];
47
+ const visit = (path) => {
48
+ const stat = statSync(path);
49
+ if (stat.isDirectory()) {
50
+ for (const entry of readdirSync(path)) {
51
+ visit(join(path, entry));
52
+ }
53
+ return;
54
+ }
55
+ if (path.endsWith('.jsonl')) {
56
+ results.push(path);
57
+ }
58
+ };
59
+ visit(root);
60
+ return results;
61
+ }
62
+ function readSessionMessages(source, path) {
63
+ const lines = readFileSync(path, 'utf8').split('\n').filter(Boolean);
64
+ return lines.flatMap((line) => {
65
+ try {
66
+ const item = JSON.parse(line);
67
+ return source === 'claude'
68
+ ? parseClaudeMessage(item)
69
+ : parseCodexMessage(item);
70
+ }
71
+ catch {
72
+ return [];
73
+ }
74
+ });
75
+ }
76
+ function parseClaudeMessage(item) {
77
+ if (item.type !== 'user' && item.type !== 'assistant')
78
+ return [];
79
+ const role = item.message?.role;
80
+ if (role !== 'user' && role !== 'assistant')
81
+ return [];
82
+ const text = extractContentText(item.message.content, role);
83
+ if (!text)
84
+ return [];
85
+ return [{ role, text }];
86
+ }
87
+ function parseCodexMessage(item) {
88
+ if (item.type !== 'response_item')
89
+ return [];
90
+ if (item.payload?.type !== 'message')
91
+ return [];
92
+ const role = item.payload.role;
93
+ if (role !== 'user' && role !== 'assistant')
94
+ return [];
95
+ const text = extractContentText(item.payload.content, role);
96
+ if (!text)
97
+ return [];
98
+ return [{ role, text }];
99
+ }
100
+ function extractContentText(content, role) {
101
+ if (typeof content === 'string')
102
+ return content.trim();
103
+ if (!Array.isArray(content))
104
+ return '';
105
+ return content
106
+ .flatMap((item) => {
107
+ if (typeof item === 'string')
108
+ return [item];
109
+ if (!item || typeof item !== 'object')
110
+ return [];
111
+ if (item.type === 'text' && typeof item.text === 'string')
112
+ return [item.text];
113
+ if (item.type === 'input_text' && typeof item.text === 'string')
114
+ return [item.text];
115
+ if (item.type === 'output_text' && typeof item.text === 'string')
116
+ return [item.text];
117
+ if (role === 'assistant' && typeof item.summary === 'string')
118
+ return [item.summary];
119
+ return [];
120
+ })
121
+ .join('\n')
122
+ .trim();
123
+ }
124
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/session/index.ts"],"names":[],"mappings":"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"}
package/dist/tool.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
2
2
  import { createApiClient } from './services/api/index.js';
3
- import { createMemoTool, searchMemoTool, getMemoTool, updateMemoTool, getCategoriesTool, createNoteTool, searchNotesTool, getNoteTool, updateNoteTool, listIdeasTool, createIdeaTool, updateIdeaTool, deleteIdeaTool, getSkillSheetTool, updateSkillSheetBasicInfoTool, updateSkillSheetSelfPrTool, getSkillSheetSkillsTool, updateSkillSheetSkillsTool, addSkillSheetSkillTool, updateSkillSheetSkillTool, deleteSkillSheetSkillTool, getSkillSheetProjectsTool, addSkillSheetProjectTool, updateSkillSheetProjectTool, deleteSkillSheetProjectTool, } from './handlers/index.js';
3
+ import { createMemoTool, searchMemoTool, getMemoTool, updateMemoTool, getCategoriesTool, createNoteTool, searchNotesTool, getNoteTool, updateNoteTool, listIdeasTool, createIdeaTool, updateIdeaTool, deleteIdeaTool, getSkillSheetTool, updateSkillSheetBasicInfoTool, updateSkillSheetSelfPrTool, getSkillSheetSkillsTool, updateSkillSheetSkillsTool, addSkillSheetSkillTool, updateSkillSheetSkillTool, deleteSkillSheetSkillTool, getSkillSheetProjectsTool, addSkillSheetProjectTool, updateSkillSheetProjectTool, deleteSkillSheetProjectTool, cacheStatusTool, syncRemoteMemosTool, scanSessionsTool, getSessionTranscriptTool, addKnowledgeCandidatesTool, listPendingCandidatesTool, savePendingCandidateTool, discardPendingCandidateTool, } from './handlers/index.js';
4
4
  export function setupTool(server, apiUrl, apiKey) {
5
5
  const apiClient = createApiClient(apiUrl, apiKey);
6
6
  const tools = [
@@ -29,6 +29,14 @@ export function setupTool(server, apiUrl, apiKey) {
29
29
  addSkillSheetProjectTool,
30
30
  updateSkillSheetProjectTool,
31
31
  deleteSkillSheetProjectTool,
32
+ cacheStatusTool,
33
+ syncRemoteMemosTool,
34
+ scanSessionsTool,
35
+ getSessionTranscriptTool,
36
+ addKnowledgeCandidatesTool,
37
+ listPendingCandidatesTool,
38
+ savePendingCandidateTool,
39
+ discardPendingCandidateTool,
32
40
  ];
33
41
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
34
42
  tools: tools.map((tool) => tool.definition),
package/dist/tool.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tool.js","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"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"}
@@ -9,4 +9,5 @@ export * from './idea.js';
9
9
  export * from './skill-sheet.js';
10
10
  export * from './tool.js';
11
11
  export * from './constants.js';
12
+ export * from './knowledge.js';
12
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=knowledge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/types/knowledge.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "paput-mcp",
3
- "version": "2.0.3",
3
+ "version": "2.1.0",
4
4
  "description": "PaPut MCP Server",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -41,8 +41,5 @@
41
41
  "prettier": "^3.5.3",
42
42
  "ts-node": "^10.9.2",
43
43
  "typescript": "^5.3.3"
44
- },
45
- "volta": {
46
- "node": "20.12.2"
47
44
  }
48
45
  }