Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
117 commits
Select commit Hold shift + click to select a range
14d701f
chore: init v5 branch
BK1031 Jan 17, 2026
aba3aac
chore: init core
BK1031 Jan 17, 2026
7cc7af6
chore: setup sentinel-core with go 1.26, docker-compose, and air hot …
BK1031 Feb 24, 2026
5b32150
fix(ci): replace deprecated go get with go mod download
BK1031 Feb 24, 2026
19782e5
ci: add multi-arch publish workflow for sentinel-core
BK1031 Feb 24, 2026
ac6ba2a
ci: rename workflows to core-build and core-publish
BK1031 Feb 24, 2026
65e4094
ci: consolidate to single core.yml workflow
BK1031 Feb 24, 2026
1b421da
feat(core): add auth entity models and database migrations
BK1031 Mar 11, 2026
ef5ea45
feat(core): add entity and JWT services
BK1031 Mar 11, 2026
ff4e2e6
feat(core): add email auth service and fix entity email lookup
BK1031 Mar 11, 2026
5f8f485
feat(core): add JWKS endpoint and Bearer token auth middleware
BK1031 Mar 11, 2026
94cddd5
feat(core): add JWT token API endpoints and refactor routing
BK1031 Mar 16, 2026
11746b9
refactor(core): generic token service with custom claims support
BK1031 Mar 16, 2026
12aead7
feat(core): add User and ServiceAccount models, refactor Entity
BK1031 Mar 18, 2026
eb7093f
feat(core): add Group and GroupMember models
BK1031 Mar 18, 2026
38f14b8
feat(core): add GroupOwner model
BK1031 Mar 18, 2026
f7c1952
feat(core): add GroupJoinRequest and GroupJoinRequestComment models
BK1031 Mar 18, 2026
e0f50e6
feat(core): add expiration fields to GroupJoinRequest
BK1031 Mar 18, 2026
426ad29
feat(core): add updated_at to Group
BK1031 Mar 19, 2026
deccc8b
feat(core): add Application model
BK1031 Mar 19, 2026
6cb1083
feat(core): add User/ServiceAccount to Entity, add icon_url to Applic…
BK1031 Mar 19, 2026
fa60ce4
feat(core): add ApplicationGroup join table and Groups to User
BK1031 Mar 24, 2026
ee7608d
feat(core): add user service functions
BK1031 Mar 24, 2026
5ada5ed
feat(core): add group service functions
BK1031 Mar 24, 2026
5861660
feat(core): add group member and owner service functions
BK1031 Mar 26, 2026
3cdee0a
feat(core): add group join request service functions
BK1031 Mar 26, 2026
db29c5e
feat(core): add Groups to ServiceAccount, add service account service…
BK1031 Mar 26, 2026
ac7f86b
feat(core): add application and application group service functions
BK1031 Mar 26, 2026
54ec547
feat(core): add user API endpoints
BK1031 Mar 26, 2026
1834df7
feat(core): add application API endpoints
BK1031 Apr 2, 2026
a09a5e1
feat(core): add group API endpoints
BK1031 Apr 2, 2026
a337532
feat(core): add GroupMemberSource and GroupJoinRequestStatus enums, a…
BK1031 Apr 2, 2026
b43d239
feat(discord): bootstrap discord service
BK1031 Apr 2, 2026
49c4009
feat(discord): add discord prefix config var
BK1031 Apr 3, 2026
4efc5a7
feat(discord): add discordgo bot with prefix command handler
BK1031 Apr 3, 2026
5e11f8c
refactor(discord): move bot init and commands to commands package
BK1031 Apr 3, 2026
ef4269f
feat(discord): add discord message and reaction models and service fu…
BK1031 Apr 3, 2026
a16bbdd
feat(discord): hook up message and reaction logging to handlers
BK1031 Apr 3, 2026
7507f08
feat(discord): add channel_name to message/reaction, log all users in…
BK1031 Apr 3, 2026
8b87d95
feat: add Rincon service registry to docker-compose, configure routes
BK1031 Apr 3, 2026
94989a0
feat: add sentinel HTTP client package with Rincon route resolution
BK1031 Apr 3, 2026
aee2d7a
feat(core): add external auth entity lookup endpoint
BK1031 Apr 3, 2026
59fcab8
feat(core): populate User and ServiceAccount in PopulateEntity
BK1031 Apr 3, 2026
005b8a5
refactor(core): change Entity.Type from string to EntityType
BK1031 Apr 3, 2026
321426d
feat(discord): wire up entity lookup via core external auth endpoint
BK1031 Apr 3, 2026
6321fb9
fix(core): case-insensitive provider match in external auth lookup
BK1031 Apr 3, 2026
34df1c5
feat(oauth): bootstrap oauth service
BK1031 Apr 6, 2026
dfccc07
feat: add ApplicationRedirectURI model and endpoints, add Authorizati…
BK1031 Apr 7, 2026
584b852
feat(core): populate redirect URIs on Application
BK1031 Apr 7, 2026
982b54c
feat: add OAuth authorize and token endpoints, add client lookup and …
BK1031 Apr 14, 2026
5fd06f0
feat(oauth): mark refresh tokens with refresh_token scope, validate o…
BK1031 Apr 14, 2026
21f5996
feat: add entity login tracking, prompt logic, return token IDs from …
BK1031 Apr 14, 2026
5f806a0
refactor: move entity_login to core, oauth calls core for login tracking
BK1031 Apr 14, 2026
e3a5140
refactor: replace dedicated login check endpoint with filtered entity…
BK1031 Apr 14, 2026
7303d7f
feat(core): initialize Sentinel application on startup
BK1031 Apr 15, 2026
f9ba78a
feat(core): auto-generate client_id and client_secret in CreateApplic…
BK1031 Apr 15, 2026
16d9895
refactor(core): move generateSecret to application.go
BK1031 Apr 15, 2026
93289f9
refactor(core): consolidate InitializeDefaultApplications into applic…
BK1031 Apr 15, 2026
807f9c1
feat(core): initialize default Sentinel service account and token on …
BK1031 Apr 18, 2026
bc81953
refactor(core): move initialization logic to jobs package
BK1031 Apr 18, 2026
59f655a
feat: add init job
BK1031 Apr 22, 2026
737f81e
feat(core): wire up default service account creation on startup
BK1031 Apr 23, 2026
35e52c8
chore: add restart always policy to all services
BK1031 Apr 23, 2026
48079f6
fix(compose): mount pgdata at /var/lib/postgresql for postgres 18 com…
BK1031 Apr 23, 2026
d61ba8e
chore(services): use human-readable rincon service names
BK1031 Apr 24, 2026
bf563fd
refactor(core): use constant id in default entity init
BK1031 Apr 24, 2026
b4fd9c3
refactor(core): move verify to /core and add entity lookup endpoints
BK1031 Apr 24, 2026
0674e6f
feat(oauth): enrich jwts with entity claims and configurable ttls
BK1031 Apr 24, 2026
8cef948
feat(web): scaffold vite + react + shadcn frontend
BK1031 Apr 24, 2026
cfb7d22
feat(compose): add sentinel-web service for vite dev server
BK1031 Apr 24, 2026
c407154
feat: front the stack with a kerbecs api gateway
BK1031 Apr 25, 2026
d12466f
feat(web): build dashboard shell with sidebar nav and design-stage pages
BK1031 Apr 26, 2026
cd26b28
chore(services): bump core, oauth, and discord to v5.0.0
BK1031 Apr 26, 2026
ee8b797
feat(web): header search + notifications, dynamic footer version
BK1031 Apr 26, 2026
d0aae45
feat(web): login page + debug index + success check transition
BK1031 Apr 26, 2026
9f11928
feat(web): oauth consent screen with scope metadata
BK1031 Apr 26, 2026
feaa79b
chore(compose): bind postgres to localhost and parameterize password
BK1031 May 5, 2026
ebae10b
fix(core): include User and GroupJoinRequestComment in AutoMigrate
BK1031 May 5, 2026
854b125
feat(web): onboarding flow with Discord-token welcome step
BK1031 May 5, 2026
6516ec2
feat(discord): !verify command issues onboarding tokens
BK1031 May 5, 2026
e3f42b7
refactor(discord): hardcode onboarding token TTL instead of env var
BK1031 May 5, 2026
35b6836
feat(web): validate password rules with toast on credentials step
BK1031 May 5, 2026
b687a16
chore: tighten verify reply TTL and move toasts to bottom right
BK1031 May 5, 2026
d67405e
feat(onboarding): fetch token info and render real Discord identity
BK1031 May 5, 2026
acc2abe
feat(onboarding): username availability check on identity step
BK1031 May 5, 2026
3a9e031
feat(onboarding): gate continue on username availability and add uniq…
BK1031 May 5, 2026
7446a83
feat(onboarding): N/A graduate level option for non-students
BK1031 May 5, 2026
bc4f76f
chore(onboarding): scope N/A level to non-alumni roles only
BK1031 May 5, 2026
bbf4f6c
feat(core): internal endpoints for orchestrating onboarding
BK1031 May 5, 2026
71384fa
feat(onboarding): real consume endpoint and live submit
BK1031 May 5, 2026
a0765f7
fix(web): preempt blurry first-open of dialog with transform-gpu
BK1031 May 5, 2026
30e9652
fix(web): drop backdrop-blur from dialog overlay
BK1031 May 5, 2026
d4f850b
fix(core): empty arrays instead of null in JSON responses
BK1031 May 5, 2026
c1442c2
feat(auth): first-party login and refresh endpoints
BK1031 May 15, 2026
2091465
feat(web): real email-password login wired to /auth/login
BK1031 May 15, 2026
47e939a
feat(web): auth gating for dashboard routes + token attachment
BK1031 May 15, 2026
66d447f
chore(web): rename localStorage session key to sentinel_session
BK1031 May 15, 2026
925cc5a
feat(web): useAuth hook backed by tanstack-query, replace mock user i…
BK1031 May 15, 2026
4ab4a16
feat(core): public /entities/@me and /entities/:id
BK1031 May 15, 2026
7c51db3
feat(core): let first-party (aud=sentinel) bypass self-only on GET /e…
BK1031 May 15, 2026
369edb4
feat(web): unmock home page greeting from useAuth
BK1031 May 15, 2026
d944fad
feat(oauth): use CF-Connecting-IP for entity_login.ip_address
BK1031 May 15, 2026
656019c
feat(core): GET /users/:id/logins with filters
BK1031 May 15, 2026
004eb09
feat(web): wire HomePage Recent activity feed to real logins endpoint
BK1031 May 15, 2026
16f7dda
feat(web): fanout app metadata lookup for Recent activity rows
BK1031 May 15, 2026
3f7ee72
feat: dedicated /users/:id/applications endpoint, wire HomePage Recen…
BK1031 May 16, 2026
005ec6f
refactor: rename /users/:id/applications to /users/:id/recent-applica…
BK1031 May 16, 2026
a71fa19
feat: launch_url on Application
BK1031 May 16, 2026
7b2bfd4
fix(core): persist RSA signing key in db instead of regenerating on boot
BK1031 May 16, 2026
ae10544
feat(web): real applications page + extract shared AppCard
BK1031 May 16, 2026
222a9a9
feat(web): app details page; AppCard navigates instead of launching
BK1031 May 16, 2026
67b7175
refactor(web): split LaunchAppCard and AppCard for divergent dashboar…
BK1031 May 16, 2026
a5fa6c1
feat: new + edit application pages, split POST/PUT on backend
BK1031 May 16, 2026
d97e8fc
feat: client_secret reveal on app details page
BK1031 May 16, 2026
87f96c9
feat(web): redirect URI manager + card-based application pages
BK1031 May 16, 2026
2644376
feat: wire application.owner_id to the creating entity
BK1031 May 16, 2026
c60f72e
feat(core): auth gates across all application endpoints
BK1031 May 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 0 additions & 44 deletions .github/workflows/build.yml

