diff mrjunejune/test/conversation_api_test.js @ 265:056790c4fb0d

add role-aware Epi assistant prompts Add verified June knowledge, guest/member/admin Copilot profiles, profile-isolated session recovery, animated Epi greetings, and a single authoritative runtime config workflow for inference. Co-authored-by: Copilot <[email protected]>
author MrJuneJune <me@mrjunejune.com>
date Fri, 07 Aug 2026 10:50:30 -0700
parents 04fee26ecce0
children
line wrap: on
line diff
--- a/mrjunejune/test/conversation_api_test.js	Fri Aug 07 07:34:12 2026 -0700
+++ b/mrjunejune/test/conversation_api_test.js	Fri Aug 07 10:50:30 2026 -0700
@@ -167,7 +167,6 @@
         MRJUNEJUNE_DB_PATH: databasePath,
         MRJUNEJUNE_INFERENCE_SIDECAR_PATH: fakeSidecar,
         MRJUNEJUNE_COPILOT_CLI_PATH: fakeSidecar,
-        MRJUNEJUNE_ALLOW_ANONYMOUS_INFERENCE: '1',
         MRJUNEJUNE_ALLOW_GUEST_INFERENCE: '1',
       },
       stdio: ['ignore', 'pipe', 'pipe'],
@@ -370,7 +369,10 @@
     const stream = await response.text();
     assert.match(stream, /event: turn\.accepted/);
     assert.match(stream, /event: tool\.started/);
-    assert.match(stream, /"tool":\{"name":"mock-search"\}/);
+    assert.match(
+      stream,
+      /"tool":\{"name":"mock-search","prompt_profile":"public_visitor"\}/,
+    );
     assert.match(stream, /event: assistant\.delta/);
     assert.match(stream, /hello \\"traveler\\"\\\\path/);
     assert.match(stream, /event: assistant\.completed/);
@@ -498,6 +500,108 @@
         assert.equal(loginR.status, 200, `Login must succeed, got ${loginR.status}`);
         const userCsrfC2 = await bootstrapSession(claimBase, userJarC);
 
+        const assertTurnProfile = async (jar, csrf, expectedProfile, title) => {
+          const createResponse = await authedFetch(
+            claimBase,
+            jar,
+            csrf,
+            '/api/conversations',
+            {
+              method: 'POST',
+              headers: { 'Content-Type': 'application/json', Origin: claimBase },
+              body: JSON.stringify({ title }),
+            },
+          );
+          assert.equal(createResponse.status, 201);
+          const createdConversation = await createResponse.json();
+          const turnResponse = await authedFetch(
+            claimBase,
+            jar,
+            csrf,
+            `/api/conversations/${createdConversation.id}/turns`,
+            {
+              method: 'POST',
+              headers: { 'Content-Type': 'application/json', Origin: claimBase },
+              body: JSON.stringify({ prompt: 'profile check' }),
+            },
+          );
+          assert.equal(turnResponse.status, 200);
+          assert.match(
+            await turnResponse.text(),
+            new RegExp(`"prompt_profile":"${expectedProfile}"`),
+          );
+        };
+
+        await assertTurnProfile(
+          userJarC,
+          userCsrfC2,
+          'june_admin',
+          'Admin profile',
+        );
+
+        const createMemberR = await authedFetch(
+          claimBase,
+          userJarC,
+          userCsrfC2,
+          '/api/admin/users',
+          {
+            method: 'POST',
+            headers: { 'Content-Type': 'application/json', Origin: claimBase },
+            body: JSON.stringify({
+              username: 'invitedfriend',
+              temporaryPassword: 'InvitedTempPass123!',
+              role: 'member',
+            }),
+          },
+        );
+        assert.equal(createMemberR.status, 201);
+
+        const memberJar = new CookieJar();
+        const memberGuestCsrf = await bootstrapSession(claimBase, memberJar);
+        const memberLoginR = await authedFetch(
+          claimBase,
+          memberJar,
+          memberGuestCsrf,
+          '/api/auth/login',
+          {
+            method: 'POST',
+            headers: { 'Content-Type': 'application/json', Origin: claimBase },
+            body: JSON.stringify({
+              username: 'invitedfriend',
+              password: 'InvitedTempPass123!',
+              csrfToken: memberGuestCsrf,
+            }),
+          },
+        );
+        assert.equal(memberLoginR.status, 200);
+        const memberLoginData = await memberLoginR.json();
+        assert.equal(memberLoginData.mustChangePassword, true);
+
+        const memberPasswordCsrf = await bootstrapSession(claimBase, memberJar);
+        const memberPasswordR = await authedFetch(
+          claimBase,
+          memberJar,
+          memberPasswordCsrf,
+          '/api/auth/password',
+          {
+            method: 'POST',
+            headers: { 'Content-Type': 'application/json', Origin: claimBase },
+            body: JSON.stringify({
+              currentPassword: 'InvitedTempPass123!',
+              newPassword: 'InvitedPermanentPass123!',
+              csrfToken: memberPasswordCsrf,
+            }),
+          },
+        );
+        assert.equal(memberPasswordR.status, 200);
+        const memberCsrf = await bootstrapSession(claimBase, memberJar);
+        await assertTurnProfile(
+          memberJar,
+          memberCsrf,
+          'invited_friend',
+          'Invited profile',
+        );
+
         // A user cannot claim a conversation owned by a different guest.
         const claimR = await authedFetch(claimBase, userJarC, userCsrfC2,
           '/api/conversations/claim',