hyperpocket 0.3.7__py3-none-any.whl → 0.4.0__py3-none-any.whl

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 (45) hide show
  1. hyperpocket/auth/provider.py +1 -0
  2. hyperpocket/auth/weaviate/context.py +12 -0
  3. hyperpocket/auth/weaviate/token_context.py +11 -0
  4. hyperpocket/auth/weaviate/token_handler.py +68 -0
  5. hyperpocket/auth/weaviate/token_schema.py +7 -0
  6. hyperpocket/cli/eject.py +2 -7
  7. hyperpocket/cli/pull.py +2 -7
  8. hyperpocket/config/settings.py +2 -1
  9. hyperpocket/pocket_core.py +41 -68
  10. hyperpocket/pocket_main.py +37 -16
  11. hyperpocket/repository/__init__.py +3 -4
  12. hyperpocket/repository/repository.py +6 -41
  13. hyperpocket/repository/tool_reference.py +28 -0
  14. hyperpocket/server/auth/weaviate.py +27 -0
  15. hyperpocket/server/server.py +127 -61
  16. hyperpocket/session/in_memory.py +13 -3
  17. hyperpocket/tool/__init__.py +0 -3
  18. hyperpocket/tool/dock/__init__.py +3 -0
  19. hyperpocket/tool/dock/dock.py +34 -0
  20. hyperpocket/tool/function/__init__.py +1 -1
  21. hyperpocket/tool/function/tool.py +62 -32
  22. hyperpocket/tool/tool.py +1 -9
  23. hyperpocket/tool_like.py +2 -1
  24. hyperpocket/util/generate_slug.py +4 -0
  25. hyperpocket/util/json_schema_to_model.py +5 -1
  26. {hyperpocket-0.3.7.dist-info → hyperpocket-0.4.0.dist-info}/METADATA +4 -1
  27. {hyperpocket-0.3.7.dist-info → hyperpocket-0.4.0.dist-info}/RECORD +30 -36
  28. hyperpocket/cli/sync.py +0 -17
  29. hyperpocket/repository/lock.py +0 -240
  30. hyperpocket/repository/lockfile.py +0 -62
  31. hyperpocket/server/tool/__init__.py +0 -10
  32. hyperpocket/server/tool/dto/script.py +0 -33
  33. hyperpocket/server/tool/wasm.py +0 -46
  34. hyperpocket/tool/wasm/README.md +0 -166
  35. hyperpocket/tool/wasm/__init__.py +0 -3
  36. hyperpocket/tool/wasm/browser.py +0 -63
  37. hyperpocket/tool/wasm/invoker.py +0 -41
  38. hyperpocket/tool/wasm/script.py +0 -134
  39. hyperpocket/tool/wasm/templates/__init__.py +0 -35
  40. hyperpocket/tool/wasm/templates/node.py +0 -87
  41. hyperpocket/tool/wasm/templates/python.py +0 -93
  42. hyperpocket/tool/wasm/tool.py +0 -163
  43. /hyperpocket/{server/tool/dto → auth/weaviate}/__init__.py +0 -0
  44. {hyperpocket-0.3.7.dist-info → hyperpocket-0.4.0.dist-info}/WHEEL +0 -0
  45. {hyperpocket-0.3.7.dist-info → hyperpocket-0.4.0.dist-info}/entry_points.txt +0 -0
@@ -2,15 +2,15 @@ hyperpocket/__init__.py,sha256=VVLbApRTiULqEVQp6lCNOcuXKx9V62O_7C9VNKBQ0G0,137
2
2
  hyperpocket/builtin.py,sha256=SOrVrNjoKadDMksfB1rt6pKreJFzHG2YGBsLGVsg72c,2385
3
3
  hyperpocket/constants.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  hyperpocket/pocket_auth.py,sha256=VzpGpHOOQIiEgrk1sYg5DYa5WYV6gRQmFlm8Kb2C9V0,17611
5
- hyperpocket/pocket_core.py,sha256=qa6V4RAdnjtO6CbKiNaUYk--Mq8PVl2APlqCmqrCBt8,11081
6
- hyperpocket/pocket_main.py,sha256=ZSj0107pBBXx_pFKzggjEpm68Y1tQpDyYc2O_QDb4qQ,9628
5
+ hyperpocket/pocket_core.py,sha256=WkY7Dp7KcJTORAFNuxDbZ5PDgicRANUtKkpZmI5gg6s,10021
6
+ hyperpocket/pocket_main.py,sha256=XH0wlT1AafZDItgbYBkoo0dSb0z6Tcvl8AC9puXe8mg,10215
7
7
  hyperpocket/prompts.py,sha256=N1bCzCLZvGUVhH1Vn_cgeBPsdY3MdIU7ZGqVgexoj5E,472
8
- hyperpocket/tool_like.py,sha256=5JgHZFEFu-GcZZl5pwkUqHeABUpN3nyJdtKJHtEjpHU,135
8
+ hyperpocket/tool_like.py,sha256=lUk9kUHPUmugqHCLbnWflKtZbCwtgcoYWtqGqUQtV38,187
9
9
  hyperpocket/auth/README.md,sha256=zn4QqnFZCA_4X3x8Wb6lE3OP5otYxpByZaCiUkBvaNs,11562
