aimeat 1.7.0 → 1.8.0
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/bin/aimeat.js +0 -0
- package/dist/locales/en.json +46 -3
- package/dist/locales/fi.json +46 -3
- package/dist/public/css/views/agents-detail.css +150 -0
- package/dist/public/css/views/profile.css +22 -2
- package/dist/public/js/services/generator-spec-validate.js +23 -0
- package/dist/public/js/services/memory.js +39 -0
- package/dist/public/views/admin/federation-tab.js +5 -5
- package/dist/public/views/admin/prompts-tab.js +9 -10
- package/dist/public/views/profile/access-tab.js +18 -0
- package/dist/public/views/profile/agents-messages-subtab.js +3 -2
- package/dist/public/views/profile/agents-tab.js +10 -6
- package/dist/public/views/profile/agents-tasks-subtab.js +123 -64
- package/dist/public/views/profile/generator-detail.js +8 -1
- package/dist/public/views/profile/memory-tab.js +371 -7
- package/dist/public/views/profile/wallet-tab.js +14 -0
- package/dist/src/models/agent-capabilities-schemas.d.ts +3 -0
- package/dist/src/models/agent-capabilities-schemas.d.ts.map +1 -1
- package/dist/src/models/agent-capabilities-schemas.js +3 -0
- package/dist/src/models/agent-capabilities-schemas.js.map +1 -1
- package/dist/src/routes/admin-monitoring.js +12 -7
- package/dist/src/routes/admin-monitoring.js.map +1 -1
- package/dist/src/routes/agent-capabilities.d.ts +1 -0
- package/dist/src/routes/agent-capabilities.d.ts.map +1 -1
- package/dist/src/routes/agent-capabilities.js +9 -0
- package/dist/src/routes/agent-capabilities.js.map +1 -1
- package/dist/src/routes/agent-tasks.d.ts +1 -0
- package/dist/src/routes/agent-tasks.d.ts.map +1 -1
- package/dist/src/routes/agent-tasks.js +9 -7
- package/dist/src/routes/agent-tasks.js.map +1 -1
- package/dist/src/routes/federation-auth.d.ts.map +1 -1
- package/dist/src/routes/federation-auth.js +3 -1
- package/dist/src/routes/federation-auth.js.map +1 -1
- package/dist/src/routes/federation-peer.d.ts.map +1 -1
- package/dist/src/routes/federation-peer.js +11 -2
- package/dist/src/routes/federation-peer.js.map +1 -1
- package/dist/src/routes/federation-sync.d.ts +1 -0
- package/dist/src/routes/federation-sync.d.ts.map +1 -1
- package/dist/src/routes/federation-sync.js +29 -0
- package/dist/src/routes/federation-sync.js.map +1 -1
- package/dist/src/routes/memory.d.ts +9 -0
- package/dist/src/routes/memory.d.ts.map +1 -1
- package/dist/src/routes/memory.js +304 -9
- package/dist/src/routes/memory.js.map +1 -1
- package/dist/src/routes/prompts.d.ts +1 -0
- package/dist/src/routes/prompts.d.ts.map +1 -1
- package/dist/src/routes/prompts.js +40 -1
- package/dist/src/routes/prompts.js.map +1 -1
- package/dist/src/routes/sharing-groups.d.ts.map +1 -1
- package/dist/src/routes/sharing-groups.js +8 -2
- package/dist/src/routes/sharing-groups.js.map +1 -1
- package/dist/src/routes/wallet.d.ts.map +1 -1
- package/dist/src/routes/wallet.js +2 -0
- package/dist/src/routes/wallet.js.map +1 -1
- package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
- package/dist/src/server-bootstrap/routes-loader.js +31 -0
- package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
- package/dist/src/services/federation-helpers.d.ts +1 -0
- package/dist/src/services/federation-helpers.d.ts.map +1 -1
- package/dist/src/services/federation-helpers.js +1 -1
- package/dist/src/services/federation-helpers.js.map +1 -1
- package/dist/src/services/generator-autopilot.d.ts.map +1 -1
- package/dist/src/services/generator-autopilot.js +125 -26
- package/dist/src/services/generator-autopilot.js.map +1 -1
- package/dist/src/services/generator-prompts/index.d.ts +1 -1
- package/dist/src/services/generator-prompts/index.d.ts.map +1 -1
- package/dist/src/services/generator-prompts/index.js +1 -1
- package/dist/src/services/generator-prompts/index.js.map +1 -1
- package/dist/src/services/generator-prompts/spec-validate.d.ts +1 -0
- package/dist/src/services/generator-prompts/spec-validate.d.ts.map +1 -1
- package/dist/src/services/generator-prompts/spec-validate.js +20 -0
- package/dist/src/services/generator-prompts/spec-validate.js.map +1 -1
- package/dist/src/services/generator-prompts/validate.d.ts +7 -1
- package/dist/src/services/generator-prompts/validate.d.ts.map +1 -1
- package/dist/src/services/generator-prompts/validate.js +70 -0
- package/dist/src/services/generator-prompts/validate.js.map +1 -1
- package/dist/src/services/prompt-defaults.d.ts +1 -0
- package/dist/src/services/prompt-defaults.d.ts.map +1 -1
- package/dist/src/services/prompt-defaults.js +830 -8
- package/dist/src/services/prompt-defaults.js.map +1 -1
- package/dist/src/services/prompt-seeder.js +1 -1
- package/dist/src/services/prompt-seeder.js.map +1 -1
- package/dist/src/storage/interface.d.ts +2 -0
- package/dist/src/storage/interface.d.ts.map +1 -1
- package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
- package/dist/src/storage/providers/mongodb/index.js +5 -2
- package/dist/src/storage/providers/mongodb/index.js.map +1 -1
- package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/index.js +7 -2
- package/dist/src/storage/providers/sqlite/index.js.map +1 -1
- package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/schema.js +2 -0
- package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
- package/package.json +77 -97
- package/prisma/schema.prisma +2 -0
package/dist/bin/aimeat.js
CHANGED
|
File without changes
|
package/dist/locales/en.json
CHANGED
|
@@ -267,6 +267,7 @@
|
|
|
267
267
|
"loadError": "Could not load agents.",
|
|
268
268
|
"trust": "Trust",
|
|
269
269
|
"balance": "Balance",
|
|
270
|
+
"usesOwnerWallet": "Uses owner's wallet",
|
|
270
271
|
"lastSeen": "Last seen",
|
|
271
272
|
"roles": "Roles",
|
|
272
273
|
"created": "Created",
|
|
@@ -590,7 +591,9 @@
|
|
|
590
591
|
"lifetimeEarned": "Earned",
|
|
591
592
|
"lifetimeSpent": "Spent",
|
|
592
593
|
"lifetimeAllowance": "Allowance Received",
|
|
593
|
-
"lifetimeWelcome": "Welcome Bonus"
|
|
594
|
+
"lifetimeWelcome": "Welcome Bonus",
|
|
595
|
+
"federatedInfo": "Your wallet is on your home node. Morsel balance, transactions, and allowances are managed there.",
|
|
596
|
+
"federatedHomeNode": "Home node"
|
|
594
597
|
},
|
|
595
598
|
"memory": {
|
|
596
599
|
"title": "Memory",
|
|
@@ -644,7 +647,44 @@
|
|
|
644
647
|
"shareSuccess": "Shared to federation",
|
|
645
648
|
"unshareSuccess": "Removed from federation",
|
|
646
649
|
"selectGroup": "Select group",
|
|
647
|
-
"
|
|
650
|
+
"skipGroup": "Skip",
|
|
651
|
+
"noGroups": "No sharing groups. Create one in the Access tab.",
|
|
652
|
+
"sortLabel": "Sort:",
|
|
653
|
+
"sortUpdated": "Last updated",
|
|
654
|
+
"sortCreated": "Created",
|
|
655
|
+
"sortAlpha": "A-Z",
|
|
656
|
+
"timeJustNow": "just now",
|
|
657
|
+
"timeMinsAgo": "{n}m ago",
|
|
658
|
+
"timeHoursAgo": "{n}h ago",
|
|
659
|
+
"timeDaysAgo": "{n}d ago",
|
|
660
|
+
"discoverTitle": "Discover Public",
|
|
661
|
+
"discoverDesc": "Browse public memory entries shared by other users on this node. Click an entry to preview its contents, then copy it to your own memory.",
|
|
662
|
+
"discoverSearchPlaceholder": "Search by key, owner, or tag...",
|
|
663
|
+
"discoverLoading": "Searching public memories...",
|
|
664
|
+
"discoverCount": "{count} public entries found",
|
|
665
|
+
"discoverEmpty": "No public memory entries found from other users.",
|
|
666
|
+
"discoverCopy": "Copy",
|
|
667
|
+
"discoverCopied": "Copied to your memory!",
|
|
668
|
+
"browseHome": "Browse Home Node",
|
|
669
|
+
"browseHomeDesc": "Your memories stored on your home node. Pull them here to use locally.",
|
|
670
|
+
"browseRemote": "Browse Remote Nodes",
|
|
671
|
+
"browseRemoteDesc": "Your memories stored on nodes where you've logged in via federation.",
|
|
672
|
+
"browseRemoteSelect": "Select a peer node to browse your memories there",
|
|
673
|
+
"remoteEntries": "{count} entries on {node}",
|
|
674
|
+
"homeEntries": "{count} entries on home node",
|
|
675
|
+
"pullEntry": "Pull",
|
|
676
|
+
"pullAllBtn": "Pull All",
|
|
677
|
+
"pullAllConfirm": "Pull all {count} entries from {node}?",
|
|
678
|
+
"pullingAll": "Pulling entries...",
|
|
679
|
+
"pullAllSuccess": "Pulled {count} entries",
|
|
680
|
+
"noPeers": "No active federation peers",
|
|
681
|
+
"noRemoteEntries": "No memory entries found on this node",
|
|
682
|
+
"noHomeEntries": "No memory entries found on your home node",
|
|
683
|
+
"loadingRemote": "Loading remote memories...",
|
|
684
|
+
"loadingHome": "Loading home node memories...",
|
|
685
|
+
"errorLocalhost": "Cannot browse this node. Local/development nodes are not reachable from public nodes. Both nodes must be publicly accessible for cross-node browsing to work.",
|
|
686
|
+
"errorPeerNotFound": "Peer node not found in the federation directory. It may have been removed or is no longer active.",
|
|
687
|
+
"errorPeerUnsupported": "This peer node does not support memory browsing yet. It may be running an older version of AIMEAT."
|
|
648
688
|
},
|
|
649
689
|
"files": {
|
|
650
690
|
"title": "Stored Files",
|
|
@@ -3375,6 +3415,8 @@
|
|
|
3375
3415
|
"fedPeerEmergencyRemoved": "Peer immediately disconnected. All in-flight work cancelled.",
|
|
3376
3416
|
|
|
3377
3417
|
"fedRequestHistoryTitle": "Peering Request History",
|
|
3418
|
+
"fedDeleteRequestConfirm": "Delete this peering request from history?",
|
|
3419
|
+
"fedRequestDeleted": "Peering request deleted",
|
|
3378
3420
|
|
|
3379
3421
|
"fedJoinTitle": "Join Genesis Network",
|
|
3380
3422
|
"fedJoinExplain": "Connect this node to an existing AIMEAT genesis network. Enter the genesis node URL and select your role. The genesis operator will review and approve your request.",
|
|
@@ -4612,7 +4654,8 @@
|
|
|
4612
4654
|
"public": "Public",
|
|
4613
4655
|
"private": "Private",
|
|
4614
4656
|
"owner": "My Agents",
|
|
4615
|
-
"shared": "My Agents"
|
|
4657
|
+
"shared": "My Agents",
|
|
4658
|
+
"group": "Group"
|
|
4616
4659
|
},
|
|
4617
4660
|
"federate": "Federate",
|
|
4618
4661
|
"federated": "Federated",
|
package/dist/locales/fi.json
CHANGED
|
@@ -267,6 +267,7 @@
|
|
|
267
267
|
"loadError": "Agenttien lataus epäonnistui.",
|
|
268
268
|
"trust": "Luottamus",
|
|
269
269
|
"balance": "Saldo",
|
|
270
|
+
"usesOwnerWallet": "Käyttää omistajan lompakkoa",
|
|
270
271
|
"lastSeen": "Nähty viimeksi",
|
|
271
272
|
"roles": "Roolit",
|
|
272
273
|
"created": "Luotu",
|
|
@@ -590,7 +591,9 @@
|
|
|
590
591
|
"lifetimeEarned": "Ansaittu",
|
|
591
592
|
"lifetimeSpent": "Käytetty",
|
|
592
593
|
"lifetimeAllowance": "Kiintiö vastaanotettu",
|
|
593
|
-
"lifetimeWelcome": "Tervetuliaisbonus"
|
|
594
|
+
"lifetimeWelcome": "Tervetuliaisbonus",
|
|
595
|
+
"federatedInfo": "Lompakkosi on kotisolmullasi. Morselisaldo, tapahtumat ja päiväkohtaiset lisäykset hallitaan siellä.",
|
|
596
|
+
"federatedHomeNode": "Kotisolmu"
|
|
594
597
|
},
|
|
595
598
|
"memory": {
|
|
596
599
|
"title": "Muisti",
|
|
@@ -644,7 +647,44 @@
|
|
|
644
647
|
"shareSuccess": "Jaettu federaatioon",
|
|
645
648
|
"unshareSuccess": "Poistettu federaatiosta",
|
|
646
649
|
"selectGroup": "Valitse ryhma",
|
|
647
|
-
"
|
|
650
|
+
"skipGroup": "Ohita",
|
|
651
|
+
"noGroups": "Ei jakoryhmiä. Luo ryhma Oikeudet-valilehdessa.",
|
|
652
|
+
"sortLabel": "Järjestys:",
|
|
653
|
+
"sortUpdated": "Viimeksi päivitetty",
|
|
654
|
+
"sortCreated": "Luotu",
|
|
655
|
+
"sortAlpha": "A-Ö",
|
|
656
|
+
"timeJustNow": "juuri nyt",
|
|
657
|
+
"timeMinsAgo": "{n} min sitten",
|
|
658
|
+
"timeHoursAgo": "{n} t sitten",
|
|
659
|
+
"timeDaysAgo": "{n} pv sitten",
|
|
660
|
+
"discoverTitle": "Selaa julkisia",
|
|
661
|
+
"discoverDesc": "Selaa muiden kayttajien julkisia muistimerkintoja talla solmulla. Klikkaa merkintaa esikatsellaksesi sisaltoa ja kopioi se omaan muistiisi.",
|
|
662
|
+
"discoverSearchPlaceholder": "Hae avaimella, omistajalla tai tagilla...",
|
|
663
|
+
"discoverLoading": "Haetaan julkisia muisteja...",
|
|
664
|
+
"discoverCount": "{count} julkista merkintaa loydetty",
|
|
665
|
+
"discoverEmpty": "Ei julkisia muistimerkintoja muilta kayttajilta.",
|
|
666
|
+
"discoverCopy": "Kopioi",
|
|
667
|
+
"discoverCopied": "Kopioitu muistiisi!",
|
|
668
|
+
"browseHome": "Selaa kotisolmua",
|
|
669
|
+
"browseHomeDesc": "Muistisi kotisolmullasi. Vedä ne tänne käytettäväksi paikallisesti.",
|
|
670
|
+
"browseRemote": "Selaa etäsolmuja",
|
|
671
|
+
"browseRemoteDesc": "Muistisi solmuilla joihin olet kirjautunut federaation kautta.",
|
|
672
|
+
"browseRemoteSelect": "Valitse vertaissolmu selataksesi muistejasi siellä",
|
|
673
|
+
"remoteEntries": "{count} merkintää solmulla {node}",
|
|
674
|
+
"homeEntries": "{count} merkintää kotisolmulla",
|
|
675
|
+
"pullEntry": "Vedä",
|
|
676
|
+
"pullAllBtn": "Vedä kaikki",
|
|
677
|
+
"pullAllConfirm": "Vedä kaikki {count} merkintää solmulta {node}?",
|
|
678
|
+
"pullingAll": "Vedetään merkintöjä...",
|
|
679
|
+
"pullAllSuccess": "Vedetty {count} merkintää",
|
|
680
|
+
"noPeers": "Ei aktiivisia federaatiovertaisia",
|
|
681
|
+
"noRemoteEntries": "Ei muistimerkintöjä tällä solmulla",
|
|
682
|
+
"noHomeEntries": "Ei muistimerkintöjä kotisolmullasi",
|
|
683
|
+
"loadingRemote": "Ladataan etämuisteja...",
|
|
684
|
+
"loadingHome": "Ladataan kotisolmun muisteja...",
|
|
685
|
+
"errorLocalhost": "Tätä solmua ei voi selata. Paikalliset/kehityssolmut eivät ole saavutettavissa julkisilta solmuilta. Molempien solmujen tulee olla julkisesti saavutettavissa.",
|
|
686
|
+
"errorPeerNotFound": "Vertaissolmua ei löydy federaatiohakemistosta. Se on voitu poistaa tai se ei ole enää aktiivinen.",
|
|
687
|
+
"errorPeerUnsupported": "Tämä vertaissolmu ei tue vielä muistien selaamista. Se saattaa käyttää vanhempaa AIMEAT-versiota."
|
|
648
688
|
},
|
|
649
689
|
"files": {
|
|
650
690
|
"title": "Tallennetut tiedostot",
|
|
@@ -3375,6 +3415,8 @@
|
|
|
3375
3415
|
"fedPeerEmergencyRemoved": "Vertainen katkaistu välittömästi. Kaikki keskeneräiset työt peruutettu.",
|
|
3376
3416
|
|
|
3377
3417
|
"fedRequestHistoryTitle": "Vertaispyyntöjen historia",
|
|
3418
|
+
"fedDeleteRequestConfirm": "Poista tämä vertaisverkkopyyntö historiasta?",
|
|
3419
|
+
"fedRequestDeleted": "Vertaisverkkopyyntö poistettu",
|
|
3378
3420
|
|
|
3379
3421
|
"fedJoinTitle": "Liity genesis-verkkoon",
|
|
3380
3422
|
"fedJoinExplain": "Yhdistä tämä solmu olemassa olevaan AIMEAT genesis-verkkoon. Syötä genesis-solmun URL ja valitse roolisi. Genesis-operaattori tarkistaa ja hyväksyy pyyntösi.",
|
|
@@ -4612,7 +4654,8 @@
|
|
|
4612
4654
|
"public": "Julkinen",
|
|
4613
4655
|
"private": "Yksityinen",
|
|
4614
4656
|
"owner": "Omat agentit",
|
|
4615
|
-
"shared": "Omat agentit"
|
|
4657
|
+
"shared": "Omat agentit",
|
|
4658
|
+
"group": "Ryhma"
|
|
4616
4659
|
},
|
|
4617
4660
|
"federate": "Federoi",
|
|
4618
4661
|
"federated": "Federoitu",
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* v1.1.0 -- 2026-05-22 -- Add capability badge styles for Capabilities sub-tab
|
|
9
9
|
* v1.2.0 -- 2026-05-22 -- Add Activity sub-tab styles (stats cards, chart, jobs, event log)
|
|
10
10
|
* v1.3.0 -- 2026-05-22 -- Add Services and Messages sub-tab styles
|
|
11
|
+
* v1.4.0 -- 2026-05-22 -- Add Task TODO list, progress, environment badges, Start button styles
|
|
11
12
|
*/
|
|
12
13
|
|
|
13
14
|
/* Sub-tab bar */
|
|
@@ -510,6 +511,10 @@
|
|
|
510
511
|
.pf .agd-msg-meta-right {
|
|
511
512
|
text-align: right;
|
|
512
513
|
}
|
|
514
|
+
.pf .agd-msg-time {
|
|
515
|
+
font-weight: 500;
|
|
516
|
+
color: var(--text-secondary, #6B7280);
|
|
517
|
+
}
|
|
513
518
|
.pf .agd-msg-input {
|
|
514
519
|
display: flex;
|
|
515
520
|
gap: 0.5rem;
|
|
@@ -561,3 +566,148 @@
|
|
|
561
566
|
border-color: var(--accent, #E8564A);
|
|
562
567
|
color: var(--accent, #E8564A);
|
|
563
568
|
}
|
|
569
|
+
|
|
570
|
+
/* ── Task TODO list ── */
|
|
571
|
+
|
|
572
|
+
/* Progress badge shown next to task title */
|
|
573
|
+
.pf .agd-todo-progress {
|
|
574
|
+
font-size: 0.7rem;
|
|
575
|
+
font-weight: 600;
|
|
576
|
+
padding: 1px 7px;
|
|
577
|
+
border-radius: 10px;
|
|
578
|
+
background: rgba(37, 99, 235, 0.1);
|
|
579
|
+
color: #2563eb;
|
|
580
|
+
white-space: nowrap;
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
/* TODO section wrapper inside expanded task */
|
|
584
|
+
.pf .agd-todo-section {
|
|
585
|
+
margin: 0.5rem 0;
|
|
586
|
+
}
|
|
587
|
+
.pf .agd-todo-header {
|
|
588
|
+
display: flex;
|
|
589
|
+
align-items: center;
|
|
590
|
+
justify-content: space-between;
|
|
591
|
+
margin-bottom: 0.35rem;
|
|
592
|
+
font-size: 0.8rem;
|
|
593
|
+
}
|
|
594
|
+
.pf .agd-todo-summary {
|
|
595
|
+
display: flex;
|
|
596
|
+
align-items: center;
|
|
597
|
+
gap: 0.5rem;
|
|
598
|
+
}
|
|
599
|
+
.pf .agd-todo-time {
|
|
600
|
+
font-size: 0.7rem;
|
|
601
|
+
color: var(--text-muted, #9CA3AF);
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
/* Environment badges (AIMEAT / Agent) */
|
|
605
|
+
.pf .agd-env-badge {
|
|
606
|
+
font-size: 0.6rem;
|
|
607
|
+
font-weight: 600;
|
|
608
|
+
padding: 1px 6px;
|
|
609
|
+
border-radius: 6px;
|
|
610
|
+
text-transform: uppercase;
|
|
611
|
+
letter-spacing: 0.3px;
|
|
612
|
+
white-space: nowrap;
|
|
613
|
+
}
|
|
614
|
+
.pf .agd-env-aimeat {
|
|
615
|
+
background: rgba(16, 185, 129, 0.12);
|
|
616
|
+
color: var(--success, #10b981);
|
|
617
|
+
}
|
|
618
|
+
.pf .agd-env-agent {
|
|
619
|
+
background: rgba(217, 119, 6, 0.12);
|
|
620
|
+
color: #d97706;
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
/* TODO item list */
|
|
624
|
+
.pf .agd-todo-list {
|
|
625
|
+
display: flex;
|
|
626
|
+
flex-direction: column;
|
|
627
|
+
gap: 0.25rem;
|
|
628
|
+
}
|
|
629
|
+
.pf .agd-todo-item {
|
|
630
|
+
display: flex;
|
|
631
|
+
align-items: flex-start;
|
|
632
|
+
gap: 0.5rem;
|
|
633
|
+
padding: 0.4rem 0.5rem;
|
|
634
|
+
border-radius: var(--radius-xs, 6px);
|
|
635
|
+
background: var(--card-bg, #FFFFFF);
|
|
636
|
+
border: 1px solid var(--border, #E5E7EB);
|
|
637
|
+
font-size: 0.8rem;
|
|
638
|
+
transition: border-color 0.15s;
|
|
639
|
+
}
|
|
640
|
+
.pf .agd-todo-active {
|
|
641
|
+
border-color: #2563eb;
|
|
642
|
+
background: rgba(37, 99, 235, 0.04);
|
|
643
|
+
}
|
|
644
|
+
.pf .agd-todo-done {
|
|
645
|
+
opacity: 0.7;
|
|
646
|
+
}
|
|
647
|
+
.pf .agd-todo-failed {
|
|
648
|
+
border-color: var(--danger, #ef4444);
|
|
649
|
+
background: rgba(239, 68, 68, 0.04);
|
|
650
|
+
}
|
|
651
|
+
.pf .agd-todo-skipped {
|
|
652
|
+
opacity: 0.5;
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
/* Status icon column */
|
|
656
|
+
.pf .agd-todo-icon {
|
|
657
|
+
flex-shrink: 0;
|
|
658
|
+
font-size: 0.85rem;
|
|
659
|
+
line-height: 1.4;
|
|
660
|
+
width: 1.2rem;
|
|
661
|
+
text-align: center;
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
/* Content column */
|
|
665
|
+
.pf .agd-todo-content {
|
|
666
|
+
flex: 1;
|
|
667
|
+
min-width: 0;
|
|
668
|
+
}
|
|
669
|
+
.pf .agd-todo-title {
|
|
670
|
+
display: flex;
|
|
671
|
+
align-items: center;
|
|
672
|
+
gap: 0.4rem;
|
|
673
|
+
flex-wrap: wrap;
|
|
674
|
+
font-weight: 500;
|
|
675
|
+
line-height: 1.4;
|
|
676
|
+
}
|
|
677
|
+
.pf .agd-todo-est {
|
|
678
|
+
font-size: 0.65rem;
|
|
679
|
+
color: var(--text-muted, #9CA3AF);
|
|
680
|
+
white-space: nowrap;
|
|
681
|
+
}
|
|
682
|
+
.pf .agd-todo-desc {
|
|
683
|
+
font-size: 0.75rem;
|
|
684
|
+
color: var(--text-dim, #6B7280);
|
|
685
|
+
line-height: 1.4;
|
|
686
|
+
margin-top: 0.15rem;
|
|
687
|
+
}
|
|
688
|
+
.pf .agd-todo-reason {
|
|
689
|
+
font-size: 0.7rem;
|
|
690
|
+
color: var(--text-muted, #9CA3AF);
|
|
691
|
+
font-style: italic;
|
|
692
|
+
margin-top: 0.1rem;
|
|
693
|
+
}
|
|
694
|
+
.pf .agd-todo-verify {
|
|
695
|
+
font-size: 0.7rem;
|
|
696
|
+
color: var(--text-muted, #9CA3AF);
|
|
697
|
+
margin-top: 0.1rem;
|
|
698
|
+
padding-left: 0.5rem;
|
|
699
|
+
border-left: 2px solid var(--border, #E5E7EB);
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
/* Waiting state (no todos yet) */
|
|
703
|
+
.pf .agd-todo-waiting {
|
|
704
|
+
text-align: center;
|
|
705
|
+
padding: 1rem;
|
|
706
|
+
color: var(--text-muted, #9CA3AF);
|
|
707
|
+
font-size: 0.8rem;
|
|
708
|
+
font-style: italic;
|
|
709
|
+
background: var(--card-bg, #FFFFFF);
|
|
710
|
+
border: 1px dashed var(--border, #E5E7EB);
|
|
711
|
+
border-radius: var(--radius-xs, 6px);
|
|
712
|
+
margin: 0.5rem 0;
|
|
713
|
+
}
|
|
@@ -97,14 +97,34 @@
|
|
|
97
97
|
.pf .wallet-balance-copy:hover{background:rgba(232,86,74,.25)}
|
|
98
98
|
.pf .mem-item{display:flex;justify-content:space-between;align-items:center;padding:.5rem 0;border-bottom:1px solid rgba(232,86,74,.08);font-size:.85rem;cursor:pointer;gap:.5rem}
|
|
99
99
|
.pf .mem-item:hover{background:rgba(232,86,74,.05)}
|
|
100
|
-
.pf .mem-key{font-family:monospace;color:var(--accent,#E8564A);font-weight:500;flex:1}
|
|
100
|
+
.pf .mem-key{font-family:monospace;color:var(--accent,#E8564A);font-weight:500;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
101
|
+
.pf .mem-time{font-size:.7rem;color:var(--text-dim,#6B7280);white-space:nowrap;flex-shrink:0}
|
|
102
|
+
.pf .mem-sort-bar{display:flex;align-items:center;gap:.35rem}
|
|
103
|
+
.pf .mem-sort-select{font-size:.75rem;padding:2px 6px;min-width:auto;width:auto}
|
|
101
104
|
.pf .mem-vis{font-size:.7rem}
|
|
102
105
|
.pf .shield-icon{font-size:.85rem;cursor:pointer;opacity:.6;transition:opacity .2s}
|
|
103
106
|
.pf .shield-icon:hover{opacity:1}
|
|
104
107
|
.pf .key-rules-box{background:#F9FAFB;border:1px solid rgba(139,92,246,.3);border-radius:8px;padding:.75rem;margin-top:.75rem;margin-bottom:.5rem}
|
|
105
108
|
.pf .mem-detail{background:rgba(0,0,0,.04);border:1px solid rgba(232,86,74,.1);border-radius:8px;padding:1rem;margin-top:.5rem;font-size:.85rem}
|
|
106
109
|
.pf .mem-detail pre{white-space:pre-wrap;word-break:break-all;font-family:monospace;color:var(--text,#1A1A2E);font-size:.8rem}
|
|
107
|
-
.pf .mem-detail .mem-actions{display:flex;gap:.5rem;margin-top:.75rem}
|
|
110
|
+
.pf .mem-detail .mem-actions{display:flex;gap:.5rem;margin-top:.75rem;flex-wrap:wrap}
|
|
111
|
+
.pf .mem-browse-panel{background:var(--surface,#F9FAFB);border:1px solid var(--border,#E5E7EB);border-radius:var(--radius,12px);padding:1rem;margin-bottom:1rem}
|
|
112
|
+
.pf .mem-browse-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:.75rem}
|
|
113
|
+
.pf .mem-browse-list{display:flex;flex-direction:column;gap:.5rem}
|
|
114
|
+
.pf .mem-browse-item{display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;background:var(--card,#FFFFFF);border:1px solid var(--border,#E5E7EB);border-radius:8px;min-width:0}
|
|
115
|
+
.pf .mem-browse-item:hover{border-color:var(--accent,#E8564A)}
|
|
116
|
+
.pf .mem-browse-key{font-family:monospace;color:var(--accent,#E8564A);font-weight:500;flex:1;font-size:.85rem;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
117
|
+
.pf .mem-browse-meta{display:flex;align-items:center;gap:.5rem;flex-shrink:0;max-width:40%;overflow:hidden}
|
|
118
|
+
.pf .mem-browse-tags{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:200px}
|
|
119
|
+
.pf .mem-browse-buttons{display:flex;gap:.5rem;flex-wrap:wrap}
|
|
120
|
+
.pf .mem-discover-search{display:flex;gap:.35rem;align-items:center}
|
|
121
|
+
.pf .mem-discover-item{border:1px solid var(--border,#E5E7EB);border-radius:8px;overflow:hidden;background:var(--card,#FFFFFF)}
|
|
122
|
+
.pf .mem-discover-item:hover{border-color:var(--accent,#E8564A)}
|
|
123
|
+
.pf .mem-discover-row{display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;cursor:pointer;min-width:0}
|
|
124
|
+
.pf .mem-discover-info{flex:1;min-width:0;overflow:hidden}
|
|
125
|
+
.pf .mem-discover-owner{font-size:.7rem;color:var(--text-dim,#6B7280);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
126
|
+
.pf .mem-discover-preview{padding:.5rem .75rem;border-top:1px solid var(--border,#E5E7EB);background:var(--bg-dim,#F3F4F6)}
|
|
127
|
+
.pf .mem-discover-preview pre{white-space:pre-wrap;word-break:break-all;font-family:monospace;font-size:.75rem;color:var(--text,#1A1A2E);max-height:300px;overflow-y:auto;margin:0}
|
|
108
128
|
.pf .peer-card{display:flex;justify-content:space-between;align-items:center}
|
|
109
129
|
.pf .peer-status{display:flex;align-items:center;gap:.4rem}
|
|
110
130
|
.pf .peer-dot{width:8px;height:8px;border-radius:50%}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* - validateDataApiSpec: structural validation of data API spec JSON
|
|
9
9
|
* - validateComponentSpec: structural validation of component spec JSON
|
|
10
10
|
* - validateAppDomainSpec: structural validation of app-domain spec JSON
|
|
11
|
+
* - validateAppSpec: structural validation of app (HTML page) spec JSON
|
|
11
12
|
* - validateSpecAgainstProbe: compare spec declarations against probe results
|
|
12
13
|
* @usage
|
|
13
14
|
* import { validateExtensionSpec, validateSpecAgainstProbe } from '/js/services/generator-spec-validate.js';
|
|
@@ -122,6 +123,28 @@ export function validateAppDomainSpec(spec) {
|
|
|
122
123
|
return { valid: errors.length === 0, errors };
|
|
123
124
|
}
|
|
124
125
|
|
|
126
|
+
/**
|
|
127
|
+
* Validate that an app (HTML page) spec has required structure.
|
|
128
|
+
* @param {object} spec - Parsed app spec JSON
|
|
129
|
+
* @returns {{ valid: boolean, errors: string[] }}
|
|
130
|
+
*/
|
|
131
|
+
export function validateAppSpec(spec) {
|
|
132
|
+
const errors = [];
|
|
133
|
+
if (!spec) return { valid: false, errors: ['Spec is null or undefined'] };
|
|
134
|
+
|
|
135
|
+
if (!spec.name) errors.push('Missing spec.name');
|
|
136
|
+
if (spec.name && !/^[a-z0-9]+(-[a-z0-9]+)*$/.test(spec.name)) {
|
|
137
|
+
errors.push(`spec.name "${spec.name}" must be ASCII kebab-case`);
|
|
138
|
+
}
|
|
139
|
+
if (!spec.title) errors.push('Missing spec.title');
|
|
140
|
+
if (!spec.appDomainLib) errors.push('Missing spec.appDomainLib — must reference the app-domain cortex libName');
|
|
141
|
+
if (!Array.isArray(spec.cortexDependencies) || spec.cortexDependencies.length === 0) {
|
|
142
|
+
errors.push('Missing or empty spec.cortexDependencies — must list all cortex registeredAs names');
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return { valid: errors.length === 0, errors };
|
|
146
|
+
}
|
|
147
|
+
|
|
125
148
|
/**
|
|
126
149
|
* Compare extension spec against actual probe results.
|
|
127
150
|
* SPEC IS KING: if probe response doesn't match spec, the CODE is wrong.
|
|
@@ -123,3 +123,42 @@ export async function pullFromHome(key) {
|
|
|
123
123
|
export async function pushToHome(key) {
|
|
124
124
|
return apiPost('/v1/memory/push-home', { key });
|
|
125
125
|
}
|
|
126
|
+
|
|
127
|
+
/** List memory entries on the home node (federated sessions). */
|
|
128
|
+
export async function listHomeMemories() {
|
|
129
|
+
const resp = await apiPost('/v1/memory/list-home', {});
|
|
130
|
+
return resp?.data?.entries || [];
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** List memory entries on a remote peer node (home sessions). */
|
|
134
|
+
export async function listRemoteMemories(peerNodeId) {
|
|
135
|
+
const resp = await apiPost('/v1/memory/list-remote', { peer_node_id: peerNodeId });
|
|
136
|
+
return resp?.data?.entries || [];
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** Pull a memory entry from a remote peer node (home sessions). */
|
|
140
|
+
export async function pullFromRemote(peerNodeId, key) {
|
|
141
|
+
return apiPost('/v1/memory/pull-remote', { peer_node_id: peerNodeId, key });
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** Discover public memory entries from other users on this node. */
|
|
145
|
+
export async function discoverPublicMemories(opts = {}) {
|
|
146
|
+
const params = new URLSearchParams();
|
|
147
|
+
if (opts.prefix) params.set('prefix', opts.prefix);
|
|
148
|
+
if (opts.owner) params.set('owner', opts.owner);
|
|
149
|
+
if (opts.q) params.set('q', opts.q);
|
|
150
|
+
if (opts.limit) params.set('limit', String(opts.limit));
|
|
151
|
+
if (opts.offset) params.set('offset', String(opts.offset));
|
|
152
|
+
const qs = params.toString();
|
|
153
|
+
const data = await apiGet('/v1/memory/discover' + (qs ? '?' + qs : ''));
|
|
154
|
+
return data?.data || { items: [], total: 0 };
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** Copy a public memory entry from another user to your own memory. */
|
|
158
|
+
export async function copyPublicMemory(sourceGaii, key, visibility) {
|
|
159
|
+
return apiPost('/v1/memory/copy', {
|
|
160
|
+
source_gaii: sourceGaii,
|
|
161
|
+
key,
|
|
162
|
+
visibility: visibility || 'private',
|
|
163
|
+
});
|
|
164
|
+
}
|
|
@@ -38,10 +38,10 @@ export default function FederationTab({ data, reload }) {
|
|
|
38
38
|
|
|
39
39
|
useEffect(() => {
|
|
40
40
|
getConfig().then(res => {
|
|
41
|
-
if (res.ok && res.data?.
|
|
42
|
-
const
|
|
43
|
-
setAuthPolicy(
|
|
44
|
-
const scopes =
|
|
41
|
+
if (res.ok && res.data?.schema) {
|
|
42
|
+
const s = res.data.schema;
|
|
43
|
+
setAuthPolicy(s['federation.auth_policy']?.value ?? 'disabled');
|
|
44
|
+
const scopes = s['federation.default_scopes']?.value ?? 'memory:read,catalogue:read';
|
|
45
45
|
setDefaultScopes(typeof scopes === 'string' ? scopes.split(',').filter(Boolean) : (scopes || []));
|
|
46
46
|
}
|
|
47
47
|
setAuthPolicyLoading(false);
|
|
@@ -385,7 +385,7 @@ export default function FederationTab({ data, reload }) {
|
|
|
385
385
|
${(p.status === 'active' || p.status === 'degraded') && html`
|
|
386
386
|
<button class="adm-btn-sm" onClick=${() => doRemove(p.node_id)}>${t('dashboard.fedDepeer')}</button>
|
|
387
387
|
`}
|
|
388
|
-
${p.status === 'active' && html`
|
|
388
|
+
${(p.status === 'active' || p.status === 'degraded' || p.status === 'offline' || p.status === 'depeering') && html`
|
|
389
389
|
<button class="adm-btn-sm adm-text-error" onClick=${() => doEmergencyRemove(p.node_id)}>\u26A0 ${t('dashboard.fedEmergencyDepeer')}</button>
|
|
390
390
|
`}
|
|
391
391
|
</td>
|
|
@@ -3,7 +3,6 @@ import { useState } from 'preact/hooks';
|
|
|
3
3
|
import htm from 'htm';
|
|
4
4
|
const html = htm.bind(h);
|
|
5
5
|
import { t } from '/js/i18n.js';
|
|
6
|
-
import { escHtml } from '/js/utils.js';
|
|
7
6
|
import { dt, Badge, StatsGrid, Empty, ExpandableHelp, Spinner } from './shared.js';
|
|
8
7
|
import {
|
|
9
8
|
getSystemPrompts, getSystemPrompt, updateSystemPrompt,
|
|
@@ -141,8 +140,8 @@ export default function PromptsTab({ data, reload }) {
|
|
|
141
140
|
return html`
|
|
142
141
|
<div>
|
|
143
142
|
<button class="adm-btn-action" onClick=${() => { setEditId(null); setEditData(null); }}>← ${t('dashboard.promptsTab')}</button>
|
|
144
|
-
<h3 style="margin:12px 0 4px">${
|
|
145
|
-
<p class="adm-text-dim adm-text-base" style="margin:0 0 16px">${
|
|
143
|
+
<h3 style="margin:12px 0 4px">${editData.name}</h3>
|
|
144
|
+
<p class="adm-text-dim adm-text-base" style="margin:0 0 16px">${editData.description}</p>
|
|
146
145
|
|
|
147
146
|
<!-- Active toggle -->
|
|
148
147
|
<label class="adm-flex-center adm-mb-md" style="cursor:pointer">
|
|
@@ -172,8 +171,8 @@ export default function PromptsTab({ data, reload }) {
|
|
|
172
171
|
<div style="margin:8px 0">
|
|
173
172
|
<strong class="adm-text-base">${t('dashboard.promptsUsedIn')}:</strong>
|
|
174
173
|
${editData.usedIn.map(u => u.startsWith('/')
|
|
175
|
-
? html` <a href="${u}" target="_blank" class="adm-prompt-used-tag" style="text-decoration:none;color:var(--accent,#06b6d4)">${
|
|
176
|
-
: html` <span class="adm-prompt-used-tag">${
|
|
174
|
+
? html` <a href="${u}" target="_blank" class="adm-prompt-used-tag" style="text-decoration:none;color:var(--accent,#06b6d4)">${u}</a>`
|
|
175
|
+
: html` <span class="adm-prompt-used-tag">${u}</span>`
|
|
177
176
|
)}
|
|
178
177
|
</div>
|
|
179
178
|
`}
|
|
@@ -202,7 +201,7 @@ export default function PromptsTab({ data, reload }) {
|
|
|
202
201
|
: versions.map(v => html`
|
|
203
202
|
<div class="adm-prompt-version-row">
|
|
204
203
|
<span style="font-weight:600">v${v.version}</span>
|
|
205
|
-
<span class="adm-text-dim" style="flex:1">${dt(v.changedAt)} · ${
|
|
204
|
+
<span class="adm-text-dim" style="flex:1">${dt(v.changedAt)} · ${v.changedBy}${v.changeNote ? ` · ${v.changeNote}` : ''}</span>
|
|
206
205
|
<button class="adm-btn-sm" onClick=${() => handleRestore(v.version)} disabled=${saving}>
|
|
207
206
|
${t('dashboard.promptsRestore')}
|
|
208
207
|
</button>
|
|
@@ -263,14 +262,14 @@ export default function PromptsTab({ data, reload }) {
|
|
|
263
262
|
<div class="adm-hrow" style="cursor:pointer" onClick=${() => openEdit(p.id)}>
|
|
264
263
|
<div style="flex:1">
|
|
265
264
|
<div class="adm-flex-center" style="gap:6px">
|
|
266
|
-
<strong>${
|
|
265
|
+
<strong>${p.name}</strong>
|
|
267
266
|
<${Badge} type=${p.active ? 'healthy' : 'critical'} />
|
|
268
267
|
</div>
|
|
269
|
-
<div class="adm-text-sm adm-text-dim">${
|
|
268
|
+
<div class="adm-text-sm adm-text-dim">${p.description}</div>
|
|
270
269
|
${p.usedIn && p.usedIn.length > 0 && html`
|
|
271
270
|
<div>${p.usedIn.map(u => u.startsWith('/')
|
|
272
|
-
? html`<a href="${u}" target="_blank" class="adm-prompt-used-tag" style="text-decoration:none;color:var(--accent,#06b6d4)" onClick=${e => e.stopPropagation()}>${
|
|
273
|
-
: html`<span class="adm-prompt-used-tag">${
|
|
271
|
+
? html`<a href="${u}" target="_blank" class="adm-prompt-used-tag" style="text-decoration:none;color:var(--accent,#06b6d4)" onClick=${e => e.stopPropagation()}>${u}</a> `
|
|
272
|
+
: html`<span class="adm-prompt-used-tag">${u}</span> `
|
|
274
273
|
)}</div>
|
|
275
274
|
`}
|
|
276
275
|
</div>
|
|
@@ -51,6 +51,8 @@ function SharingGroupsSection({ showToast }) {
|
|
|
51
51
|
const [editingId, setEditingId] = useState(null);
|
|
52
52
|
const [editName, setEditName] = useState('');
|
|
53
53
|
const [editDesc, setEditDesc] = useState('');
|
|
54
|
+
const [editRead, setEditRead] = useState(true);
|
|
55
|
+
const [editWrite, setEditWrite] = useState(false);
|
|
54
56
|
const [saving, setSaving] = useState(false);
|
|
55
57
|
|
|
56
58
|
const loadGroups = useCallback(async () => {
|
|
@@ -119,6 +121,8 @@ function SharingGroupsSection({ showToast }) {
|
|
|
119
121
|
setEditingId(group.id);
|
|
120
122
|
setEditName(group.name);
|
|
121
123
|
setEditDesc(group.description || '');
|
|
124
|
+
setEditRead(group.defaultPermissions?.read ?? true);
|
|
125
|
+
setEditWrite(group.defaultPermissions?.write ?? false);
|
|
122
126
|
}, []);
|
|
123
127
|
|
|
124
128
|
const handleUpdate = useCallback(async (id) => {
|
|
@@ -131,6 +135,7 @@ function SharingGroupsSection({ showToast }) {
|
|
|
131
135
|
await groupsApi.updateGroup(id, {
|
|
132
136
|
name: editName.trim(),
|
|
133
137
|
description: editDesc.trim() || undefined,
|
|
138
|
+
default_permissions: { read: editRead, write: editWrite },
|
|
134
139
|
});
|
|
135
140
|
showToast(t('profile.access.sgUpdated') || 'Group updated');
|
|
136
141
|
setEditingId(null);
|
|
@@ -297,6 +302,19 @@ function SharingGroupsSection({ showToast }) {
|
|
|
297
302
|
<textarea class="input-field input-sm" rows="2"
|
|
298
303
|
value=${editDesc} onInput=${e => setEditDesc(e.target.value)} />
|
|
299
304
|
</div>
|
|
305
|
+
<div class="form-row">
|
|
306
|
+
<label>${t('profile.access.sgDefaultPerms') || 'Default permissions'}</label>
|
|
307
|
+
<div class="flex-row-wrap">
|
|
308
|
+
<label class="flex-row">
|
|
309
|
+
<input type="checkbox" checked=${editRead} onChange=${() => setEditRead(!editRead)} />
|
|
310
|
+
${t('profile.access.sgRead') || 'Read'}
|
|
311
|
+
</label>
|
|
312
|
+
<label class="flex-row">
|
|
313
|
+
<input type="checkbox" checked=${editWrite} onChange=${() => setEditWrite(!editWrite)} />
|
|
314
|
+
${t('profile.access.sgWrite') || 'Write'}
|
|
315
|
+
</label>
|
|
316
|
+
</div>
|
|
317
|
+
</div>
|
|
300
318
|
<div class="form-actions">
|
|
301
319
|
<button class="btn-primary btn-sm" onClick=${() => handleUpdate(group.id)} disabled=${saving}>
|
|
302
320
|
${saving ? '...' : (t('profile.access.sgSave') || 'Save')}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* - ProposedTask -- task proposal from agent with create/adjust buttons
|
|
10
10
|
* - ThreadList -- horizontal thread selector
|
|
11
11
|
* @version-history
|
|
12
|
+
* v1.1.0 -- 2026-05-22 -- Show timestamp on messages, sort oldest-first (chat-style)
|
|
12
13
|
* v1.0.0 -- 2026-05-22 -- Initial creation for Agent Dashboard Phase 3
|
|
13
14
|
*/
|
|
14
15
|
import { h } from 'preact';
|
|
@@ -66,7 +67,7 @@ function MessageBubble({ msg, agentName, showToast }) {
|
|
|
66
67
|
${msg.content}
|
|
67
68
|
</div>
|
|
68
69
|
<div class="agd-msg-meta ${isInbound ? 'agd-msg-meta-right' : ''}">
|
|
69
|
-
${msg.created_at ? timeAgo(msg.created_at) : ''}
|
|
70
|
+
${msg.created_at ? html`<span class="agd-msg-time">${new Date(msg.created_at).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}</span> ${timeAgo(msg.created_at)}` : ''}
|
|
70
71
|
${msg.tokens_used ? html` · ${msg.tokens_used} ${t('profile.agents.messages.tokensUsed')}` : ''}
|
|
71
72
|
</div>
|
|
72
73
|
${proposedTask && html`
|
|
@@ -199,7 +200,7 @@ export default function AgentMessagesSubtab({ agentName, session, showToast }) {
|
|
|
199
200
|
|
|
200
201
|
${messages.length > 0 && html`
|
|
201
202
|
<div class="agd-msg-history" ref=${historyRef}>
|
|
202
|
-
${messages.map(msg => html`
|
|
203
|
+
${[...messages].sort((a, b) => new Date(a.created_at || 0) - new Date(b.created_at || 0)).map(msg => html`
|
|
203
204
|
<${MessageBubble} key=${msg.id || msg.created_at} msg=${msg} agentName=${agentName} showToast=${showToast} />
|
|
204
205
|
`)}
|
|
205
206
|
</div>
|
|
@@ -99,11 +99,15 @@ Node: ${url}
|
|
|
99
99
|
Body: { "agent_name": "your-name", "owner": "${sess.owner}" }
|
|
100
100
|
Tell me the verification URL so I can approve.
|
|
101
101
|
|
|
102
|
-
2.
|
|
102
|
+
2. MANDATORY FIRST ACTION after auth -- download and read your operating instructions:
|
|
103
103
|
GET ${url}/v1/prompts/tier1
|
|
104
|
-
This
|
|
105
|
-
reporting,
|
|
106
|
-
|
|
104
|
+
This contains your directives, task queue, inbox endpoint, capability
|
|
105
|
+
reporting instructions, message handling, and your full operating loop.
|
|
106
|
+
DO NOT call any other endpoint until you have read tier1 completely.
|
|
107
|
+
The response includes a system_prompt field with step-by-step instructions
|
|
108
|
+
and structured data fields (directives, task_queue, capabilities, messages)
|
|
109
|
+
with your personalized endpoint URLs.
|
|
110
|
+
Use /v1/agents/me/ as shortcut in all agent URLs -- it resolves to your name.`;
|
|
107
111
|
}
|
|
108
112
|
|
|
109
113
|
/* ── Platform instructions ── */
|
|
@@ -457,7 +461,7 @@ export default function AgentsTab({ session, showToast, onStats }) {
|
|
|
457
461
|
</div>
|
|
458
462
|
<div class="card-subtitle mt-xs">
|
|
459
463
|
${t('profile.agents.trust')}: ${a.trust_score ?? '-'} \u2502
|
|
460
|
-
${t('profile.agents.balance')}: ${
|
|
464
|
+
${t('profile.agents.balance')}: ${t('profile.agents.usesOwnerWallet')} \u2502
|
|
461
465
|
${t('profile.agents.lastSeen')}: ${a.last_seen ? timeAgo(a.last_seen) : '-'}
|
|
462
466
|
</div>
|
|
463
467
|
</div>
|
|
@@ -500,7 +504,7 @@ export default function AgentsTab({ session, showToast, onStats }) {
|
|
|
500
504
|
|
|
501
505
|
<div class="agent-detail-row">
|
|
502
506
|
<span class="agent-detail-label">${t('profile.agents.balance')}</span>
|
|
503
|
-
<span class="agent-detail-value">${
|
|
507
|
+
<span class="agent-detail-value">${t('profile.agents.usesOwnerWallet')}</span>
|
|
504
508
|
</div>
|
|
505
509
|
|
|
506
510
|
<div class="agent-detail-row">
|