test chat edit
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreif2bskzqjjmwior5qmbfeivv4z6nb2qrtio6a2jnmy2z5b4hosrse",
|
||||||
"uri": "at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.log.chat/2ivbc5b4um5bu",
|
"uri": "at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.log.chat/2ivbc5b4um5bu",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreieh4i5og6kxeq64wsteijjg3gzixckbct524kqegg22jw3wa7m2d4",
|
||||||
"uri": "at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.log.chat/bj3kxqtnko4gx",
|
"uri": "at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.log.chat/bj3kxqtnko4gx",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreid6x7xc6n4ji6hda5nl7z2assuc42mtzoom6x5makugpg4im5pp2u",
|
||||||
"uri": "at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.log.chat/ia5uwsydi5ljs",
|
"uri": "at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.log.chat/ia5uwsydi5ljs",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -16,15 +16,18 @@
|
|||||||
"ouyhar727gfwx",
|
"ouyhar727gfwx",
|
||||||
"krajt6fldd762",
|
"krajt6fldd762",
|
||||||
"kr5ig7vlgl276",
|
"kr5ig7vlgl276",
|
||||||
|
"k7bhaaskcuw2j",
|
||||||
"jtdn5ncfojjwv",
|
"jtdn5ncfojjwv",
|
||||||
"jbfvt32lao6yg",
|
"jbfvt32lao6yg",
|
||||||
"ixeuckd6ao43h",
|
"ixeuckd6ao43h",
|
||||||
"inwkl55s7osg3",
|
"inwkl55s7osg3",
|
||||||
|
"ia5uwsydi5ljs",
|
||||||
"evknoqtr7uyey",
|
"evknoqtr7uyey",
|
||||||
"efs4j6j3zqcbv",
|
"efs4j6j3zqcbv",
|
||||||
"d3dmreieiynnd",
|
"d3dmreieiynnd",
|
||||||
"caiun7er6rklv",
|
"caiun7er6rklv",
|
||||||
"c5xux5rkjr3n7",
|
"c5xux5rkjr3n7",
|
||||||
|
"bj3kxqtnko4gx",
|
||||||
"bcdp3pivh6bw6",
|
"bcdp3pivh6bw6",
|
||||||
"amwpl3iupt6wn",
|
"amwpl3iupt6wn",
|
||||||
"655zfmpn4ln3u",
|
"655zfmpn4ln3u",
|
||||||
@@ -33,8 +36,5 @@
|
|||||||
"3r7eq4inllheg",
|
"3r7eq4inllheg",
|
||||||
"325sghcecgzco",
|
"325sghcecgzco",
|
||||||
"2ks46vomw4s2i",
|
"2ks46vomw4s2i",
|
||||||
"ia5uwsydi5ljs",
|
"2ivbc5b4um5bu"
|
||||||
"bj3kxqtnko4gx",
|
|
||||||
"2ivbc5b4um5bu",
|
|
||||||
"k7bhaaskcuw2j"
|
|
||||||
]
|
]
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreicq4zwrghepaogxkm44azvuppoh4m3yiwdea2hfdp2ugvabugyvsm",
|
||||||
"uri": "at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.log.chat/k7bhaaskcuw2j",
|
"uri": "at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.log.chat/k7bhaaskcuw2j",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreif7vavmdapjg2vsocyqh2ydp2ykginlvwanfwznv7pujbg76rjakm",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/27xox352hir2g",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/27xox352hir2g",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreietihhlupzjqzyfrs6ntkz36hweq2kixgyck6szvtt4tqo55mnxcm",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/3gaf4ckp5be5j",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/3gaf4ckp5be5j",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreigbovxielydlzxwjuwxawaamk6je6ghklcrzeu242hcjkv2fovfba",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/3kwayvs5zrtng",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/3kwayvs5zrtng",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreidq2rubtlxhsc6ebfaarizdik25ym7tcqwpnbihes6jzdgki5nyl4",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/3ucggdsyhth6h",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/3ucggdsyhth6h",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreihcmhfrnf54r2vgy2whqeorqj7cfmqtih6sk6hjdoygrqgjvmqdfq",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/6eg45a33vqzp3",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/6eg45a33vqzp3",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreicsllfd72nl7vtcxnbsurdgkkwmbc6euik67siwbdw6uunqxj7ixq",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/74zyr4w2s3vf4",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/74zyr4w2s3vf4",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreifvo5d2eglcdodosgjj6tdq6al6i42gikbplzzkxcizlqtdf2gsdy",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/a6hfn4arclf3k",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/a6hfn4arclf3k",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreibrh3pmpxv5dqnwha5fftpmujfhtoxdq6ak4ghmwz6fbggpxkhwb4",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/b7emi5uv7frxu",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/b7emi5uv7frxu",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreigtc2b2fhbx3a3qwf2xungziorgikmi4gyqvugwjn6lxee6ayz2oy",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/buzwfx2jasgos",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/buzwfx2jasgos",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreidjp5qszvffcwzfzu62vl55tkcqfwbzedt4xpd427yq65hcyhguqm",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/bvm7emi5zgatx",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/bvm7emi5zgatx",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreicly2cze5fm7waanpx7y7phit6dig4vzgmba4fn4vk2rtbwlg7bv4",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/coztphfo4rtbx",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/coztphfo4rtbx",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreibyjzddbyvhnibx7znx5vwedewjmkedhb4nvo4xbiqw32pev6o5gy",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/d4wj4rh3k3zsf",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/d4wj4rh3k3zsf",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreic3sexnqskdqo7hsevag4baotyrmx2chhze6nxq4lshtcg7jyii5q",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/dud5blgqfgxm7",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/dud5blgqfgxm7",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreic2kz4q77sbr6aibc7ouww6fbhoasrzp2sbra74m2w7fshs4rcsde",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/eto4yezfoztky",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/eto4yezfoztky",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,40 +1,40 @@
|
|||||||
[
|
[
|
||||||
"3ucggdsyhth6h",
|
|
||||||
"jcdlr7wjyernr",
|
|
||||||
"tg7crfsupxz7h",
|
|
||||||
"wwgwt2ycq3tx5",
|
|
||||||
"zi7t34bdc6kqn",
|
"zi7t34bdc6kqn",
|
||||||
"wigv2qnon7pmg",
|
|
||||||
"qbuquaswgxo36",
|
|
||||||
"p6mxoi2x2ooz6",
|
|
||||||
"vr72pvlhuxnf5",
|
|
||||||
"bvm7emi5zgatx",
|
|
||||||
"snju64fbt4a3n",
|
|
||||||
"coztphfo4rtbx",
|
|
||||||
"s55utv52t3rf6",
|
|
||||||
"odtsnpvndlp73",
|
|
||||||
"jkvo4qeutpfkk",
|
|
||||||
"jee3z7tbzoxic",
|
|
||||||
"khx456dlcp7fs",
|
|
||||||
"kftis2fugsvqt",
|
|
||||||
"27xox352hir2g",
|
|
||||||
"buzwfx2jasgos",
|
|
||||||
"smrgeplyw5wmr",
|
|
||||||
"z42mx3edarpnb",
|
"z42mx3edarpnb",
|
||||||
"y2qobgxho6jte",
|
"y2qobgxho6jte",
|
||||||
"b7emi5uv7frxu",
|
"wwgwt2ycq3tx5",
|
||||||
"6eg45a33vqzp3",
|
"wigv2qnon7pmg",
|
||||||
"sqzphb67ymv4i",
|
"vr72pvlhuxnf5",
|
||||||
"kidbeqeb2gjrx",
|
"tg7crfsupxz7h",
|
||||||
"3gaf4ckp5be5j",
|
|
||||||
"mvahfu2zl55jr",
|
|
||||||
"74zyr4w2s3vf4",
|
|
||||||
"ktjdbs7ie2x6d",
|
|
||||||
"3kwayvs5zrtng",
|
|
||||||
"d4wj4rh3k3zsf",
|
|
||||||
"a6hfn4arclf3k",
|
|
||||||
"q57mb4gebtj2o",
|
|
||||||
"dud5blgqfgxm7",
|
|
||||||
"sv26xtnwgjsds",
|
"sv26xtnwgjsds",
|
||||||
"eto4yezfoztky"
|
"sqzphb67ymv4i",
|
||||||
|
"snju64fbt4a3n",
|
||||||
|
"smrgeplyw5wmr",
|
||||||
|
"s55utv52t3rf6",
|
||||||
|
"qbuquaswgxo36",
|
||||||
|
"q57mb4gebtj2o",
|
||||||
|
"p6mxoi2x2ooz6",
|
||||||
|
"odtsnpvndlp73",
|
||||||
|
"mvahfu2zl55jr",
|
||||||
|
"ktjdbs7ie2x6d",
|
||||||
|
"kidbeqeb2gjrx",
|
||||||
|
"khx456dlcp7fs",
|
||||||
|
"kftis2fugsvqt",
|
||||||
|
"jkvo4qeutpfkk",
|
||||||
|
"jee3z7tbzoxic",
|
||||||
|
"jcdlr7wjyernr",
|
||||||
|
"eto4yezfoztky",
|
||||||
|
"dud5blgqfgxm7",
|
||||||
|
"d4wj4rh3k3zsf",
|
||||||
|
"coztphfo4rtbx",
|
||||||
|
"bvm7emi5zgatx",
|
||||||
|
"buzwfx2jasgos",
|
||||||
|
"b7emi5uv7frxu",
|
||||||
|
"a6hfn4arclf3k",
|
||||||
|
"74zyr4w2s3vf4",
|
||||||
|
"6eg45a33vqzp3",
|
||||||
|
"3ucggdsyhth6h",
|
||||||
|
"3kwayvs5zrtng",
|
||||||
|
"3gaf4ckp5be5j",
|
||||||
|
"27xox352hir2g"
|
||||||
]
|
]
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreicoqko4djxjxxsj2cmlrgeq4rdkyysykfrbbiisc4nfdbyxstbjxm",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/jcdlr7wjyernr",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/jcdlr7wjyernr",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreiaawvruktfefxvs2fbvme2sgltaawdk4dz3fxorihm5swgqopbiwq",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/jee3z7tbzoxic",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/jee3z7tbzoxic",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreigzgndcsixaktdbq6j3qhdc44o3pr6ehpjjvn3zsypmgfvyrsjvmm",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/jkvo4qeutpfkk",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/jkvo4qeutpfkk",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreihir6mdcmfjxa23i6s6cgmkpgoytgpwa4uw6gqjvto2u2afrxluy4",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/kftis2fugsvqt",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/kftis2fugsvqt",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreifnmhigc5uiefuifmxi2iue4vynmpj7dexxju67knwyo5bcwtgqxi",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/khx456dlcp7fs",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/khx456dlcp7fs",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreif5tmcaem3jv4htzzxixupzuwz3cv7zaoxyoo6mtmj7jbeyellmo4",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/kidbeqeb2gjrx",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/kidbeqeb2gjrx",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreifztctayrxqy6ly22hbzkdyk3pv3posf6rzby6c4ztu5y4kckz5xm",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/ktjdbs7ie2x6d",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/ktjdbs7ie2x6d",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreiadyiqbh6qzc67ycymktcvpnmoikaexp6houl2jglhdh4o53etox4",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/mvahfu2zl55jr",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/mvahfu2zl55jr",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "bafyreifgtrk5f6j5olmd2qas2gjkhm22lf7ka57cbopc42cqh5grukx6hu",
|
"cid": "bafyreienolhpwxkqqg3wyeg6refqruxt3p4drrcwbkz2nbayidokdlelza",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/odtsnpvndlp73",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/odtsnpvndlp73",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreigv2bnqn4kjem2vmk2socuh3crfx3yv6hqvqskn5vr2pdx5xaaeju",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/q57mb4gebtj2o",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/q57mb4gebtj2o",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreic4i6iwt3v4rudbo3f7prkfrvf7h6vthca46r6asvxl2r6aqjwvrq",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/s55utv52t3rf6",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/s55utv52t3rf6",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreialo6tv5rdgvndsdl5o3jhhzzq3lb5m4fksabzwlcrc7pwlt2mive",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/smrgeplyw5wmr",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/smrgeplyw5wmr",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
"author": "did:plc:vzsvtbtbnwn22xjqhcu3vd6y",
|
"author": "did:plc:vzsvtbtbnwn22xjqhcu3vd6y",
|
||||||
"content": "AIとの会話をblogにするailog chat",
|
"content": "AIとの会話をblogに",
|
||||||
"createdAt": "2026-01-22T08:22:43.604Z",
|
"createdAt": "2026-01-22T08:22:43.604Z",
|
||||||
"translations": {
|
"translations": {
|
||||||
"en": {
|
"en": {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreic3r77rentf6z6mixsemgdj6wqwl2qv3jyczs6mdtz2nyocvlcoo4",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/snju64fbt4a3n",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/snju64fbt4a3n",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreidgav26ja7b6q3pdc6jk65dzc5mobdctmjzvbcyripkqkzkpoeb34",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/sqzphb67ymv4i",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/sqzphb67ymv4i",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreignupovvbqukrlnvxztzfqbmxqmbgbcosokxeksii7wvx5nn4vgpy",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/sv26xtnwgjsds",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/sv26xtnwgjsds",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreie2mbknda5ldms5s7ngrxwcspkthpl4aahzp64q2ulyax6lxbyxju",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/tg7crfsupxz7h",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/tg7crfsupxz7h",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreiby4ni3j2qu7v7vc5rztu77axun2r6rmbg5wtsphldtg5iplyjs5a",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/vr72pvlhuxnf5",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/vr72pvlhuxnf5",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"cid": "bafyreidsy43pp3svebjnihwxavlad2rdczwb4vyjnjlmjep2amiae46iia",
|
"cid": "bafyreiexvd4rbzzmj5nvkxpk5ps4jp6lu3qp3i2ib6h677g6ahs4w7iu5q",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/wigv2qnon7pmg",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/wigv2qnon7pmg",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
"author": "did:plc:vzsvtbtbnwn22xjqhcu3vd6y",
|
"author": "did:plc:vzsvtbtbnwn22xjqhcu3vd6y",
|
||||||
"content": "ailogのコンセプトを短く紹介してみて。",
|
"content": "ailogのコンセプト",
|
||||||
"createdAt": "2026-01-20T09:48:37.328Z",
|
"createdAt": "2026-01-20T09:48:37.328Z",
|
||||||
"parent": "at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.log.chat/3ar343fz5oop3",
|
"parent": "at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.log.chat/3ar343fz5oop3",
|
||||||
"root": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/cav7q75r73jui",
|
"root": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/cav7q75r73jui",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreia4ewyyhdmj5qh3zql24yiyjpo2jafawsm7i32t4j7ksp3lt3n5mm",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/wwgwt2ycq3tx5",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/wwgwt2ycq3tx5",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreicscksmqtcfgsojrmdsku4oheofaqkoqhbnobmzyo4o462dz2zraq",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/y2qobgxho6jte",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/y2qobgxho6jte",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreibueicq2s54tostoq5gy6lemfr5zryij7z2nq23zhzmq2f7a2zzly",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/z42mx3edarpnb",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/z42mx3edarpnb",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"cid": "",
|
"cid": "bafyreid7nbomq5qnza2kqkfv3sha4wqjh4lr4cwusuqdh2y57jpza6triu",
|
||||||
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/zi7t34bdc6kqn",
|
"uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/zi7t34bdc6kqn",
|
||||||
"value": {
|
"value": {
|
||||||
"$type": "ai.syui.log.chat",
|
"$type": "ai.syui.log.chat",
|
||||||
|
|||||||
@@ -171,7 +171,8 @@ export function renderChatThread(
|
|||||||
userProfile?: Profile | null,
|
userProfile?: Profile | null,
|
||||||
botProfile?: Profile | null,
|
botProfile?: Profile | null,
|
||||||
pds?: string,
|
pds?: string,
|
||||||
chatCollection: string = 'ai.syui.log.chat'
|
chatCollection: string = 'ai.syui.log.chat',
|
||||||
|
loggedInDid?: string | null
|
||||||
): string {
|
): string {
|
||||||
// Find root message
|
// Find root message
|
||||||
const rootUri = `at://${userDid}/${chatCollection}/${rootRkey}`
|
const rootUri = `at://${userDid}/${chatCollection}/${rootRkey}`
|
||||||
@@ -223,6 +224,8 @@ export function renderChatThread(
|
|||||||
const displayContent = getTranslatedContent(msg)
|
const displayContent = getTranslatedContent(msg)
|
||||||
const content = renderMarkdown(displayContent)
|
const content = renderMarkdown(displayContent)
|
||||||
const recordLink = `/@${author.handle}/at/collection/${chatCollection}/${rkey}`
|
const recordLink = `/@${author.handle}/at/collection/${chatCollection}/${rkey}`
|
||||||
|
const canEdit = loggedInDid && authorDid === loggedInDid
|
||||||
|
const editLink = `/@${userHandle}/at/chat/${rkey}/edit`
|
||||||
|
|
||||||
return `
|
return `
|
||||||
<article class="chat-message">
|
<article class="chat-message">
|
||||||
@@ -233,6 +236,7 @@ export function renderChatThread(
|
|||||||
<div class="chat-message-header">
|
<div class="chat-message-header">
|
||||||
<a href="/@${author.handle}" class="chat-author">@${escapeHtml(author.handle)}</a>
|
<a href="/@${author.handle}" class="chat-author">@${escapeHtml(author.handle)}</a>
|
||||||
<a href="${recordLink}" class="chat-time">${time}</a>
|
<a href="${recordLink}" class="chat-time">${time}</a>
|
||||||
|
${canEdit ? `<a href="${editLink}" class="chat-edit-btn">edit</a>` : ''}
|
||||||
</div>
|
</div>
|
||||||
<div class="chat-content">${content}</div>
|
<div class="chat-content">${content}</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -269,8 +273,41 @@ export function renderChatThreadPage(
|
|||||||
userProfile?: Profile | null,
|
userProfile?: Profile | null,
|
||||||
botProfile?: Profile | null,
|
botProfile?: Profile | null,
|
||||||
pds?: string,
|
pds?: string,
|
||||||
chatCollection: string = 'ai.syui.log.chat'
|
chatCollection: string = 'ai.syui.log.chat',
|
||||||
|
loggedInDid?: string | null
|
||||||
): string {
|
): string {
|
||||||
const thread = renderChatThread(messages, rootRkey, userDid, userHandle, botDid, botHandle, userProfile, botProfile, pds, chatCollection)
|
const thread = renderChatThread(messages, rootRkey, userDid, userHandle, botDid, botHandle, userProfile, botProfile, pds, chatCollection, loggedInDid)
|
||||||
return `<div class="chat-container">${thread}</div>`
|
return `<div class="chat-container">${thread}</div>`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Render chat edit form
|
||||||
|
export function renderChatEditForm(
|
||||||
|
message: ChatMessage,
|
||||||
|
collection: string,
|
||||||
|
userHandle: string
|
||||||
|
): string {
|
||||||
|
const rkey = message.uri.split('/').pop() || ''
|
||||||
|
const content = message.value.content
|
||||||
|
|
||||||
|
return `
|
||||||
|
<div class="chat-edit-container">
|
||||||
|
<h2>Edit Chat Message</h2>
|
||||||
|
<form class="chat-edit-form" id="chat-edit-form">
|
||||||
|
<textarea
|
||||||
|
class="chat-edit-content"
|
||||||
|
id="chat-edit-content"
|
||||||
|
rows="10"
|
||||||
|
required
|
||||||
|
>${escapeHtml(content)}</textarea>
|
||||||
|
<div class="chat-edit-footer">
|
||||||
|
<span class="chat-edit-collection">${collection}</span>
|
||||||
|
<div class="chat-edit-buttons">
|
||||||
|
<a href="/@${userHandle}/at/chat/${rkey}" class="chat-edit-cancel">Cancel</a>
|
||||||
|
<button type="submit" class="chat-edit-save" id="chat-edit-save" data-rkey="${rkey}">Save</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<div id="chat-edit-status" class="chat-edit-status"></div>
|
||||||
|
</div>
|
||||||
|
`
|
||||||
|
}
|
||||||
|
|||||||
@@ -254,8 +254,8 @@ export async function updatePost(
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
// Fetch existing record to preserve translations
|
// Fetch existing record to preserve translations
|
||||||
let existingTranslations = undefined
|
let existingTranslations: unknown = undefined
|
||||||
let existingCreatedAt = new Date().toISOString()
|
let existingCreatedAt: unknown = new Date().toISOString()
|
||||||
try {
|
try {
|
||||||
const existing = await agent.com.atproto.repo.getRecord({
|
const existing = await agent.com.atproto.repo.getRecord({
|
||||||
repo: agent.assertDid,
|
repo: agent.assertDid,
|
||||||
@@ -266,7 +266,7 @@ export async function updatePost(
|
|||||||
const value = existing.data.value as Record<string, unknown>
|
const value = existing.data.value as Record<string, unknown>
|
||||||
existingTranslations = value.translations
|
existingTranslations = value.translations
|
||||||
if (value.createdAt) {
|
if (value.createdAt) {
|
||||||
existingCreatedAt = value.createdAt as string
|
existingCreatedAt = value.createdAt
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
@@ -298,6 +298,51 @@ export async function updatePost(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update chat message
|
||||||
|
export async function updateChat(
|
||||||
|
collection: string,
|
||||||
|
rkey: string,
|
||||||
|
content: string
|
||||||
|
): Promise<{ uri: string; cid: string } | null> {
|
||||||
|
if (!agent) return null
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Fetch existing record to preserve translations and other fields
|
||||||
|
let existingRecord: Record<string, unknown> = {}
|
||||||
|
try {
|
||||||
|
const existing = await agent.com.atproto.repo.getRecord({
|
||||||
|
repo: agent.assertDid,
|
||||||
|
collection,
|
||||||
|
rkey,
|
||||||
|
})
|
||||||
|
if (existing.data.value) {
|
||||||
|
existingRecord = existing.data.value as Record<string, unknown>
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
// Record doesn't exist
|
||||||
|
throw new Error('Record not found')
|
||||||
|
}
|
||||||
|
|
||||||
|
const record: Record<string, unknown> = {
|
||||||
|
...existingRecord,
|
||||||
|
$type: collection,
|
||||||
|
content,
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await agent.com.atproto.repo.putRecord({
|
||||||
|
repo: agent.assertDid,
|
||||||
|
collection,
|
||||||
|
rkey,
|
||||||
|
record,
|
||||||
|
})
|
||||||
|
|
||||||
|
return { uri: result.data.uri, cid: result.data.cid }
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Update chat error:', err)
|
||||||
|
throw err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Save migrated card data to ai.syui.card.old
|
// Save migrated card data to ai.syui.card.old
|
||||||
export async function saveMigratedCardData(
|
export async function saveMigratedCardData(
|
||||||
user: {
|
user: {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
export interface Route {
|
export interface Route {
|
||||||
type: 'home' | 'user' | 'post' | 'postpage' | 'atbrowser' | 'service' | 'collection' | 'record' | 'chat' | 'chat-thread' | 'card' | 'card-old' | 'rse'
|
type: 'home' | 'user' | 'post' | 'postpage' | 'atbrowser' | 'service' | 'collection' | 'record' | 'chat' | 'chat-thread' | 'chat-edit' | 'card' | 'card-old' | 'rse'
|
||||||
handle?: string
|
handle?: string
|
||||||
rkey?: string
|
rkey?: string
|
||||||
service?: string
|
service?: string
|
||||||
@@ -69,6 +69,12 @@ export function parseRoute(): Route {
|
|||||||
return { type: 'rse', handle: rseMatch[1] }
|
return { type: 'rse', handle: rseMatch[1] }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Chat edit: /@handle/at/chat/{rkey}/edit
|
||||||
|
const chatEditMatch = path.match(/^\/@([^/]+)\/at\/chat\/([^/]+)\/edit$/)
|
||||||
|
if (chatEditMatch) {
|
||||||
|
return { type: 'chat-edit', handle: chatEditMatch[1], rkey: chatEditMatch[2] }
|
||||||
|
}
|
||||||
|
|
||||||
// Chat thread: /@handle/at/chat/{rkey}
|
// Chat thread: /@handle/at/chat/{rkey}
|
||||||
const chatThreadMatch = path.match(/^\/@([^/]+)\/at\/chat\/([^/]+)$/)
|
const chatThreadMatch = path.match(/^\/@([^/]+)\/at\/chat\/([^/]+)$/)
|
||||||
if (chatThreadMatch) {
|
if (chatThreadMatch) {
|
||||||
@@ -117,6 +123,8 @@ export function navigate(route: Route): void {
|
|||||||
path = `/@${route.handle}/at/chat`
|
path = `/@${route.handle}/at/chat`
|
||||||
} else if (route.type === 'chat-thread' && route.handle && route.rkey) {
|
} else if (route.type === 'chat-thread' && route.handle && route.rkey) {
|
||||||
path = `/@${route.handle}/at/chat/${route.rkey}`
|
path = `/@${route.handle}/at/chat/${route.rkey}`
|
||||||
|
} else if (route.type === 'chat-edit' && route.handle && route.rkey) {
|
||||||
|
path = `/@${route.handle}/at/chat/${route.rkey}/edit`
|
||||||
}
|
}
|
||||||
|
|
||||||
window.history.pushState({}, '', path)
|
window.history.pushState({}, '', path)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import './styles/card.css'
|
|||||||
import './styles/card-migrate.css'
|
import './styles/card-migrate.css'
|
||||||
import { getConfig, resolveHandle, getProfile, getPosts, getPost, describeRepo, listRecords, getRecord, getPds, getNetworks, getChatMessages, getCards, getRse } from './lib/api'
|
import { getConfig, resolveHandle, getProfile, getPosts, getPost, describeRepo, listRecords, getRecord, getPds, getNetworks, getChatMessages, getCards, getRse } from './lib/api'
|
||||||
import { parseRoute, onRouteChange, navigate, type Route } from './lib/router'
|
import { parseRoute, onRouteChange, navigate, type Route } from './lib/router'
|
||||||
import { login, logout, handleCallback, restoreSession, isLoggedIn, getLoggedInHandle, getLoggedInDid, deleteRecord, updatePost } from './lib/auth'
|
import { login, logout, handleCallback, restoreSession, isLoggedIn, getLoggedInHandle, getLoggedInDid, deleteRecord, updatePost, updateChat } from './lib/auth'
|
||||||
import { validateRecord } from './lib/lexicon'
|
import { validateRecord } from './lib/lexicon'
|
||||||
import { renderHeader } from './components/header'
|
import { renderHeader } from './components/header'
|
||||||
import { renderProfile } from './components/profile'
|
import { renderProfile } from './components/profile'
|
||||||
@@ -12,7 +12,7 @@ import { renderPostForm, setupPostForm } from './components/postform'
|
|||||||
import { renderCollectionButtons, renderServerInfo, renderServiceList, renderCollectionList, renderRecordList, renderRecordDetail } from './components/browser'
|
import { renderCollectionButtons, renderServerInfo, renderServiceList, renderCollectionList, renderRecordList, renderRecordDetail } from './components/browser'
|
||||||
import { renderModeTabs, renderLangSelector, setupModeTabs } from './components/mode-tabs'
|
import { renderModeTabs, renderLangSelector, setupModeTabs } from './components/mode-tabs'
|
||||||
import { renderFooter } from './components/footer'
|
import { renderFooter } from './components/footer'
|
||||||
import { renderChatListPage, renderChatThreadPage } from './components/chat'
|
import { renderChatListPage, renderChatThreadPage, renderChatEditForm } from './components/chat'
|
||||||
import { renderCardPage } from './components/card'
|
import { renderCardPage } from './components/card'
|
||||||
import { renderRsePage } from './components/rse'
|
import { renderRsePage } from './components/rse'
|
||||||
import { checkMigrationStatus, renderMigrationPage, setupMigrationButton } from './components/card-migrate'
|
import { checkMigrationStatus, renderMigrationPage, setupMigrationButton } from './components/card-migrate'
|
||||||
@@ -168,7 +168,7 @@ async function render(route: Route): Promise<void> {
|
|||||||
|
|
||||||
// Mode tabs (Blog/Browser/Post/Chat/PDS)
|
// Mode tabs (Blog/Browser/Post/Chat/PDS)
|
||||||
const activeTab = route.type === 'postpage' ? 'post' :
|
const activeTab = route.type === 'postpage' ? 'post' :
|
||||||
(route.type === 'chat' || route.type === 'chat-thread') ? 'chat' :
|
(route.type === 'chat' || route.type === 'chat-thread' || route.type === 'chat-edit') ? 'chat' :
|
||||||
(route.type === 'atbrowser' || route.type === 'service' || route.type === 'collection' || route.type === 'record' ? 'browser' : 'blog')
|
(route.type === 'atbrowser' || route.type === 'service' || route.type === 'collection' || route.type === 'record' ? 'browser' : 'blog')
|
||||||
html += renderModeTabs(handle, activeTab, localOnly)
|
html += renderModeTabs(handle, activeTab, localOnly)
|
||||||
|
|
||||||
@@ -320,7 +320,32 @@ async function render(route: Route): Promise<void> {
|
|||||||
langList = Array.from(chatLangs)
|
langList = Array.from(chatLangs)
|
||||||
|
|
||||||
html += renderLangSelector(langList)
|
html += renderLangSelector(langList)
|
||||||
html += `<div id="content">${renderChatThreadPage(chatMessages, route.rkey, did, handle, botDid, botHandle, profile, botProfile, pds || undefined, chatCollection)}</div>`
|
html += `<div id="content">${renderChatThreadPage(chatMessages, route.rkey, did, handle, botDid, botHandle, profile, botProfile, pds || undefined, chatCollection, loggedInDid)}</div>`
|
||||||
|
html += `<nav class="back-nav"><a href="/@${handle}/at/chat">chat</a></nav>`
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (route.type === 'chat-edit' && route.rkey) {
|
||||||
|
// Chat edit page
|
||||||
|
if (!config.bot) {
|
||||||
|
html += `<div id="content" class="error">Bot not configured in config.json</div>`
|
||||||
|
html += `<nav class="back-nav"><a href="/@${handle}">${handle}</a></nav>`
|
||||||
|
} else if (!isOwner) {
|
||||||
|
html += `<div id="content" class="error">You can only edit your own messages</div>`
|
||||||
|
html += `<nav class="back-nav"><a href="/@${handle}/at/chat">chat</a></nav>`
|
||||||
|
} else {
|
||||||
|
const botDid = config.bot.did
|
||||||
|
const chatCollection = config.chatCollection || 'ai.syui.log.chat'
|
||||||
|
|
||||||
|
// Get the specific message
|
||||||
|
const chatMessages = await getChatMessages(did, botDid, chatCollection)
|
||||||
|
const targetUri = `at://${did}/${chatCollection}/${route.rkey}`
|
||||||
|
const message = chatMessages.find(m => m.uri === targetUri)
|
||||||
|
|
||||||
|
if (!message) {
|
||||||
|
html += `<div id="content" class="error">Message not found</div>`
|
||||||
|
} else {
|
||||||
|
html += `<div id="content">${renderChatEditForm(message, chatCollection, handle)}</div>`
|
||||||
|
}
|
||||||
html += `<nav class="back-nav"><a href="/@${handle}/at/chat">chat</a></nav>`
|
html += `<nav class="back-nav"><a href="/@${handle}/at/chat">chat</a></nav>`
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -368,6 +393,12 @@ async function render(route: Route): Promise<void> {
|
|||||||
setupPostEdit(config.collection)
|
setupPostEdit(config.collection)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Setup chat edit form
|
||||||
|
if (route.type === 'chat-edit' && isOwner) {
|
||||||
|
const chatCollection = config.chatCollection || 'ai.syui.log.chat'
|
||||||
|
setupChatEdit(chatCollection, handle)
|
||||||
|
}
|
||||||
|
|
||||||
// Setup validate button for record detail
|
// Setup validate button for record detail
|
||||||
if (currentRecord) {
|
if (currentRecord) {
|
||||||
setupValidateButton(currentRecord)
|
setupValidateButton(currentRecord)
|
||||||
@@ -564,6 +595,49 @@ function setupPostEdit(collection: string): void {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Setup chat edit form
|
||||||
|
function setupChatEdit(collection: string, handle: string): void {
|
||||||
|
const form = document.getElementById('chat-edit-form') as HTMLFormElement
|
||||||
|
const contentInput = document.getElementById('chat-edit-content') as HTMLTextAreaElement
|
||||||
|
const saveBtn = document.getElementById('chat-edit-save') as HTMLButtonElement
|
||||||
|
const statusEl = document.getElementById('chat-edit-status') as HTMLDivElement
|
||||||
|
|
||||||
|
if (!form || !saveBtn) return
|
||||||
|
|
||||||
|
form.addEventListener('submit', async (e) => {
|
||||||
|
e.preventDefault()
|
||||||
|
|
||||||
|
const rkey = saveBtn.getAttribute('data-rkey')
|
||||||
|
if (!rkey || !contentInput) return
|
||||||
|
|
||||||
|
const content = contentInput.value.trim()
|
||||||
|
|
||||||
|
if (!content) {
|
||||||
|
alert('Content is required')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
saveBtn.textContent = 'Saving...'
|
||||||
|
saveBtn.disabled = true
|
||||||
|
|
||||||
|
await updateChat(collection, rkey, content)
|
||||||
|
|
||||||
|
statusEl.innerHTML = '<span class="chat-edit-success">Saved!</span>'
|
||||||
|
|
||||||
|
// Navigate back to chat thread
|
||||||
|
setTimeout(() => {
|
||||||
|
navigate({ type: 'chat-thread', handle, rkey })
|
||||||
|
}, 1000)
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Update failed:', err)
|
||||||
|
statusEl.innerHTML = `<span class="chat-edit-error">Error: ${err}</span>`
|
||||||
|
saveBtn.textContent = 'Save'
|
||||||
|
saveBtn.disabled = false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// Initial render
|
// Initial render
|
||||||
render(parseRoute())
|
render(parseRoute())
|
||||||
|
|
||||||
|
|||||||
@@ -2510,3 +2510,133 @@ button.tab {
|
|||||||
line-height: 1.4;
|
line-height: 1.4;
|
||||||
white-space: pre-line;
|
white-space: pre-line;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Chat Edit Button */
|
||||||
|
.chat-edit-btn {
|
||||||
|
color: #888;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
text-decoration: none;
|
||||||
|
margin-left: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-edit-btn:hover {
|
||||||
|
color: var(--btn-color);
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Chat Edit Form */
|
||||||
|
.chat-edit-container {
|
||||||
|
max-width: 800px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-edit-container h2 {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
font-size: 1.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-edit-form {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-edit-content {
|
||||||
|
width: 100%;
|
||||||
|
padding: 12px;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 1rem;
|
||||||
|
font-family: inherit;
|
||||||
|
resize: vertical;
|
||||||
|
min-height: 200px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-edit-content:focus {
|
||||||
|
outline: none;
|
||||||
|
border-color: var(--btn-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-edit-footer {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-edit-collection {
|
||||||
|
color: #888;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-edit-buttons {
|
||||||
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-edit-cancel {
|
||||||
|
color: #666;
|
||||||
|
text-decoration: none;
|
||||||
|
padding: 8px 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-edit-cancel:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-edit-save {
|
||||||
|
background: var(--btn-color);
|
||||||
|
color: white;
|
||||||
|
border: none;
|
||||||
|
padding: 8px 20px;
|
||||||
|
border-radius: 6px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 0.95rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-edit-save:hover {
|
||||||
|
opacity: 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-edit-save:disabled {
|
||||||
|
opacity: 0.6;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-edit-status {
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-edit-success {
|
||||||
|
color: #22c55e;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-edit-error {
|
||||||
|
color: #ef4444;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dark mode */
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
.chat-edit-btn {
|
||||||
|
color: #888;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-edit-btn:hover {
|
||||||
|
color: var(--btn-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-edit-content {
|
||||||
|
background: #1a1a1a;
|
||||||
|
border-color: #333;
|
||||||
|
color: #e0e0e0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-edit-content:focus {
|
||||||
|
border-color: var(--btn-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-edit-cancel {
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user