10
10
  hyperpocket/auth/__init__.py,sha256=pO8M6SAuq0EPqi848_Iy650wqaLekx98e3RRnEAM_r0,607
11
11
  hyperpocket/auth/context.py,sha256=m-j2gDYUKBMsiakLHsu9thhM4dYyFiXP0Wp0S_iC0bU,1303
12
12
  hyperpocket/auth/handler.py,sha256=5cusl9ANEyG3gORVFjqh709txC0alw6eKtxgV6wjf6k,6683
13
- hyperpocket/auth/provider.py,sha256=bTJn6Atm4E9nm9vf8Ggudf7-XxAWMOIPo6xiZnGqDvM,2035
13
+ hyperpocket/auth/provider.py,sha256=7oRpa3ImMdQPXp2-VwTF3tZGhPkyIe0cOgQCJcljzgQ,2061
14
14
  hyperpocket/auth/schema.py,sha256=pl4oRTNj8PdqQg6UVPWf8ei2uYQ4DtOmmD58cVFMYQw,537
15
15
  hyperpocket/auth/activeloop/README.md,sha256=xp8n0itbY9VNt8XEvCAE4Ealvj4uf_f1uSZyWG4Q5FE,172
16
16
  hyperpocket/auth/activeloop/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -428,6 +428,11 @@ hyperpocket/auth/wandb/context.py,sha256=YKtk8yz-LnKHMwLs0CGZ3HUqvvtS6J2eAWQ7B-Z
428
428
  hyperpocket/auth/wandb/token_context.py,sha256=TFE_r8eMHeUzCMpM91SIy668GHpu_NxFpqmmMoEuaDw,437
429
429
  hyperpocket/auth/wandb/token_handler.py,sha256=WBsli6ZJPXVTKKDz9c_UIXQ15SfzWvxNZVeZWa1RuwE,2789
430
430
  hyperpocket/auth/wandb/token_schema.py,sha256=AEDE-HkS-lSDzMdARETDO0xyPvBbHxqLXFAzbkIusFA,207
431
+ hyperpocket/auth/weaviate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
432
+ hyperpocket/auth/weaviate/context.py,sha256=RnoxPR1awSmi4VNB8tIfKJvm1JDqbIMAwDNZEOvGt6M,427
433
+ hyperpocket/auth/weaviate/token_context.py,sha256=AG_1r_pa8O-5Y35nwS-RAK31WACO8PI1dqcHFB3FGNg,485
434
+ hyperpocket/auth/weaviate/token_handler.py,sha256=YQRu_XEOHSIH_xCM9kRPuKLbroEQWzpFoBXj_pWcdRs,2733
435
+ hyperpocket/auth/weaviate/token_schema.py,sha256=ajXoOyglBD-8SpfQhStduhDe1_uV5YfzebMnXmLcd_M,273
431
436
  hyperpocket/auth/workiom/README.md,sha256=icnFTBhr_RPIBJCv21JyP6hxjmZsLLQXTEluBfpwVII,301
432
437
  hyperpocket/auth/workiom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
433
438
  hyperpocket/auth/workiom/context.py,sha256=N6sD3gfycGCr5xvxF3CFfxR3ufU1_cgKKjRkpTqD3-A,429
@@ -455,9 +460,8 @@ hyperpocket/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
455
460
  hyperpocket/cli/__main__.py,sha256=f9qvOb33F5edNjP_eyshT1F8SjofV3bwLFl8lAru_u8,813
456
461
  hyperpocket/cli/auth_oauth2.py,sha256=FTsaIrJY9U1uDEtZL456zOWQKfcqzOPg33ikFhFFjyA,4899
457
462
  hyperpocket/cli/auth_token.py,sha256=YV1AK70Q_hNsm_xwHP5LTaUWI-omssnX8214JyD3m_w,4875
458
- hyperpocket/cli/eject.py,sha256=Te1YhDONk_VCgZ6l2HjLqONJrn04EfPk19sD6D5SOyY,636
459
- hyperpocket/cli/pull.py,sha256=3xCyTmdbP77l7awNyCY63_ZmUhIlX1PE3apwReXNYco,549
460
- hyperpocket/cli/sync.py,sha256=OO5zFrLOMXk7TSAFEew04ZzW4HLoQ1uVb80UKvIJha0,517
463
+ hyperpocket/cli/eject.py,sha256=utzeL4t02ML-EIgpPUiFjCbycjRpvkP1905bLeZAT2Y,321
464
+ hyperpocket/cli/pull.py,sha256=JnoIsmQwJODWOuilmKR5KKFsdMZ0Ht7pCWIbENJuYfw,275
461
465
  hyperpocket/cli/tool_create.py,sha256=1tsVw_sy28JmeCSXT1j-7dqOsDXzvZPTNqcmHchtcpI,3996
