@feedmepos/mf-miniprogram-v2 0.1.0-dev.2 → 0.1.0-dev.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/app.js CHANGED
@@ -3,7 +3,7 @@ const n = [
3
3
  {
4
4
  path: "/",
5
5
  name: "miniprogram-v2-control",
6
- component: () => import("./ControlPlaneView-pfavWn-N.js")
6
+ component: () => import("./ControlPlaneView-BT2pLAu3.js")
7
7
  },
8
8
  {
9
9
  path: "/:pathMatch(.*)*",
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feedmepos/mf-miniprogram-v2",
3
- "version": "0.1.0-dev.2",
3
+ "version": "0.1.0-dev.21",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -23,6 +23,7 @@
23
23
  "build": "npm run type-check && npm run build-only:dev",
24
24
  "build:prod": "npm run type-check && npm run build-only:prod",
25
25
  "preview": "vite preview",
26
+ "test": "node --test src/components/PreviewPanel.test.mjs",
26
27
  "type-check": "vue-tsc --build --force",
27
28
  "typecheck": "npm run type-check",
28
29
  "build:mf:dev": "vite build --mode fmmf:dev",
@@ -39,6 +40,7 @@
39
40
  "@feedmepos/mf-common": "^1.27.9",
40
41
  "@feedmepos/ui-library": "1.8.4",
41
42
  "@opencode-ai/sdk": "*",
43
+ "diff": "^9.0.0",
42
44
  "dompurify": "^3.4.11",
43
45
  "highlight.js": "^11.11.1",
44
46
  "marked": "^18.0.5",
@@ -12,10 +12,12 @@ export declare function controlPlaneBaseUrl(): string;
12
12
  export declare function controlPlaneUrl(path: string): string;
13
13
  export declare function currentBusiness(): MaybeBusiness | undefined;
14
14
  export declare function currentBusinessId(): string;
15
- export declare function currentBusinessLabel(): string;
16
15
  export declare function currentBusinessSlug(): string | undefined;
17
16
  export declare function currentBusinessName(): string;
18
17
  export declare function currentBusinessCountry(): string | undefined;
18
+ export declare function currentBusinessLiveUrl(): string;
19
+ export declare function sleep(ms: number): Promise<unknown>;
20
+ export declare function errorMessage(error: unknown): string;
19
21
  export declare function controlPlaneAuthorizationHeader(): Promise<string | null>;
20
22
  export declare function authorizedFetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
21
23
  export declare function controlPlaneFetch<T>(path: string, init?: RequestInit): Promise<T>;
@@ -0,0 +1,7 @@
1
+ import type { PreviewAnnotationItem } from '../composables/previewAnnotations';
2
+ type __VLS_Props = {
3
+ items: PreviewAnnotationItem[];
4
+ };
5
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
6
+ declare const _default: typeof __VLS_export;
7
+ export default _default;
@@ -0,0 +1,9 @@
1
+ declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
2
+ close: () => any;
3
+ saved: () => any;
4
+ }, string, import("vue").PublicProps, Readonly<{}> & Readonly<{
5
+ onClose?: (() => any) | undefined;
6
+ onSaved?: (() => any) | undefined;
7
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
8
+ declare const _default: typeof __VLS_export;
9
+ export default _default;
@@ -0,0 +1,7 @@
1
+ import type { BrandKitProposal } from '../composables/brandkitProposal';
2
+ type __VLS_Props = {
3
+ proposal: BrandKitProposal;
4
+ };
5
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
6
+ declare const _default: typeof __VLS_export;
7
+ export default _default;
@@ -0,0 +1,6 @@
1
+ type __VLS_Props = {
2
+ text: string;
3
+ };
4
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
5
+ declare const _default: typeof __VLS_export;
6
+ export default _default;
@@ -0,0 +1,9 @@
1
+ import type { ChatMessage } from '../composables/types';
2
+ type __VLS_Props = {
3
+ files: string[];
4
+ diffs: ChatMessage['diffs'];
5
+ loading?: boolean;
6
+ };
7
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
8
+ declare const _default: typeof __VLS_export;
9
+ export default _default;
@@ -0,0 +1,6 @@
1
+ type __VLS_Props = {
2
+ text: string;
3
+ };
4
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
5
+ declare const _default: typeof __VLS_export;
6
+ export default _default;
@@ -0,0 +1,21 @@
1
+ import type { BadgeVariant } from '../composables/status';
2
+ type __VLS_Props = {
3
+ variant?: BadgeVariant;
4
+ size?: 'sm' | 'md';
5
+ };
6
+ declare var __VLS_1: {};
7
+ type __VLS_Slots = {} & {
8
+ default?: (props: typeof __VLS_1) => any;
9
+ };
10
+ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
11
+ size: "sm" | "md";
12
+ variant: BadgeVariant;
13
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
14
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
15
+ declare const _default: typeof __VLS_export;
16
+ export default _default;
17
+ type __VLS_WithSlots<T, S> = T & {
18
+ new (): {
19
+ $slots: S;
20
+ };
21
+ };
@@ -0,0 +1,11 @@
1
+ import type { ChatPart } from '../composables/types';
2
+ type ToolPart = Extract<ChatPart, {
3
+ kind: 'tool';
4
+ }>;
5
+ type __VLS_Props = {
6
+ parts: ToolPart[];
7
+ busy: boolean;
8
+ };
9
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
10
+ declare const _default: typeof __VLS_export;
11
+ export default _default;
@@ -0,0 +1,14 @@
1
+ export interface BrandKitProposal {
2
+ name?: string;
3
+ colors: Record<string, string>;
4
+ fonts: Record<string, string>;
5
+ }
6
+ export type ChatSegment = {
7
+ kind: 'markdown';
8
+ text: string;
9
+ } | {
10
+ kind: 'proposal';
11
+ proposal: BrandKitProposal;
12
+ };
13
+ export declare function parseBrandKitProposal(json: string): BrandKitProposal | null;
14
+ export declare function splitBrandKitProposals(text: string): ChatSegment[] | null;
@@ -0,0 +1,9 @@
1
+ export interface PreviewAnnotationItem {
2
+ id: number;
3
+ note: string;
4
+ label: string;
5
+ route?: string;
6
+ device?: string;
7
+ }
8
+ export declare function wrapAnnotationPayload(items: PreviewAnnotationItem[]): string;
9
+ export declare function parseAnnotationMessage(text: string): PreviewAnnotationItem[] | null;
@@ -0,0 +1,11 @@
1
+ import type { AgentSessionSummary, ConnectionStatus, ReleaseSummary } from './types';
2
+ export type BadgeVariant = 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'primary';
3
+ export declare function sessionStatusVariant(status: AgentSessionSummary['status']): BadgeVariant;
4
+ export declare function sessionStatusLabel(status: AgentSessionSummary['status']): string;
5
+ export declare function buildStatusVariant(status: string | null): BadgeVariant;
6
+ export declare function buildStatusLabel(status: string | null): string;
7
+ export declare function provisioningStatusLabel(status: string | null | undefined): string;
8
+ export declare function releaseHasPreview(release: Pick<ReleaseSummary, 'status'>): boolean;
9
+ export declare function releaseDisplayStatus(release: ReleaseSummary): string;
10
+ export declare function releaseDisplayVariant(release: ReleaseSummary): BadgeVariant;
11
+ export declare function connectionStatusVariant(status: ConnectionStatus): BadgeVariant;
@@ -1,4 +1,16 @@
1
1
  import type { ToolState } from '@opencode-ai/sdk';
2
+ /** OpenCode 1.17.14's server emits a unified `patch`, while the generated SDK
3
+ * still declares the older `before`/`after` shape. Keep both so current and
4
+ * already-archived sessions render through the same UI. */
5
+ export interface CodeFileDiff {
6
+ file: string;
7
+ patch?: string;
8
+ status?: 'added' | 'deleted' | 'modified';
9
+ before?: string;
10
+ after?: string;
11
+ additions: number;
12
+ deletions: number;
13
+ }
2
14
  export type ChatPart = {
3
15
  kind: 'text';
4
16
  id: string;
@@ -12,7 +24,21 @@ export type ChatPart = {
12
24
  id: string;
13
25
  tool: string;
14
26
  state: ToolState;
27
+ } | {
28
+ kind: 'file';
29
+ id: string;
30
+ mime: string;
31
+ filename?: string;
32
+ url: string;
15
33
  };
34
+ /** An image attached to an outgoing prompt. `url` is a data: URI so the file
35
+ * rides inline in the OpenCode prompt JSON through the transparent proxy —
36
+ * no separate upload channel exists (or is needed at screenshot sizes). */
37
+ export interface OutgoingAttachment {
38
+ mime: string;
39
+ filename?: string;
40
+ url: string;
41
+ }
16
42
  export interface ChatMessage {
17
43
  /** Stable render key. Starts as `local-{partId}` for our own just-sent
18
44
  * messages (the real message id isn't known until the server echoes it
@@ -21,13 +47,22 @@ export interface ChatMessage {
21
47
  key: string;
22
48
  id: string | null;
23
49
  role: 'user' | 'assistant';
50
+ /** Assistant messages point back to the user turn that spawned them. OpenCode
51
+ * stores the turn's final file diff on that user message, so this relation
52
+ * lets the UI render it beside the agent work that produced it. */
53
+ parentId: string | null;
24
54
  createdAt: number;
25
55
  parts: ChatPart[];
56
+ /** Patch parts arrive before the complete before/after diff is summarized.
57
+ * Keep their file names so the UI can show useful live progress. */
58
+ changedFiles: string[];
59
+ diffs: CodeFileDiff[];
26
60
  busy: boolean;
27
61
  errorText?: string;
28
62
  }
29
- export type ConnectionStatus = 'starting' | 'ready' | 'error';
63
+ export type ConnectionStatus = 'idle' | 'starting' | 'ready' | 'error';
30
64
  export type ProjectProvisioningStatus = 'not_started' | 'provisioning' | 'ready' | 'failed';
65
+ export type ArchiveCodeAction = 'save' | 'discard';
31
66
  export interface ProjectSummary {
32
67
  businessId: string;
33
68
  businessSlug: string | null;
@@ -63,6 +98,20 @@ export interface AgentSessionSummary {
63
98
  created_at: string;
64
99
  updated_at: string;
65
100
  }
101
+ export interface SessionChangesSummary {
102
+ businessId: string;
103
+ sessionId: string;
104
+ workspaceExists: boolean;
105
+ dirty: boolean;
106
+ hasUncommittedChanges: boolean;
107
+ hasUnpushedCommits: boolean;
108
+ headDiffersFromOrigin: boolean;
109
+ statusCount: number;
110
+ commitsAheadOrigin: number;
111
+ commitsBehindOrigin: number;
112
+ headSha: string | null;
113
+ originSha: string | null;
114
+ }
66
115
  export interface ReleaseSummary {
67
116
  id: string;
68
117
  source_commit_sha: string;
@@ -0,0 +1,45 @@
1
+ export interface BrandKitField {
2
+ path: string;
3
+ label: string;
4
+ group: string;
5
+ hint?: string;
6
+ }
7
+ export declare const COLOR_FIELDS: BrandKitField[];
8
+ export declare const FONT_FIELDS: BrandKitField[];
9
+ export declare function isHexColor(value: string): boolean;
10
+ export declare function toInputHex(value: string): string;
11
+ type KitObject = Record<string, unknown>;
12
+ declare function load(force?: boolean): Promise<void>;
13
+ declare function save(): Promise<void>;
14
+ declare function revertLastSave(): Promise<void>;
15
+ declare function applyProposal(proposal: {
16
+ name?: string;
17
+ colors: Record<string, string>;
18
+ fonts: Record<string, string>;
19
+ }): Promise<void>;
20
+ declare function discardEdits(): void;
21
+ export declare function useBrandKit(): {
22
+ state: {
23
+ panelOpen: boolean;
24
+ loading: boolean;
25
+ saving: boolean;
26
+ loaded: boolean;
27
+ error: string | null;
28
+ businessId: string | null;
29
+ colors: Record<string, string>;
30
+ fonts: Record<string, string>;
31
+ savedColors: Record<string, string>;
32
+ savedFonts: Record<string, string>;
33
+ revertKit: KitObject | null;
34
+ appliedProposal: string | null;
35
+ };
36
+ dirtyCount: import("vue").ComputedRef<number>;
37
+ hasInvalidColor: import("vue").ComputedRef<boolean>;
38
+ load: typeof load;
39
+ save: typeof save;
40
+ revertLastSave: typeof revertLastSave;
41
+ applyProposal: typeof applyProposal;
42
+ discardEdits: typeof discardEdits;
43
+ };
44
+ export type BrandKitStore = ReturnType<typeof useBrandKit>;
45
+ export {};
@@ -1,8 +1,10 @@
1
- import type { ChatMessage, ConnectionStatus } from './types';
1
+ import type { ChatMessage, ConnectionStatus, OutgoingAttachment } from './types';
2
2
  export declare function useChat(): {
3
3
  status: ConnectionStatus;
4
4
  statusText: string;
5
5
  previewUrl: string | null;
6
+ restartingPreview: boolean;
7
+ previewRestartError: string | null;
6
8
  sending: boolean;
7
9
  sessionId: string | null;
8
10
  workspaceSessionId: string | null;
@@ -16,6 +18,10 @@ export declare function useChat(): {
16
18
  sessionId?: string;
17
19
  readOnly?: boolean;
18
20
  }) => Promise<void>;
19
- sendMessage: (text: string) => Promise<void>;
21
+ reset: (message?: string) => void;
22
+ suspend: (message?: string) => void;
23
+ sendMessage: (text: string, attachments?: OutgoingAttachment[]) => Promise<void>;
24
+ abort: () => Promise<void>;
25
+ restartPreviewServer: () => Promise<boolean>;
20
26
  };
21
27
  export type ChatStore = ReturnType<typeof useChat>;
@@ -0,0 +1,6 @@
1
+ export declare function useIdleSuspend(options: {
2
+ timeoutMs: number;
3
+ isEligible: () => boolean;
4
+ isActive: () => boolean;
5
+ onSuspend: () => void;
6
+ }): void;
@@ -1,4 +1,4 @@
1
- import type { ProjectSummary, ReleaseSummary } from './types';
1
+ import type { ArchiveCodeAction, ProjectSummary, ReleaseSummary, SessionChangesSummary } from './types';
2
2
  export declare function useProject(): {
3
3
  businessId: string;
4
4
  project: {
@@ -56,7 +56,6 @@ export declare function useProject(): {
56
56
  statusText: string;
57
57
  activeReleaseId: string | null;
58
58
  activeReleasePreviewUrl: string | null;
59
- activeBuildJobId: string | null;
60
59
  latestRelease: {
61
60
  id: string;
62
61
  source_commit_sha: string;
@@ -73,26 +72,7 @@ export declare function useProject(): {
73
72
  build_created_at: string | null;
74
73
  build_completed_at: string | null;
75
74
  } | null;
76
- activeRelease: {
77
- id: string;
78
- source_commit_sha: string;
79
- created_from_session_id: string | null;
80
- session_title: string | null;
81
- status: "draft" | "preview" | "published" | "rolled_back";
82
- artifact_prefix: string;
83
- created_at: string;
84
- published_at: string | null;
85
- is_live: 0 | 1;
86
- build_job_id: string | null;
87
- build_status: "queued" | "running" | "succeeded" | "failed" | null;
88
- build_logs_url: string | null;
89
- build_created_at: string | null;
90
- build_completed_at: string | null;
91
- } | null;
92
- activeBuildStatus: "failed" | "queued" | "running" | "succeeded" | null;
93
- activeBuildLogsUrl: string | null;
94
75
  isProvisioned: boolean;
95
- isProvisioning: boolean;
96
76
  provisioningFailed: boolean;
97
77
  syncBusiness: () => void;
98
78
  refreshProject: () => Promise<ProjectSummary>;
@@ -102,21 +82,18 @@ export declare function useProject(): {
102
82
  releases: ReleaseSummary[];
103
83
  }>;
104
84
  selectRelease: (releaseId: string) => Promise<void>;
105
- createSession: () => Promise<{
85
+ createSession: (options?: {
86
+ archiveCodeAction?: ArchiveCodeAction;
87
+ }) => Promise<{
106
88
  sessionId: string;
107
89
  previewUrl: string;
108
90
  }>;
91
+ sessionChanges: (sessionId: string) => Promise<SessionChangesSummary>;
109
92
  resumeSession: (sessionId: string) => Promise<{
110
93
  sessionId: string;
111
94
  previewUrl: string;
112
95
  }>;
113
96
  renameSession: (sessionId: string, title: string) => Promise<void>;
114
- forkSession: (sessionId: string) => Promise<{
115
- sessionId: string;
116
- previewUrl: string;
117
- forkedFrom: string;
118
- }>;
119
- archive: (sessionId: string) => Promise<void>;
120
97
  commitSession: (sessionId: string) => Promise<{
121
98
  sourceCommitSha: string;
122
99
  }>;
@@ -127,6 +104,5 @@ export declare function useProject(): {
127
104
  }>;
128
105
  publish: (releaseId?: string | null) => Promise<void>;
129
106
  rollbackToV1: () => Promise<void>;
130
- rollbackToRelease: (releaseId: string) => Promise<void>;
131
107
  };
132
108
  export type ProjectStore = ReturnType<typeof useProject>;