8 Commits

Author SHA1 Message Date
윤정민
2a05de85d2 feat: enforce self-only assignment (mandatory on create, coerced silently)
All checks were successful
Build and Deploy Teams Planner Bot / build-and-run (push) Successful in 32s
Project rule: every create_task must be assigned, and only the signed-in
user can ever be the assignee. PlannerBot coerces non-self ids to self
and the preview card surfaces the coercion with a 🔒 advisory line so the
user can see exactly what was substituted before confirm.

- prompt.ts: rewrites the 할당 section — LLM must always fill assigneeUserIds
  with the isMe user on create_task, never assign others, never ask_clarify
  about non-self assignees
- PlannerBot.ts: derives selfId from plan.members, computes coerced state
  and attempted non-self names for the card, forces finalAssigneeIds to
  [selfId] on create_task and on any update_task that signals an
  assignment change
- confirmationCard.ts: ActionContext gains assignmentCoercedToSelf +
  attemptedNonSelfNames; renders the advisory as a warning line

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 08:36:58 +09:00
윤정민
c093480e2b fix: resolve assignee userIds to displayName via Graph fallback
When an assignee on a task isn't in the plan's M365 group member listing
(guests, ex-members, cross-tenant collaborators), we previously leaked the
raw GUID into preview/result cards. Now we fall back to /users/{id} via the
delegated User.ReadBasic.All scope, cache the resolved name on the bot
instance, and show "사용자 {short-guid}…" only if every lookup fails.

Also: allow assigneeUserIds to retain ids that are already on the task even
if not in the current member list, so additive assignments don't strip
existing assignees. Prompt rule added: never put GUIDs into user-facing
text fields.

NOTE: requires User.ReadBasic.All delegated permission on the AAD app
(add + grant admin consent; users must re-login to pick up the new scope).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 15:42:25 +09:00
윤정민
d3271fa1e8 feat: hybrid conversation memory (working memory + last-2 raw turns)
All checks were successful
Build and Deploy Teams Planner Bot / build-and-run (push) Successful in 32s
Classifier now receives a ConversationContext: a compact LLM-maintained
WorkingMemory (topic/focusPlan/lastTaskTitle/openLoops/notes), the last 2
raw turns, and a pendingDigest derived each turn from the pending action.
The LLM emits an optional memoryUpdate patch alongside its action in the
same tool call (no extra API hop). Volatile fields decay after 10 min idle,
notes truncate at 500 chars, raw turns ring-buffer at 2, openLoops cap at 5.
Logout wipes everything.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 15:30:38 +09:00
윤정민
01616c4526 feat: full Planner field coverage (priority/start/checklist/assignees/labels/bucket move)
All checks were successful
Build and Deploy Teams Planner Bot / build-and-run (push) Successful in 31s
Confirmation preview enumerates every side-effect (plan-level label creation,
assignee diff, bucket move, checklist truncation) so nothing happens that
wasn't shown on the card. Explicit-but-missing labels trigger a 3-button
choice (register / drop / cancel) since creating them mutates the Plan's
categoryDescriptions.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 15:10:33 +09:00
윤정민
59a983133f feat: preview card with Confirm/Cancel buttons before Planner writes
All checks were successful
Build and Deploy Teams Planner Bot / build-and-run (push) Successful in 30s
2026-05-15 17:44:54 +09:00
윤정민
59c6814ccc feat: exclude 'Deprecated' plans (and their tasks) from LLM context
All checks were successful
Build and Deploy Teams Planner Bot / build-and-run (push) Successful in 30s
2026-05-15 17:41:41 +09:00
윤정민
e42b3d7c43 fix: route Teams sign-in invokes to OAuth dialog + use UserTokenClient for sign-out
All checks were successful
Build and Deploy Teams Planner Bot / build-and-run (push) Successful in 30s
2026-05-15 17:33:39 +09:00
윤정민
fd504738eb initial: teams planner bot with gemini classifier and docker deploy
All checks were successful
Build and Deploy Teams Planner Bot / build-and-run (push) Successful in 14s
2026-05-15 16:53:08 +09:00