paput-mcp 2.0.3 → 2.2.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 (70) hide show
  1. package/README.md +99 -131
  2. package/dist/cli/index.js +31 -0
  3. package/dist/cli/index.js.map +1 -0
  4. package/dist/cli/install-codex-skill.js +58 -0
  5. package/dist/cli/install-codex-skill.js.map +1 -0
  6. package/dist/cli/setup-ai.js +260 -0
  7. package/dist/cli/setup-ai.js.map +1 -0
  8. package/dist/handlers/add-knowledge-candidates/handler.js +68 -0
  9. package/dist/handlers/add-knowledge-candidates/handler.js.map +1 -0
  10. package/dist/handlers/add-knowledge-candidates/index.js +3 -0
  11. package/dist/handlers/add-knowledge-candidates/index.js.map +1 -0
  12. package/dist/handlers/add-knowledge-candidates/tool.js +36 -0
  13. package/dist/handlers/add-knowledge-candidates/tool.js.map +1 -0
  14. package/dist/handlers/cache-status/handler.js +22 -0
  15. package/dist/handlers/cache-status/handler.js.map +1 -0
  16. package/dist/handlers/cache-status/index.js +3 -0
  17. package/dist/handlers/cache-status/index.js.map +1 -0
  18. package/dist/handlers/cache-status/tool.js +13 -0
  19. package/dist/handlers/cache-status/tool.js.map +1 -0
  20. package/dist/handlers/discard-pending-candidate/handler.js +36 -0
  21. package/dist/handlers/discard-pending-candidate/handler.js.map +1 -0
  22. package/dist/handlers/discard-pending-candidate/index.js +3 -0
  23. package/dist/handlers/discard-pending-candidate/index.js.map +1 -0
  24. package/dist/handlers/discard-pending-candidate/tool.js +17 -0
  25. package/dist/handlers/discard-pending-candidate/tool.js.map +1 -0
  26. package/dist/handlers/get-session-transcript/handler.js +42 -0
  27. package/dist/handlers/get-session-transcript/handler.js.map +1 -0
  28. package/dist/handlers/get-session-transcript/index.js +3 -0
  29. package/dist/handlers/get-session-transcript/index.js.map +1 -0
  30. package/dist/handlers/get-session-transcript/tool.js +28 -0
  31. package/dist/handlers/get-session-transcript/tool.js.map +1 -0
  32. package/dist/handlers/index.js +8 -0
  33. package/dist/handlers/index.js.map +1 -1
  34. package/dist/handlers/list-pending-candidates/handler.js +19 -0
  35. package/dist/handlers/list-pending-candidates/handler.js.map +1 -0
  36. package/dist/handlers/list-pending-candidates/index.js +3 -0
  37. package/dist/handlers/list-pending-candidates/index.js.map +1 -0
  38. package/dist/handlers/list-pending-candidates/tool.js +18 -0
  39. package/dist/handlers/list-pending-candidates/tool.js.map +1 -0
  40. package/dist/handlers/save-pending-candidate/handler.js +80 -0
  41. package/dist/handlers/save-pending-candidate/handler.js.map +1 -0
  42. package/dist/handlers/save-pending-candidate/index.js +3 -0
  43. package/dist/handlers/save-pending-candidate/index.js.map +1 -0
  44. package/dist/handlers/save-pending-candidate/tool.js +20 -0
  45. package/dist/handlers/save-pending-candidate/tool.js.map +1 -0
  46. package/dist/handlers/scan-sessions/handler.js +26 -0
  47. package/dist/handlers/scan-sessions/handler.js.map +1 -0
  48. package/dist/handlers/scan-sessions/index.js +3 -0
  49. package/dist/handlers/scan-sessions/index.js.map +1 -0
  50. package/dist/handlers/scan-sessions/tool.js +27 -0
  51. package/dist/handlers/scan-sessions/tool.js.map +1 -0
  52. package/dist/handlers/sync-remote-memos/handler.js +42 -0
  53. package/dist/handlers/sync-remote-memos/handler.js.map +1 -0
  54. package/dist/handlers/sync-remote-memos/index.js +3 -0
  55. package/dist/handlers/sync-remote-memos/index.js.map +1 -0
  56. package/dist/handlers/sync-remote-memos/tool.js +22 -0
  57. package/dist/handlers/sync-remote-memos/tool.js.map +1 -0
  58. package/dist/index.js +4 -1
  59. package/dist/index.js.map +1 -1
  60. package/dist/services/local-cache/index.js +235 -0
  61. package/dist/services/local-cache/index.js.map +1 -0
  62. package/dist/services/session/index.js +124 -0
  63. package/dist/services/session/index.js.map +1 -0
  64. package/dist/tool.js +9 -1
  65. package/dist/tool.js.map +1 -1
  66. package/dist/types/index.js +1 -0
  67. package/dist/types/index.js.map +1 -1
  68. package/dist/types/knowledge.js +2 -0
  69. package/dist/types/knowledge.js.map +1 -0
  70. package/package.json +2 -5
@@ -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"}