462
466
  hyperpocket/cli/tool_export.py,sha256=NRfssftdb1HEj9DtdM7rh6_rFs1hydYyjpDe7V8kFzU,8060
463
467
  hyperpocket/cli/codegen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -477,16 +481,15 @@ hyperpocket/config/auth.py,sha256=OOVdaAfMva6b-Kz4iy5YpnIKjT5WgcQ17toFzHqoRPY,21
477
481
  hyperpocket/config/git.py,sha256=CGbY7J1LyN4ccZr9CFGAQwwhjC9kvdU0On_nsAsZ1FQ,362
478
482
  hyperpocket/config/logger.py,sha256=T5LESHvQfl2q1F-7FjsVfrz9fWz6jxPo7u6Jml3CQjc,2804
479
483
  hyperpocket/config/session.py,sha256=1ng1mARv4R_07SF5CkZWLgX9pNeXTcM0knCRw07Fpms,816
480
- hyperpocket/config/settings.py,sha256=HhtlrX_NP6yx59_1uzBEVbmwzk6m_2DV7JQ_b3aPPLs,2373
484
+ hyperpocket/config/settings.py,sha256=aw3TiPepcmSOKsIXDFHBhhqD2Ubz-51xRbFHZ5qx8KY,2437
481
485
  hyperpocket/futures/__init__.py,sha256=IObmC6hKC_Rc3vwOzINUVJ1hU2MDB5BUfXuH0vlSjtE,136
482
486
  hyperpocket/futures/futurestore.py,sha256=TVbCPf4HLKc32ol7e-oZckXMPPBKBvmjKmQAM1xj0dI,1329
483
- hyperpocket/repository/__init__.py,sha256=ExLIim8eauewS-xxpL6FdgfwmCZJU_8oMrstwTHKTi4,219
484
- hyperpocket/repository/lock.py,sha256=3cHj516sZW5S4fen3-UfqzOnmBtg10wPp6Lja97WPoM,8546
485
- hyperpocket/repository/lockfile.py,sha256=pCz7keGT8P8G_8QPUFndNYNObjAY0q9ySGJHfcmqWIg,2183
486
- hyperpocket/repository/repository.py,sha256=AHQ-E7B42wAxrJ_pYZ8hdTr8pxUzOb2kWD8YWlrphtQ,1349
487
+ hyperpocket/repository/__init__.py,sha256=ML7XfV1SgcEiOBgQpfqjsT8QEKJbGQG3sVRqi_iAxqA,168
488
+ hyperpocket/repository/repository.py,sha256=KvgZnJW_TrBzaLWV0DxjReLklkni1oyLq856OyjJ__A,129
489
+ hyperpocket/repository/tool_reference.py,sha256=Nuc2ckWuH_5K-p8S_0IuJiaJiPE6XWchA2XM71nOTjM,554
487
490
  hyperpocket/server/__init__.py,sha256=8laNl098-IkFkarqwOZs_gm6yG0q3NAObq4cCUxK_Tw,90
488
491
  hyperpocket/server/proxy.py,sha256=ItM1qfuUBs6QiPqIpErBWUZWdtsEf0twPJY5r2UUFBU,2042
489
- hyperpocket/server/server.py,sha256=0RB5cm9ZwSYno8F6Urk6VP10V0-QAl0NIeqHONtllNA,8793
492
+ hyperpocket/server/server.py,sha256=_kRWyoBJPcInbJTU_64MTv5Dbjpm9_oksix2Ow_0_Ko,11332
490
493
  hyperpocket/server/auth/__init__.py,sha256=IMjz9PCzD7qh4QIf2g-gWIdkDeU36jt-9F55vaHvLoM,286
491
494
  hyperpocket/server/auth/activeloop.py,sha256=MHh43F0j6q0r-GcevwD41ewLXdaPHfhLT9bCLuL7puU,739
492
495
  hyperpocket/server/auth/adobe.py,sha256=HH6elxV3ELWUnTRlkQBBFSXMHAc0angRUfHHkZVA4Kg,437
@@ -555,45 +558,36 @@ hyperpocket/server/auth/timekit.py,sha256=8pC-DT_gbm6vmd1oZaquD4Z68998BEDb1nYVAI
555
558
  hyperpocket/server/auth/token.py,sha256=Yq5Ym-uEO_3cBpQOsmCBuqtFIdImrNcVUgF5ozs5NHk,1763
556
559
  hyperpocket/server/auth/trello.py,sha256=1T3ez62h8-KMvu2Zj1Tyv2afgqLUbtG2LM4QbISLOGA,441
557
560
  hyperpocket/server/auth/wandb.py,sha256=jfwg-lQVrr5TgEL7QETnaFucDvi057SJvVZlBe7cOqQ,709
561
+ hyperpocket/server/auth/weaviate.py,sha256=WnBQu4H9mOGYEq7JcGqUkk3QXRO8FpGa9TLRHMQfpCE,732
558
562
  hyperpocket/server/auth/workiom.py,sha256=0apFB5-3rmcJaQeEl1_XZ_QlsZORdq8kixJBGkTpZ3Y,445
