Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
23b5a56
feat: enforce model image input capabilities
Wang-Daoji Aug 14, 2026
d70b793
Merge remote-tracking branch 'upstream/v1.0.7' into feature/agent-wy
Wang-Daoji Aug 14, 2026
1531917
Merge remote-tracking branch 'upstream/v1.0.7' into feature/agent-wy
Wang-Daoji Aug 14, 2026
3b2ea62
fix: allow TUI steer during active goals
Wang-Daoji Aug 14, 2026
b935b7a
Merge remote-tracking branch 'upstream/v1.0.7' into feature/agent-wy
Wang-Daoji Aug 14, 2026
43ea772
polish readme (#239)
ZongYue99 Aug 17, 2026
1f743df
Merge pull request #241 from hijzy/main
hijzy Aug 17, 2026
7314b6f
Merge remote-tracking branch 'upstream/main' into zy_git_v1.0.9
ZongYue99 Aug 17, 2026
f4f482a
Merge remote-tracking branch 'upstream/v1.0.7' into feature/agent-wy
Wang-Daoji Aug 17, 2026
dda6402
Merge upstream/main into feature/agent-wy
Wang-Daoji Aug 17, 2026
73b523d
add pkg upgrade UI
wustzdy Aug 17, 2026
862f4d2
Merge pull request #1 from wustzdy/v1.0.7_zdy_pkg_ui_0817
wustzdy Aug 17, 2026
19b5000
add pkg upgrade UI
wustzdy Aug 17, 2026
91eabbb
add pkg upgrade UI
wustzdy Aug 18, 2026
7fca0df
feat(memory): improve layered memory lifecycle
hijzy Aug 18, 2026
31f3b8e
Merge remote-tracking branch 'upstream/main' into feature/agent-wy
Wang-Daoji Aug 18, 2026
b7766d9
fix: log DAG compaction failures
Wang-Daoji Aug 18, 2026
e2c815b
add pkg upgrade UI
wustzdy Aug 18, 2026
df86649
fix(memory): harden layered memory lifecycle
hijzy Aug 18, 2026
f68af9b
Merge pull request #249 from wustzdy/v1.0.9_zdy_0818_pkg_ui
ZongYue99 Aug 18, 2026
8611de3
fix: open workspace menus below the trigger
ZongYue99 Aug 18, 2026
b7adc5b
feat(settings): enhance token usage section and invitation banner layout
EF1874 Aug 18, 2026
061bd89
fix: shift conversation beside the environment panel
ZongYue99 Aug 18, 2026
c3c7ed3
feat: add branch creation to workspace menu
ZongYue99 Aug 18, 2026
a385d18
feat: improve workspace diff viewer
ZongYue99 Aug 18, 2026
9b1988a
fix: isolate agent source zstd scanning
hijzy Aug 18, 2026
f39b00b
fix(memory): lower minimum recall score to 0.12
hijzy Aug 18, 2026
030794f
Merge pull request #251 from hijzy/main
hijzy Aug 18, 2026
b424584
Merge remote-tracking branch 'upstream/v1.0.9' into zy_git_v1.0.9
ZongYue99 Aug 18, 2026
88097b1
Merge pull request #252 from ZongYue99/zy_git_v1.0.9
ZongYue99 Aug 18, 2026
278f6ea
Merge pull request #255 from MemTensor/v1.0.8
wustzdy Aug 18, 2026
318be4c
fix: prevent shared CN and INTL login sessions from crossing channels
ZongYue99 Aug 18, 2026
8ab3819
Merge pull request #256 from ZongYue99/zy_git_v1.0.9
ZongYue99 Aug 18, 2026
1a5809a
Merge remote-tracking branch 'upstream/main' into feature/agent-wy
Wang-Daoji Aug 19, 2026
4641a66
Merge pull request #250 from EF1874/codex/refine-token-usage-v109
ZongYue99 Aug 19, 2026
d213664
fix(memory): decouple L1 and user memory capture
hijzy Aug 19, 2026
54171f3
Merge branch 'main' into v1.0.9
ZongYue99 Aug 19, 2026
57c9488
Merge remote-tracking branch 'upstream/v1.0.9' into feature/agent-wy
Wang-Daoji Aug 19, 2026
b6fe304
feat(analytics): enrich event identity and context
Aug 19, 2026
7412210
Merge pull request #260 from antalike/v1.0.9
ZongYue99 Aug 19, 2026
dfa8f92
Merge pull request #261 from Wang-Daoji/feature/agent-wy
Wang-Daoji Aug 19, 2026
a5742a5
Merge pull request #262 from hijzy/main
hijzy Aug 19, 2026
47a03fa
add pkg upgrade UI
wustzdy Aug 19, 2026
a99b78f
Merge pull request #263 from wustzdy/v1.0.9
wustzdy Aug 19, 2026
69925e2
feat: Implement agent gateway startup issue handling and recovery
EF1874 Aug 19, 2026
1dfc15f
Merge pull request #264 from EF1874/codex/fix-startup-config-recovery
ZongYue99 Aug 19, 2026
0e6f3cb
fix: resolve Windows ACL tools from System32
EF1874 Aug 19, 2026
aa21787
Merge pull request #265 from EF1874/codex/fix-startup-config-recovery
ZongYue99 Aug 19, 2026
6a36dbb
fix: preserve BYOK endpoint identity on retry
EF1874 Aug 19, 2026
a42dc80
Merge pull request #266 from EF1874/codex/fix-byok-next-button-v109
ZongYue99 Aug 19, 2026
f7fa457
fix: reuse existing BYOK endpoints after key re-entry
EF1874 Aug 19, 2026
8b6d836
Merge pull request #267 from EF1874/codex/fix-byok-next-button-v109
ZongYue99 Aug 19, 2026
f7feeec
chore(release): prepare Memmy v1.0.9
Aug 19, 2026
b6319b6
fix(release): close v1.0.9 quality gaps
Aug 19, 2026
5873cb7
test(packaging): align v1.0.9 runtime assertions
Aug 19, 2026
9194d97
fix(updater): support legacy Windows in-app upgrades
Aug 19, 2026
c3beb21
Merge pull request #269 from EF1874/codex/fix-v1.0.9-in-app-update-un…
ZongYue99 Aug 20, 2026
e1aea91
add pkg install log
wustzdy Aug 20, 2026
440b4e1
Merge pull request #271 from wustzdy/v1.0.9_zdy_0820_log
wustzdy Aug 20, 2026
0e1c54b
Merge pull request #272 from MemTensor/v1.0.9
wustzdy Aug 20, 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
27 changes: 27 additions & 0 deletions .github/release-notes/v1.0.9.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Memmy v1.0.9

## Highlights

- Added a first-class Git workspace view to Agent conversations. You can inspect repository and branch state, review file changes and rendered diffs, see Goal evidence, and switch or create local branches without leaving Memmy.
- Introduced a dedicated User Memory layer for facts, preferences, and explicit directives, together with per-turn evidence showing which memories supported an Agent response.
- Added an in-app desktop update experience with update notifications, download progress, restart-to-install controls, and background preparation for managed updates on macOS and Windows.

## Agent and workspace improvements

- Improved image handling by checking the selected model's input capabilities before sending and using the account image-to-text fallback only when appropriate.
- TUI follow-ups can now steer an active Goal turn instead of waiting behind it.
- Moved conversation-source scanning into an isolated process, improving resilience when importing compressed Agent histories.

## Memory improvements

- User Memory now captures and consolidates user facts, preferences, and directives independently from raw traces and Agent experience, with searchable list, detail, and deletion views.
- Agent responses can show recalled memories with their layer, recall score, source conversation or Skill, and delete/undo controls.
- Hardened the layered Memory lifecycle so compatible Skills are consolidated, outdated downstream knowledge follows changes in its source evidence, and Skills discovered from connected Agents can be recalled across Agents.

## Desktop and setup reliability

- BYOK setup now surfaces save failures, disables actions while saving, supports retries, and reuses existing endpoint identities to avoid duplicates after API-key re-entry.
- Existing installations with legacy model configuration are repaired during upgrade, while Agent Gateway startup failures no longer force the desktop app to exit and are retried in the background.
- Windows configuration repair now resolves ACL tools from verified system locations, including installations under paths containing spaces.
- Kept China phone-login and International email-login sessions isolated so credentials cannot cross desktop editions.
- Refined the Settings token-usage layout so the complete usage breakdown remains ahead of the invitation card.
6 changes: 5 additions & 1 deletion App/backend/local-api-contracts/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -214,9 +214,13 @@ export const ByokTokenUsageSummarySchema = z.object({
});
export type ByokTokenUsageSummary = z.infer<typeof ByokTokenUsageSummarySchema>;

export const AgentGatewayStartupIssueSchema = z.enum(["model_config_invalid"]);
export type AgentGatewayStartupIssue = z.infer<typeof AgentGatewayStartupIssueSchema>;

export const AgentGatewayRuntimeConfigSchema = z.object({
baseUrl: z.string().url(),
bootstrapSecret: z.string().min(1).optional()
bootstrapSecret: z.string().min(1).optional(),
startupIssue: AgentGatewayStartupIssueSchema.optional()
});
export type AgentGatewayRuntimeConfig = z.infer<typeof AgentGatewayRuntimeConfigSchema>;

Expand Down
59 changes: 51 additions & 8 deletions App/backend/local-api-contracts/src/memory-runtime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,14 @@ export const CursorSchema = z.string();
export type Cursor = z.infer<typeof CursorSchema>;

/** Schema for memory kind. */
export const MemoryKindSchema = z.enum(["trace", "span", "policy", "world_model", "skill"]);
export const MemoryKindSchema = z.enum(["user_memory", "trace", "span", "policy", "world_model", "skill"]);
export type MemoryKind = z.infer<typeof MemoryKindSchema>;

/** Schema for memory layer. */
export const MemoryLayerSchema = z.enum(["L1", "L2", "L3", "Skill"]);
export type MemoryLayer = z.infer<typeof MemoryLayerSchema>;
export const RecallMemoryLayerSchema = z.enum(["UserMemory", "L1", "L2", "L3", "Skill"]);
export type RecallMemoryLayer = z.infer<typeof RecallMemoryLayerSchema>;

/** Schema for memory status. */
export const MemoryStatusSchema = z.enum(["activated", "resolving", "archived", "deleted"]);
Expand All @@ -29,6 +31,7 @@ export type JobStatus = z.infer<typeof JobStatusSchema>;
export const JobTypeSchema = z.enum([
"episode_idle_close",
"trace_summary",
"user_memory_embedding",
"import_summary",
"reflection",
"embedding",
Expand All @@ -49,7 +52,7 @@ export const InjectedContextSectionSchema = z.object({
id: NonEmptyStringSchema,
title: NonEmptyStringSchema,
kind: MemoryKindSchema,
memoryLayer: MemoryLayerSchema,
memoryLayer: RecallMemoryLayerSchema,
memoryIds: z.array(NonEmptyStringSchema),
content: z.string(),
tokenEstimate: z.number().int().nonnegative().optional()
Expand All @@ -67,17 +70,45 @@ export type InjectedContext = z.infer<typeof InjectedContextSchema>;
export const RecallHitSchema = z.object({
id: NonEmptyStringSchema,
kind: MemoryKindSchema,
memoryLayer: MemoryLayerSchema,
memoryLayer: RecallMemoryLayerSchema,
status: MemoryStatusSchema,
title: z.string().optional(),
snippet: z.string(),
score: z.number(),
tags: z.array(z.string()),
createdAt: IsoTimeSchema.optional(),
updatedAt: IsoTimeSchema.optional(),
source: z.enum(["search", "episode", "rule", "skill"])
source: z.enum(["search", "episode", "rule", "skill"]),
sourceTurnId: z.string().optional(),
memberMemoryIds: z.array(NonEmptyStringSchema).optional(),
retrievalRoutes: z.array(z.enum(["user_memory", "l1", "agent_memory"])).optional(),
sourceAgentId: z.string().optional(),
sourceSkillId: z.string().optional(),
sourceSkillVersion: z.string().optional(),
readOnly: z.boolean().optional(),
members: z.array(z.object({
id: NonEmptyStringSchema,
kind: MemoryKindSchema,
memoryLayer: RecallMemoryLayerSchema,
status: z.union([MemoryStatusSchema, z.enum(["active", "archived", "deleted"])]),
content: z.string(),
createdAt: IsoTimeSchema,
updatedAt: IsoTimeSchema,
retrievalRoute: z.enum(["user_memory", "l1", "agent_memory"])
})).optional()
});
export type RecallHit = z.infer<typeof RecallHitSchema>;

export const RecallEvidenceOutputSchema = z.object({
recallEventId: NonEmptyStringSchema,
queryId: NonEmptyStringSchema,
query: z.string(),
hits: z.array(RecallHitSchema),
createdAt: IsoTimeSchema,
serverTime: IsoTimeSchema
});
export type RecallEvidenceOutput = z.infer<typeof RecallEvidenceOutputSchema>;

/** Schema for memory metrics. */
export const MemoryMetricsSchema = z.object({
value: z.number().optional(),
Expand Down Expand Up @@ -116,7 +147,7 @@ export type MemoryProcessingRecord = z.infer<typeof MemoryProcessingRecordSchema
export const MemoryListItemSchema = z.object({
id: NonEmptyStringSchema,
kind: MemoryKindSchema,
memoryLayer: MemoryLayerSchema,
memoryLayer: RecallMemoryLayerSchema,
status: MemoryStatusSchema,
title: NonEmptyStringSchema,
summary: z.string(),
Expand Down Expand Up @@ -324,7 +355,11 @@ export const CompleteTurnInputSchema = RuntimeRequestFieldsSchema.extend({
artifacts: z.array(z.unknown()).optional(),
sourceMemoryIds: z.array(NonEmptyStringSchema).optional(),
usage: z.record(z.string(), z.unknown()).optional(),
status: z.enum(["succeeded", "failed"]).optional()
status: z.enum(["succeeded", "failed"]).optional(),
userMemoryCorrection: z.object({
targetMemoryId: NonEmptyStringSchema,
revisedContent: NonEmptyStringSchema
}).optional()
});
export type CompleteTurnInput = z.infer<typeof CompleteTurnInputSchema>;

Expand All @@ -334,6 +369,8 @@ export const CompleteTurnOutputSchema = z.object({
sessionId: NonEmptyStringSchema,
episodeId: NonEmptyStringSchema,
rawTurnId: NonEmptyStringSchema,
userMemoryId: z.string().optional(),
userMemoryIds: z.array(NonEmptyStringSchema).optional(),
l1MemoryId: z.string(),
l1MemoryIds: z.array(NonEmptyStringSchema),
closedEpisodeIds: z.array(NonEmptyStringSchema),
Expand Down Expand Up @@ -388,7 +425,12 @@ export const AddMemoryInputSchema = RuntimeRequestFieldsSchema.extend({
sessionId: z.string().optional(),
turnId: z.string().optional(),
createdAt: IsoTimeSchema.optional(),
deferProcessing: z.boolean().optional()
deferProcessing: z.boolean().optional(),
sourceAgentId: z.string().optional(),
sourceSkillId: z.string().optional(),
sourceSkillPath: z.string().optional(),
sourceSkillVersion: z.string().optional(),
sourceContentHash: z.string().optional()
});
export type AddMemoryInput = z.infer<typeof AddMemoryInputSchema>;

Expand Down Expand Up @@ -547,7 +589,7 @@ export type RetryMemoryProcessingOutput = z.infer<typeof RetryMemoryProcessingOu

/** Schema for panel items input. */
export const PanelItemsInputSchema = z.object({
layer: MemoryLayerSchema.optional(),
layer: RecallMemoryLayerSchema.optional(),
status: MemoryStatusSchema.optional(),
q: z.string().optional(),
sourceAgent: z.string().trim().min(1).optional(),
Expand Down Expand Up @@ -606,6 +648,7 @@ export type PanelJobsInput = z.infer<typeof PanelJobsInputSchema>;
export const PanelOverviewOutputSchema = z.object({
counts: z.object({
memories: z.number().int().nonnegative(),
userMemories: z.number().int().nonnegative().default(0),
skills: z.number().int().nonnegative(),
experiences: z.number().int().nonnegative(),
worldModels: z.number().int().nonnegative()
Expand Down
1 change: 1 addition & 0 deletions App/backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
"@modelcontextprotocol/sdk": "^1.29.0",
"dotenv": "^16.6.1",
"fastify": "^5.8.5",
"fzstd": "^0.1.1",
"sqlite-vec": "0.1.9",
"yaml": "^2.9.0",
"zod": "^4.4.3"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,23 @@ const MemoryParamsSchema = z.object({
id: z.string().min(1)
});

const RecallParamsSchema = z.object({
queryId: z.string().min(1)
});

export function registerMemoryRoutes(app: FastifyInstance, deps: AgentRuntimeRouteDeps): void {
app.get(
"/api/v1/memory/recalls/:queryId",
{ preHandler: deps.authenticateRuntimeToken },
withErrorEnvelope(async (request, reply) => {
const params = RecallParamsSchema.parse(request.params);
return reply.send(await deps.services.memoryDetail.recallEvidence(
params.queryId,
runtimeContextFromRequest(request, deps.timeZone)
));
})
);

app.post(
"/api/v1/memory/add",
{ preHandler: deps.authenticateRuntimeToken },
Expand Down
Loading
Loading