This file was deleted.

153 changes: 153 additions & 0 deletions .github/workflows/core.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
name: core
run-name: Triggered by ${{ github.event_name }} to ${{ github.ref }} by @${{ github.actor }}

on:
push:
branches:
- "**"
tags:
- "**"

jobs:
build:
runs-on: ${{ matrix.runner }}
name: Build ${{ matrix.platform }}
strategy:
fail-fast: false
matrix:
include:
- platform: linux/amd64
runner: ubuntu-24.04
- platform: linux/arm64
runner: ubuntu-24.04-arm

permissions:
contents: read
packages: write

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Generate platform pair
id: platform
run: |
platform=${{ matrix.platform }}
echo "pair=${platform//\//-}" >> $GITHUB_OUTPUT

- name: Build and push by digest
id: build
uses: docker/build-push-action@v5
with:
context: core
platforms: ${{ matrix.platform }}
outputs: type=image,name=ghcr.io/gaucho-racing/sentinel-core,push-by-digest=true,name-canonical=true,push=true
cache-from: type=gha,scope=build-${{ steps.platform.outputs.pair }}
cache-to: type=gha,scope=build-${{ steps.platform.outputs.pair }},mode=max

- name: Export digest
run: |
mkdir -p /tmp/digests
digest="${{ steps.build.outputs.digest }}"
touch "/tmp/digests/${digest#sha256:}"