559
563
  hyperpocket/server/auth/x.py,sha256=CYCD_ajBY6Jt04E2bSEBZFRRIUZmNjF2gn6F0ZV5XuA,450
560
564
  hyperpocket/server/auth/zinc.py,sha256=xgVV5lWP6YSEHTCmH0gipG5lh4Wvf716tHTnOvTTj3w,708
561
565
  hyperpocket/server/auth/zoom.py,sha256=kWp4MB4i9FKMA4ZYcj4g4_90Y1ZMEoAQTTjbb0rsMRs,703
562
- hyperpocket/server/tool/__init__.py,sha256=khNLe3H2W7WXKQlHjXuuvd9R87eHOAZhDsQmjDcbYsg,210
563
- hyperpocket/server/tool/wasm.py,sha256=VJyp6RGsq8llKT_sY6DhV52wsETu-W9bzJ7C9wC17Oo,1698
564
- hyperpocket/server/tool/dto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
565
- hyperpocket/server/tool/dto/script.py,sha256=2z5_QFhmNtbuau0De0GYUS0K1t6o81od9QLmfr97iZM,852
566
566
  hyperpocket/session/README.md,sha256=Wmh-qWJQ-40vU9hP5jNxuM33i0STNfaIjOecba7H-oc,1968
567
567
  hyperpocket/session/__init__.py,sha256=ljqLlIMsrY9Hb8UOweaEvBM_Ku9IxBMMIXar6T7h5Lg,275
568
- hyperpocket/session/in_memory.py,sha256=Eb-oaFrA38iG7eO6SWpxsz36olgDD8OaE5mjxdvYwl4,3504
568
+ hyperpocket/session/in_memory.py,sha256=sYFBIc0w4sxSj28j9pkdtn_Oga8a-lsi4YJRvSFA_Jc,3799
569
569
  hyperpocket/session/interface.py,sha256=vQobJCzQe29uM6yXanRAysUhJvtfuUZ0qddMpeLn8NI,4964
570
570
  hyperpocket/session/redis.py,sha256=rbW2b0C6HUNp5HpTpr6sxDKZQCuPHu2ipCyn1TXjPgM,5444
571
571
  hyperpocket/tool/README.md,sha256=vbHvP3fnfihq-H481MiSZEVJNhVoUu0djENb9tiy78c,3026
572
- hyperpocket/tool/__init__.py,sha256=3rpvo5k76VX97gvnlHlCfi5TTtCZmzc7GuQORaJdUqU,347
573
- hyperpocket/tool/tool.py,sha256=CX_eAtpVRcF0H64u7qa7nZgkMa0DEKdVQj4HqF8f1GA,7365
572
+ hyperpocket/tool/__init__.py,sha256=ZwGG7_MfTUigAdHxdR-s3NMFm_QdJDoKNeVrTmFsZSo,253
573
+ hyperpocket/tool/tool.py,sha256=3ApLB7mpo_xCnpvQKE7KdxY7cHVweZ-iExJEkovyfbI,7029
574
+ hyperpocket/tool/dock/__init__.py,sha256=gEFaYTgTIzzaAHW6Bl1CJL8RQlU23NK--bojLqPTLSc,63
575
+ hyperpocket/tool/dock/dock.py,sha256=Uk3Lggmj_piGFiPVde2ZvRXOKncIYqjPaRQ3LD8DWT0,859
574
576
  hyperpocket/tool/function/README.md,sha256=6Y9a8FlFjEdbrVqF0NoQ1j34VoV8Zt6Pf9-xlLIHkTc,3676
575
- hyperpocket/tool/function/__init__.py,sha256=2zV5ojuzvv38B9J-5l6XomZ3x-8FTC0-Bow5FdioTIU,245
577
+ hyperpocket/tool/function/__init__.py,sha256=n0IYvfoyoFWv76iwK2kBC-X6468dl5XyYFl1mudYSe4,261
576
578
  hyperpocket/tool/function/annotation.py,sha256=mHm_TN2X7xmivBZ8_tbnsaGt_GUQZ-l2IPv0PudZKb8,982
577
- hyperpocket/tool/function/tool.py,sha256=FVEn8i3HJaG2S-LuBgRc4DJUYWWplsGs0nRmuVstLZQ,6280
579
+ hyperpocket/tool/function/tool.py,sha256=HwsTI__DapAoYxQMuy45ivD4Lxyd7_-MO0GHlqfuI5c,7466
578
580
  hyperpocket/tool/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
579
- hyperpocket/tool/wasm/README.md,sha256=DjHtzOS4oe4Mk39M8BfxE0N_hqds32KXx2OWJ2cJOGo,3866
580
- hyperpocket/tool/wasm/__init__.py,sha256=t6KwkMY0pwZheCf9Q-9Kt7HGHQU7U--b9TTKgNegWUY,72
581
- hyperpocket/tool/wasm/browser.py,sha256=JWn34P1ybPJCogBB85BePWFXM4AqOI2wSbIb5LcCXTs,1867
582
- hyperpocket/tool/wasm/invoker.py,sha256=jgW3XqdbAXgDjTlURmD2Xeh5qpjZgvB6PYzNlcdvfQc,1431
583
- hyperpocket/tool/wasm/script.py,sha256=qi7uYkXxMGV5aZTnUllqp-LoJtlUd3HNadYeqv4UGgc,4348
584
- hyperpocket/tool/wasm/tool.py,sha256=sw0njNvucoXRikKHzALWec_w04LjUVZfTpvL5xAVeGE,5241
585
- hyperpocket/tool/wasm/templates/__init__.py,sha256=YWHy035YflIbQsQth0VCQoqO1PQ0aKmG6vYIkTLv2XA,920
586
- hyperpocket/tool/wasm/templates/node.py,sha256=4nSrKX1Qc7WH_yIJ-56xdRjd-1Xmrvf4sR0CphggMGE,2783
587
- hyperpocket/tool/wasm/templates/python.py,sha256=rhJTzb1jULiyhTBIhMesy_-Sc-Z9lLkgFM37RjWSYrw,2734
588
581
  hyperpocket/util/__init__.py,sha256=7vN8c7dy7nhGhjXtSUGAsc6GIlUnuBMvXSl1yW1M4js,35
589
582
  hyperpocket/util/extract_func_param_desc_from_docstring.py,sha256=eGDrbigmVg1zaud1q5l2WDZkYqzy56TRznNPouc8i_Y,4170
590
583
  hyperpocket/util/find_all_leaf_class_in_package.py,sha256=06n8R47BDPovxhCOnzu9GuEfeQzEbv-HdG-zfMu1gBw,533
591
584
  hyperpocket/util/find_all_subclass_in_package.py,sha256=TtEb41-nzCNhC9pgelTS6MMxLT_JNZkFPJe5z2H9yik,978
592
585
  hyperpocket/util/flatten_json_schema.py,sha256=iuNBEmMSKFtPi-uqo6fb3RWN0koHOAihWAAofWbd1U8,1671
593
586
  hyperpocket/util/function_to_model.py,sha256=TXUs-qPbzL8C9-qqpz4Ad4D9MOPP61n_p0iPU6SoBeM,2318
587
+ hyperpocket/util/generate_slug.py,sha256=gwwf9gfTlqribrvybMQQj7VIHX5FspVoTm5-EYH-X74,150
594
588
  hyperpocket/util/get_objects_from_subpackage.py,sha256=4mR_S8eaJSdU68YfCkiXeIcXxb6q7LjFGsY_IHeNIZw,929