- name: Upload digest
uses: actions/upload-artifact@v4
with:
name: digests-${{ steps.platform.outputs.pair }}
path: /tmp/digests/*
if-no-files-found: error
retention-days: 1

merge:
runs-on: ubuntu-latest
name: Merge manifests
needs: build

permissions:
contents: read
packages: write

steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
fetch-tags: true

- name: Download digests
uses: actions/download-artifact@v4
with:
path: /tmp/digests
pattern: digests-*
merge-multiple: true

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Check if this commit has a release tag
id: release
run: |
tag=$(git tag --points-at HEAD | grep '^v' | head -n1)
if [ -n "$tag" ]; then
echo "Found tag: $tag"
if gh release view "$tag" --json tagName > /dev/null 2>&1; then
echo "release_tag=$tag" >> $GITHUB_OUTPUT
echo "is_release=true" >> $GITHUB_OUTPUT
exit 0
fi
fi
echo "is_release=false" >> $GITHUB_OUTPUT
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Generate tag list
id: tags
shell: bash
run: |
TAGS="type=sha"

if [ "${GITHUB_REF_TYPE}" = "branch" ] && [ "${GITHUB_REF_NAME}" = "main" ]; then
TAGS="${TAGS}\ntype=raw,value=latest"
fi

if [ "${{ steps.release.outputs.is_release }}" = "true" ]; then
CLEAN_TAG=$(echo "${{ steps.release.outputs.release_tag }}" | sed 's/^v//')
TAGS="${TAGS}\ntype=raw,value=${CLEAN_TAG}"
fi

echo -e "tags<<EOF\n$TAGS\nEOF" >> $GITHUB_OUTPUT

- name: Extract image metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/gaucho-racing/sentinel-core
tags: ${{ steps.tags.outputs.tags }}

- name: Create manifest list and push
working-directory: /tmp/digests
run: |
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
$(printf 'ghcr.io/gaucho-racing/sentinel-core@sha256:%s ' *)

- name: Inspect image
run: |
docker buildx imagetools inspect ghcr.io/gaucho-racing/sentinel-core:${{ steps.meta.outputs.version }}
153 changes: 153 additions & 0 deletions .github/workflows/discord.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
name: discord
run-name: Triggered by ${{ github.event_name }} to ${{ github.ref }} by @${{ github.actor }}

on:
push:
branches:
- "**"
tags:
- "**"

jobs:
build:
runs-on: ${{ matrix.runner }}
name: Build ${{ matrix.platform }}
strategy:
fail-fast: false
matrix:
include:
- platform: linux/amd64
runner: ubuntu-24.04
- platform: linux/arm64
runner: ubuntu-24.04-arm

permissions:
contents: read
packages: write

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Generate platform pair
id: platform
run: |
platform=${{ matrix.platform }}
echo "pair=${platform//\//-}" >> $GITHUB_OUTPUT

- name: Build and push by digest
id: build
uses: docker/build-push-action@v5
with:
context: discord
platforms: ${{ matrix.platform }}
outputs: type=image,name=ghcr.io/gaucho-racing/sentinel-discord,push-by-digest=true,name-canonical=true,push=true
cache-from: type=gha,scope=build-${{ steps.platform.outputs.pair }}
cache-to: type=gha,scope=build-${{ steps.platform.outputs.pair }},mode=max

- name: Export digest
run: |
mkdir -p /tmp/digests
digest="${{ steps.build.outputs.digest }}"
touch "/tmp/digests/${digest#sha256:}"

- name: Upload digest
uses: actions/upload-artifact@v4
with:
name: digests-${{ steps.platform.outputs.pair }}
path: /tmp/digests/*
if-no-files-found: error
retention-days: 1

merge:
runs-on: ubuntu-latest
name: Merge manifests
needs: build

permissions:
contents: read
packages: write

steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
fetch-tags: true

- name: Download digests
uses: actions/download-artifact@v4
with:
path: /tmp/digests
pattern: digests-*
merge-multiple: true

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Check if this commit has a release tag
id: release
run: |
tag=$(git tag --points-at HEAD | grep '^v' | head -n1)
if [ -n "$tag" ]; then
echo "Found tag: $tag"
if gh release view "$tag" --json tagName > /dev/null 2>&1; then
echo "release_tag=$tag" >> $GITHUB_OUTPUT
echo "is_release=true" >> $GITHUB_OUTPUT
exit 0
fi
fi
echo "is_release=false" >> $GITHUB_OUTPUT
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Generate tag list
id: tags
shell: bash
run: |
TAGS="type=sha"

if [ "${GITHUB_REF_TYPE}" = "branch" ] && [ "${GITHUB_REF_NAME}" = "main" ]; then
TAGS="${TAGS}\ntype=raw,value=latest"
fi

if [ "${{ steps.release.outputs.is_release }}" = "true" ]; then
CLEAN_TAG=$(echo "${{ steps.release.outputs.release_tag }}" | sed 's/^v//')
TAGS="${TAGS}\ntype=raw,value=${CLEAN_TAG}"
fi

echo -e "tags<<EOF\n$TAGS\nEOF" >> $GITHUB_OUTPUT

- name: Extract image metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/gaucho-racing/sentinel-discord
tags: ${{ steps.tags.outputs.tags }}

- name: Create manifest list and push
working-directory: /tmp/digests
run: |
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
$(printf 'ghcr.io/gaucho-racing/sentinel-discord@sha256:%s ' *)

- name: Inspect image
run: |
docker buildx imagetools inspect ghcr.io/gaucho-racing/sentinel-discord:${{ steps.meta.outputs.version }}
Loading
Loading