595
- hyperpocket/util/json_schema_to_model.py,sha256=PqI87pU5dWwcrQWB8eQxRdfgAEvvC1x_DKZnhcsRV-o,3586
596
- hyperpocket-0.3.7.dist-info/METADATA,sha256=oZuYOmr2Tx0PdrjFsKiptOTJP5eUffygor8VdhNITOU,12958
597
- hyperpocket-0.3.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
598
- hyperpocket-0.3.7.dist-info/entry_points.txt,sha256=KpBleaYr0SaENXOa-dFvJ_cvFCHYFEQ4LMl11ShAcBI,61
599
- hyperpocket-0.3.7.dist-info/RECORD,,
589
+ hyperpocket/util/json_schema_to_model.py,sha256=BNTFYzBK-yZr2VkO6lAdZkXdZXfGSabzWa3DM6it4KI,3731
590
+ hyperpocket-0.4.0.dist-info/METADATA,sha256=ldzb1IY6csgV76cTF-pXdYOiqkmxV-xR-fsEEgy5KRg,13074
591
+ hyperpocket-0.4.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
592
+ hyperpocket-0.4.0.dist-info/entry_points.txt,sha256=KpBleaYr0SaENXOa-dFvJ_cvFCHYFEQ4LMl11ShAcBI,61
593
+ hyperpocket-0.4.0.dist-info/RECORD,,
hyperpocket/cli/sync.py DELETED
@@ -1,17 +0,0 @@
1
- import pathlib
2
- from typing import Optional
3
-
4
- import click
5
-
6
- import hyperpocket.repository as repository
7
-
8
-
9
- @click.command()
10
- @click.option("--lockfile", envvar="PATHS", type=click.Path(exists=True))
11
- @click.option("--force-update", type=str, default="HEAD")
12
- def sync(lockfile: Optional[pathlib.Path], force_update: bool):
13
- if not lockfile:
14
- lockfile = pathlib.Path.cwd() / "pocket.lock"
15
- if not lockfile.exists():
16
- lockfile.touch()
17
- repository.sync(repository.Lockfile(path=lockfile), force_update)
@@ -1,240 +0,0 @@
1
- import abc
2
- import pathlib
3
- import shutil
4
- from typing import Optional, Tuple, ClassVar
5
-
6
- import git
7
- from pydantic import BaseModel, Field
8
- from pydantic.fields import ModelPrivateAttr
9
-
10
- from hyperpocket.config import pocket_logger, settings
11
-
12
-
13
- class Lock(BaseModel, abc.ABC):
14
- tool_source: str = None
15
-
16
- @abc.abstractmethod
17
- def __str__(self):
18
- raise NotImplementedError
19
-
20
- @abc.abstractmethod
21
- def key(self) -> tuple[str, ...]:
22
- raise NotImplementedError
23
-
24
- @abc.abstractmethod
25
- def sync(self, **kwargs):
26
- raise NotImplementedError
27
-
28
- @abc.abstractmethod
29
- def toolpkg_path(self) -> pathlib.Path:
30
- raise NotImplementedError
31
-
32
- def eject_to_path(self, dest_path: pathlib.Path, src_sub_path: str = None):
33
- ## local locks are already tracked by git
34
- raise NotImplementedError
35
-
36
-
37
- class LocalLock(Lock):
38
- tool_source: str = Field(default="local")
39
- tool_path: str
40
-
41
- def __init__(self, tool_path: str):
42
- super().__init__(
43
- tool_source="local", tool_path=str(pathlib.Path(tool_path).resolve())
44
- )
45
-
46
- def __str__(self):
47
- return f"local\t{self.tool_path}"
48
-
49
- def key(self):
50
- return self.tool_source, self.tool_path.rstrip("/")
51
-
52
- def sync(self, **kwargs):
53
- pocket_logger.info(f"Syncing path: {self.tool_path} ...")
54
- pkg_path = self.toolpkg_path()
55
- if pkg_path.exists():
56
- shutil.rmtree(pkg_path)
57
- shutil.copytree(self.tool_path, pkg_path)
58
-
59
- def toolpkg_path(self) -> pathlib.Path:
60
- pocket_pkgs = settings.toolpkg_path
61
- return pocket_pkgs / "local" / self.tool_path[1:]
62
-
63
-
64
- class GitLock(Lock):
65
- _remote_cache: ClassVar[dict[str, dict[str, str]]]
66
- tool_source: str = "git"
67
- repository_url: str
68
- git_ref: str
69
- ref_sha: Optional[str] = None
70
-
71
- def __str__(self):
72
- return f"git\t{self.repository_url}\t{self.git_ref}\t{self.ref_sha}"
73
-
74
- def key(self):
75
- return self.tool_source, self.repository_url.rstrip("/"), self.git_ref
76
-
77
- def toolpkg_path(self) -> pathlib.Path:
78
- if not self.ref_sha:
79
- raise ValueError("ref_sha is not set")
80
- cleansed_url = self.repository_url
81
- if self.repository_url.startswith("http://"):
82
- cleansed_url = self.repository_url[7:]
83
- elif self.repository_url.startswith("https://"):
84
- cleansed_url = self.repository_url[8:]
85
- elif self.repository_url.startswith("git@"):
86
- cleansed_url = self.repository_url[4:]
87
- return settings.toolpkg_path / cleansed_url / self.ref_sha
88
-
89
- def sync(self, force_update: bool = False, **kwargs):
90
- """
91
- Synchronize the local git repository with the target remote branch.
92
-
93
- 1. Check if the SHA of the target ref in the remote repository matches the current local SHA.
94
- 2. If they do not match, fetch the target ref from the remote repository and do a hard reset
95
- to align the local repository with the remote version.
96
- """
97
- try:
98
- pocket_logger.info(
99
- f"Syncing git: {self.repository_url} @ ref: {self.git_ref} ..."
100
- )
101
-
102
- # get new sha from refs
103
- new_sha = self._get_new_sha_if_exists_in_remote()
104
- if new_sha is None:
105
- raise ValueError(
106
- f"Could not find ref {self.git_ref} in {self.repository_url}"
107
- )
108
-
109
- # check self.ref_sha should be updated
110
- if self.ref_sha != new_sha:
111
- if force_update or self.ref_sha is None:
112
- self.ref_sha = new_sha
113
-
114
- # make pkg_version_path dir if not exists
115
- pkg_version_path = self.toolpkg_path()
116
- if not pkg_version_path.exists():
117
- pkg_version_path.mkdir(parents=True)
118
-
119
- # init git repo in local and set origin url
120
- repo = git.Repo.init(pkg_version_path)
121
- try:
122
- remote = repo.remote("origin")
123
- remote.set_url(self.repository_url)
124
- except ValueError:
125
- remote = repo.create_remote("origin", self.repository_url)
126
-
127
- # check current local commit include new_sha
128
- # if not included, fetch and do hard reset
129
- exist_sha = None
130
- try:
131
- exist_sha = repo.head.commit.hexsha
132
- except ValueError:
133
- pass
134
- if exist_sha is None or exist_sha != self.ref_sha:
135
- remote.fetch(depth=1, refspec=self.ref_sha)
136
- repo.git.checkout(new_sha)
137
- repo.git.reset("--hard", new_sha)
138
- repo.git.clean("-fd")
139
- except Exception as e:
140
- pocket_logger.error(
141
- f"failed to sync git: {self.repository_url} @ ref: {self.git_ref}. reason : {e}"
142
- )
143
- raise e
144
-
145
- def _get_new_sha_if_exists_in_remote(self):
146
- """
147
- get new sha in refs
148
- First, check remote sha is matched to saved ref_sha
149
- Second, check remote ref name is matched to saved ref name
150
- Third, check local ref name is matched to saved ref name
151
- And last, check tag ref name is matched to saved ref name
152
- """
153
- refs = git.cmd.Git().ls_remote(self.repository_url)
154
-
155
- new_sha = None
156
- for r in refs.split("\n"):
157
- sha, ref = r.split("\t")
158
- if sha == self.ref_sha:
159
- new_sha = sha
160
- break
161
- elif ref == self.git_ref:
162
- new_sha = sha
163
- break
164
- elif ref == f"refs/heads/{self.git_ref}":
165
- new_sha = sha
166
- break
167
- elif ref == f"refs/tags/{self.git_ref}":
168
- new_sha = sha
169
- break
170
- return new_sha
171
-
172
- @classmethod
173
- def get_git_branches(cls, repo_url):
174
- if not hasattr(cls, "_remote_cache"):
175
- cls._remote_cache = {}
176
- if cls._remote_cache.get(repo_url) is None:
177
- ls_lists = git.cmd.Git().ls_remote(repo_url)
178
-
179
- branches = {}
180
- for line in ls_lists.split("\n"):
181
- sha, ref = line.split("\t")
182
- if ref.startswith("refs/heads/"):
183
- branch_name = ref.replace("refs/heads/", "")
184
- branches[branch_name] = sha
185
- cls._remote_cache[repo_url] = branches
186
- return cls._remote_cache[repo_url]
187
-
188
- @classmethod
189
- def parse_repo_url(cls, repo_url: str) -> Tuple[str, str, str]:
190
- """
191
- Parses a GitHub repository URL with optional branch and path information.
192
-
193
- Returns:
194
- Tuple[str, str, str]: base_repo, branch_name, directory_path
195
- """
196
- if not repo_url.startswith("https://github.com/"):
197
- raise AttributeError("Only GitHub URLs are supported")
198
-
199
- # Remove the base URL and split the path
200
- repo_path = repo_url.removeprefix("https://github.com/")
201
- repo_path_list = repo_path.split("/")
202
-
203
- # Check if the URL contains 'tree' (indicating branch and sub-path information)
204
- if "tree" not in repo_path_list:
205
- # If no 'tree', return the full repository URL
206
- return repo_url, "HEAD", ""
207
-
208
- # Parse base repo URL and remaining path
209
- tree_index = repo_path_list.index("tree")
210
- base_repo = f"https://github.com/{'/'.join(repo_path_list[:tree_index])}"
211
- sub_path = repo_path_list[tree_index + 1 :]
212
-
213
- # Fetch branch information
214
- branches = cls.get_git_branches(base_repo)
215
-
216
- # Find branch and sub-directory path
217
- for idx in range(1, len(sub_path) + 1):
218
- branch_name = "/".join(sub_path[:idx])
219
- if branch_name in branches:
220
- directory_path = (
221
- "/".join(sub_path[idx:]) if idx < len(sub_path) else None
222
- )
223
- return base_repo, branch_name, directory_path
224
-
225
- # If no valid branch is found, raise an error
226
- raise ValueError("Branch not found in repository")
227
-
228
- def eject_to_path(self, dest_path: pathlib.Path, src_sub_path: str = None):
229
- # clone the git repository to the target path
230
- pocket_logger.info(
231
- f"Ejecting git: {self.repository_url} @ ref: {self.git_ref} source in path: {src_sub_path} to {dest_path} ..."
232
- )
233
- if dest_path.exists():
234
- shutil.rmtree(dest_path)
235
-
236
- if src_sub_path:
237
- src_path = self.toolpkg_path() / src_sub_path
238
- else:
239
- src_path = self.toolpkg_path()
240
- shutil.copytree(src_path, dest_path)
@@ -1,62 +0,0 @@
1
- import pathlib
2
- from concurrent.futures.thread import ThreadPoolExecutor
3
-
4
- from hyperpocket.repository.lock import GitLock, LocalLock, Lock
5
-
6
-
7
- class Lockfile:
8
- path: pathlib.Path = None
9
- locks: dict[tuple, Lock] = None
10
- referenced_locks: set[tuple] = None
11
-
12
- def __init__(self, path: pathlib.Path):
13
- self.path = path
14
- self.locks = {}
15
- self.referenced_locks = set()
16
- if self.path.exists():
17
- with open(self.path, "r") as f:
18
- for line in f:
19
- split = line.strip().split("\t")
20
- source = split[0]
21
- if source == "local":
22
- lock = LocalLock(tool_path=split[1])
23
- elif source == "git":
24
- lock = GitLock(
25
- repository_url=split[1],
26
- git_ref=split[2],
27
- ref_sha=split[3],
28
- )
29
- else:
30
- raise ValueError(f"Unknown tool source: {source}")
31
- self.locks[lock.key()] = lock
32
- else:
33
- self.path.touch()
34
-
35
- def add_lock(self, lock: Lock):
36
- if lock.key() not in self.locks:
37
- self.locks[lock.key()] = lock
38
- self.referenced_locks.add(lock.key())
39
-
40
- def remove_lock(self, key: tuple[str, ...]):
41
- self.locks.pop(key)
42
- if key in self.referenced_locks:
43
- self.referenced_locks.remove(key)
44
-
45
- def get_lock(self, key: tuple[str, ...]):
46
- return self.locks[key]
47
-
48
- def sync(self, force_update: bool, referenced_only: bool = False):
49
- if referenced_only:
50
- locks = [self.get_lock(key) for key in self.referenced_locks]
51
- else:
52
- locks = list(self.locks.values())
53
- with ThreadPoolExecutor(
54
- max_workers=min(len(locks) + 1, 100), thread_name_prefix="repository_loader"
55
- ) as executor:
56
- executor.map(lambda lock: lock.sync(force_update=force_update), locks)
57
- self.write()
58
-
59
- def write(self):
60
- with open(self.path, "w") as f:
61
- for lock in self.locks.values():
62
- f.write(str(lock) + "\n")
@@ -1,10 +0,0 @@
1
- from fastapi import APIRouter
2
-
3
- from hyperpocket.server.tool.wasm import wasm_tool_router
4
-
5
- tool_router = APIRouter(
6
- prefix="/tools",
7
- )
8
- tool_router.include_router(wasm_tool_router)
9
-
10
- __all__ = ["tool_router"]
@@ -1,33 +0,0 @@
1
- from typing import Optional
2
-
3
- from pydantic import BaseModel, Field
4
-
5
- from hyperpocket.tool.wasm.script import ScriptFileNode
6
-
7
-
8
- class Script(BaseModel):
9
- id: str = Field(alias="id")
10
- tool_id: str = Field(alias="tool_id")
11
-
12
-
13
- class ScriptResult(BaseModel):
14
- stdout: Optional[str] = Field(alias="stdout", default=None)
15
- stderr: Optional[str] = Field(alias="stderr", default=None)
16
- error: Optional[str] = Field(alias="error", default=None)
17
-
18
-
19
- class ScriptFileTree(BaseModel):
20
- tree: dict[str, ScriptFileNode] = Field(alias="tree")
21
-
22
-
23
- class ScriptEntrypoint(BaseModel):
24
- package_name: Optional[str] = Field(alias="package_name")
25
- entrypoint: str = Field(alias="entrypoint")
26
-
27
-
28
- class ScriptEncodedFile(BaseModel):
29
- encoded_file: str = Field(alias="encoded_file")
30
-
31
-
32
- class ScriptFileRequest(BaseModel):
33
- path: str = Field(alias="path")
@@ -1,46 +0,0 @@
1
- from fastapi import APIRouter
2
- from fastapi.responses import FileResponse, HTMLResponse
3
-
4
- from hyperpocket.futures import FutureStore
5
- from hyperpocket.server.tool.dto import script as scriptdto
6
- from hyperpocket.tool.wasm.script import ScriptStore
7
-
8
- wasm_tool_router = APIRouter(prefix="/wasm")
9
-
10
-
11
- @wasm_tool_router.get("/scripts/{script_id}/browse", response_class=HTMLResponse)
12
- async def browse_script_page(script_id: str):
13
- html = ScriptStore.get_script(script_id).rendered_html
14
- return HTMLResponse(content=html)
15
-
16
-
17
- @wasm_tool_router.post("/scripts/{script_id}/done")
18
- async def done_script_page(
19
- script_id: str, req: scriptdto.ScriptResult
20
- ) -> scriptdto.ScriptResult:
21
- FutureStore.resolve_future(
22
- script_id, {"stdout": req.stdout, "stderr": req.stderr, "error": req.error}
23
- )
24
- return req
25
-
26
-
27
- @wasm_tool_router.get("/scripts/{script_id}/file_tree")
28
- async def get_file_tree(script_id: str) -> scriptdto.ScriptFileTree:
29
- script = ScriptStore.get_script(script_id)
30
- return scriptdto.ScriptFileTree(tree=script.load_file_tree())
31
-
32
-
33
- @wasm_tool_router.get("/scripts/{script_id}/entrypoint")
34
- async def get_entrypoint(script_id: str) -> scriptdto.ScriptEntrypoint:
35
- script = ScriptStore.get_script(script_id)
36
- package_name = script.package_name
37
- entrypoint = f"/tools/wasm/scripts/{script_id}/file/{script.entrypoint}"
38
- return scriptdto.ScriptEntrypoint(package_name=package_name, entrypoint=entrypoint)
39
-
40
-
41
- @wasm_tool_router.get(
42
- "/scripts/{script_id}/file/{file_name}", response_class=FileResponse
43
- )
44
- async def get_dist_file(script_id: str, file_name: str):
45
- script = ScriptStore.get_script(script_id)
46
- return FileResponse(script.dist_file_path(file_name))